Traduzione automatica · Originale inglese

Embedding dei parlanti

Estratto 256-dimensionale L2-normalized vettori di altoparlante utilizzando WeSpeaker ResNet34-LM. Queste embeddings catturano le caratteristiche vocali uniche di un altoparlante e possono essere utilizzate per l'identificazione, la verifica e la ricerca vocale.

Architettura

WeSpeaker ResNet34-LM è una rete residua profonda addestrata per l'apprendimento della rappresentazione degli altoparlanti.

FaseDettagli
InputConv2d (1 a 32 canali)
ResNet34[3, 4, 6, 3] blocchi residui
Stats PoolingMedico + deviazione standard nel tempo
ProiezioneLineare (5120 a 256)
ProduzioneL2-normalized 256-dim embedding

Dimensione del modello: ~6.6M parametri, ~25 MB su disco.

Mel Caratteristiche

Il modello utilizza le caratteristiche di frequenza mel-frequenza dimensionale 80 calcolate con una finestra Hamming. log(max(mel, 1e-10)) formula senza normalizzazione aggiuntiva. La normalizzazione batch viene fusa negli strati Conv2d a tempo di conversione per l'efficienza dell'inferenza.

Uso 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

Opzioni

OpzioneDesignazione
--enginemlx o coreml per WeSpeaker; redimnet2 per l'identità nominata; camplusplus per clonazione CosyVoice
--jsonFormato di uscita JSON con vettore incorporato completo

Identità vocale nominata con ReDimNet2-B6

Uso --engine redimnet2 Ritorna un'integrazione normalizzata 192 da almeno due secondi di discorso. La finestra CoreML fissa ripete campioni più brevi e le curve centrali più lunghe.

Spazi di inserimento separati

ReDimNet2 è per i profili vocali di nome. La diarizzazione mantiene i propri embedding WeSpeaker. ReDimNet2, WeSpeaker standalone e Community-1 centroids non possono essere paragonati tra loro.

Utilizzare i casi

Verifica dell'oratore

Confrontare due campioni audio per determinare se sono dallo stesso altoparlante. Estrarre le incorporazioni da entrambi e calcolare la somiglianza del coseno. Un punteggio di somiglianza superiore indica una maggiore probabilità dello stesso altoparlo.

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

Identificazione del relatore

Abbina un campione audio sconosciuto contro un database di embeddings di altoparlanti iscritta. L'altoparlante iscritto con la più alta somiglianza di cosene è l'identità predetta.

Ricerca vocale

Indice una raccolta di registrazioni audio da altoparlanti incorporati, poi query con un nuovo campione audio per trovare tutte le registrazioni dallo stesso altoparlante.

Importante

Gli embeddings del diffusore funzionano meglio con il discorso pulito di almeno 2-3 secondi. clip molto brevi o registrazioni rumorose possono produrre embedded meno affidabili. valorizzazione del discorso prima per l'audio rumoroso.

Download del modello

ModelloIndietroDimensioneHuggingFace
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

Swift API

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