Embeddings de falante

Extraia vetores de falante L2-normalizados de 256 dimensoes usando o WeSpeaker ResNet34-LM. Esses embeddings capturam as caracteristicas vocais unicas de um falante e podem ser usados para identificacao, verificacao e busca por voz.

Arquitetura

WeSpeaker ResNet34-LM e uma rede residual profunda treinada para aprendizado de representacao de falantes.

EstagioDetalhes
EntradaConv2d (1 para 32 canais)
ResNet34Blocos residuais [3, 4, 6, 3]
Stats PoolingMedia + desvio padrao ao longo do tempo
ProjecaoLinear (5120 para 256)
SaidaEmbedding L2-normalizado de 256 dim

Tamanho do modelo: ~6.6M parametros, ~25 MB em disco.

Features mel

O modelo usa features mel-frequency de 80 dimensoes calculadas com janela Hamming. O log scaling usa uma formula simples log(max(mel, 1e-10)) sem normalizacao adicional. A batch normalization e fusionada nas camadas Conv2d em tempo de conversao para eficiencia de inferencia.

Uso do CLI

# Extract speaker embedding
.build/release/audio embed-speaker voice.wav

# JSON output (includes the 256-dim vector)
.build/release/audio embed-speaker voice.wav --json

# Choose inference engine
.build/release/audio embed-speaker voice.wav --engine coreml

Opcoes

OpcaoDescricao
--engineEngine de inferencia: mlx ou coreml
--jsonFormato de saida JSON com o vetor de embedding completo

Casos de uso

Verificacao de falante

Compare duas amostras de audio para determinar se sao do mesmo falante. Extraia embeddings de ambas e calcule a similaridade de cosseno. Uma pontuacao de similaridade maior indica maior probabilidade do mesmo falante.

import SpeechVAD

let model = try await WeSpeaker.loadFromHub()
let embedding1 = try await model.embed(audioFile: "sample1.wav")
let embedding2 = try await model.embed(audioFile: "sample2.wav")

let similarity = cosineSimilarity(embedding1, embedding2)
print("Similarity: \(similarity)")  // > 0.7 typically same speaker

Identificacao de falante

Combine uma amostra de audio desconhecida contra uma base de dados de embeddings de falante enrolados. O falante enrolado com a maior similaridade de cosseno e a identidade predita.

Busca por voz

Indexe uma colecao de gravacoes de audio por embedding de falante, depois consulte com uma nova amostra de audio para encontrar todas as gravacoes do mesmo falante.

Importante

Embeddings de falante funcionam melhor com fala limpa de pelo menos 2-3 segundos. Clipes muito curtos ou gravacoes ruidosas podem produzir embeddings menos confiaveis. Considere aplicar aprimoramento de fala primeiro para audio ruidoso.

Downloads de modelos

ModeloBackendTamanhoHuggingFace
WeSpeaker-ResNet34-LMMLX~25 MBaufklarer/WeSpeaker-ResNet34-LM-MLX
WeSpeaker-ResNet34-LMCoreML~25 MBaufklarer/WeSpeaker-ResNet34-LM-CoreML

API Swift

import SpeechVAD

let model = try await WeSpeaker.loadFromHub()

// Extract embedding from file
let embedding = try await model.embed(audioFile: "voice.wav")
print("Embedding dimensions: \(embedding.count)")  // 256

// Extract embedding from audio samples
let samples: [Float] = loadAudio("voice.wav")
let embedding = try await model.embed(samples: samples, sampleRate: 16000)