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.

EtapaDetalles
EntradaConv2d (de 1 a 32 canales)
ResNet34Bloques residuales [3, 4, 6, 3]
Stats PoolingMedia + desviación estándar a lo largo del tiempo
ProyecciónLinear (de 5120 a 256)
SalidaEmbedding 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ónDescripción
--engineMotor de inferencia: mlx o coreml
--jsonFormato 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.

Importante

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

ModeloBackendTamañoHuggingFace
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()

// 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)