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

# 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

Opciones

OpciónDescripción
--enginemlx o coreml para WeSpeaker; redimnet2 para identidad con nombre; camplusplus para clonación con CosyVoice
--jsonFormato de salida JSON con el vector de embedding completo

Identidad de voz con nombre mediante ReDimNet2-B6

Usa --engine redimnet2 para comparar una voz limpia entre grabaciones. Devuelve un embedding normalizado de 192 dimensiones a partir de al menos dos segundos de voz. La ventana CoreML fija de seis segundos repite las muestras cortas y recorta por el centro las largas.

Espacios de embedding separados

ReDimNet2 sirve para perfiles de voz con nombre. La diarización mantiene sus propios embeddings WeSpeaker. ReDimNet2, WeSpeaker independiente y los centroides de Community-1 no se pueden comparar entre sí.

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

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