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/speech embed-speaker voice.wav

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

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

Opcoes

OpcaoDescricao
--enginemlx ou coreml para WeSpeaker; redimnet2 para identidade nomeada; camplusplus para clonagem CosyVoice
--jsonFormato de saida JSON com o vetor de embedding completo

Identidade de voz nomeada com ReDimNet2-B6

Use --engine redimnet2 para comparar uma voz limpa entre gravações. O modelo retorna um embedding normalizado de 192 dimensões a partir de pelo menos dois segundos de fala. A janela CoreML fixa de seis segundos repete amostras curtas e recorta pelo centro as mais longas.

Espaços de embedding separados

ReDimNet2 é usado para perfis de voz nomeados. A diarização mantém seus próprios embeddings WeSpeaker. ReDimNet2, WeSpeaker independente e os centroides do Community-1 não podem ser comparados entre si.

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 WeSpeakerModel.fromPretrained()

let samples1: [Float] = loadAudio("sample1.wav")
let samples2: [Float] = loadAudio("sample2.wav")
let embedding1 = model.embed(audio: samples1, sampleRate: 16000)
let embedding2 = model.embed(audio: samples2, sampleRate: 16000)

let similarity = WeSpeakerModel.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
ReDimNet2-B6CoreML~25 MiBaufklarer/ReDimNet2-B6-CoreML

API Swift

import SpeechVAD

let model = try await WeSpeakerModel.fromPretrained()

// Extract embedding from audio samples
let samples: [Float] = loadAudio("voice.wav")
let embedding = model.embed(audio: samples, sampleRate: 16000)
print("Embedding dimensions: \(embedding.count)")  // 256