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.
| Estagio | Detalhes |
|---|---|
| Entrada | Conv2d (1 para 32 canais) |
| ResNet34 | Blocos residuais [3, 4, 6, 3] |
| Stats Pooling | Media + desvio padrao ao longo do tempo |
| Projecao | Linear (5120 para 256) |
| Saida | Embedding 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
| Opcao | Descricao |
|---|---|
--engine | Engine de inferencia: mlx ou coreml |
--json | Formato 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.
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
| Modelo | Backend | Tamanho | HuggingFace |
|---|---|---|---|
| WeSpeaker-ResNet34-LM | MLX | ~25 MB | aufklarer/WeSpeaker-ResNet34-LM-MLX |
| WeSpeaker-ResNet34-LM | CoreML | ~25 MB | aufklarer/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)