Embeddings de hablante
Extrae vectores de hablante de 256 dimensiones normalizados en L2 usando WeSpeaker ResNet34-LM. Estos embeddings capturan las características vocales únicas de un hablante y pueden usarse para identificación, verificación y búsqueda por voz.
Arquitectura
WeSpeaker ResNet34-LM es una red residual profunda entrenada para el aprendizaje de representación de hablantes.
| Etapa | Detalles |
|---|---|
| Entrada | Conv2d (de 1 a 32 canales) |
| ResNet34 | Bloques residuales [3, 4, 6, 3] |
| Stats Pooling | Media + desviación estándar a lo largo del tiempo |
| Proyección | Linear (de 5120 a 256) |
| Salida | Embedding de 256 dim normalizado en L2 |
Tamaño del modelo: ~6,6M parámetros, ~25 MB en disco.
Características mel
El modelo usa características mel de 80 dimensiones calculadas con una ventana Hamming. El escalado logarítmico emplea una fórmula simple log(max(mel, 1e-10)) sin normalización adicional. La batch normalization se fusiona en las capas Conv2d en el momento de conversión para eficiencia de inferencia.
Uso desde la CLI
# Extraer embedding de hablante
.build/release/audio embed-speaker voice.wav
# Salida JSON (incluye el vector de 256 dim)
.build/release/audio embed-speaker voice.wav --json
# Elegir motor de inferencia
.build/release/audio embed-speaker voice.wav --engine coreml
Opciones
| Opción | Descripción |
|---|---|
--engine | Motor de inferencia: mlx o coreml |
--json | Formato de salida JSON con el vector de embedding completo |
Casos de uso
Verificación de hablante
Compara dos muestras de audio para determinar si provienen del mismo hablante. Extrae los embeddings de ambas y calcula la similitud coseno. Una mayor puntuación de similitud indica mayor probabilidad de que sean del mismo hablante.
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 normalmente mismo hablante
Identificación de hablante
Compara una muestra de audio desconocida con una base de datos de embeddings de hablantes registrados. El hablante registrado con la mayor similitud coseno es la identidad predicha.
Búsqueda por voz
Indexa una colección de grabaciones de audio por embedding de hablante, luego realiza una consulta con una nueva muestra para encontrar todas las grabaciones del mismo hablante.
Los embeddings de hablante funcionan mejor con voz limpia de al menos 2-3 segundos. Clips muy cortos o grabaciones con ruido pueden producir embeddings menos fiables. Considera aplicar primero mejora de voz para audio con ruido.
Descargas de modelos
| Modelo | Backend | Tamaño | 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()
// Extraer embedding desde archivo
let embedding = try await model.embed(audioFile: "voice.wav")
print("Embedding dimensions: \(embedding.count)") // 256
// Extraer embedding desde muestras de audio
let samples: [Float] = loadAudio("voice.wav")
let embedding = try await model.embed(samples: samples, sampleRate: 16000)