Maskinöversättning · Engelskt original
Talarinbäddningar
Extrahera 256-dimensionell L2-normalized högtalare vektorer med WeSpeaker ResNet34-LM. Dessa inbäddningar fångar en högtalares unika vokalkaraktärer och kan användas för identifiering, verifiering och röstsökning.
Arkitektur
WeSpeaker ResNet34-LM är ett djupt restnätverk som är utbildat för talrepresentationsinlärning.
| Steg | Detaljer |
|---|---|
| Input | Conv2d (1 till 32 kanaler) |
| ResNet34 | [3, 4, 6, 3] restblock |
| Stats Pooling | Mean + standardavvikelse över tiden |
| Projektion | Linjär (5120 till 256) |
| Output | L2-normalized 256-dim inbäddning |
Modellstorlek: ~6.6M-parametrar, ~25 MB på disken.
Mel funktioner
Modellen använder 80-dimensionella mel-frekventa funktioner som beräknas med ett Hamming-fönster. Log scaling använder en enkel log(max(mel, 1e-10)) formel utan ytterligare normalisering. Batch normalisering smälts in i Conv2d skikt vid omvandlingstid för inferenseffektivitet.
CLI Användning
# 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
Alternativ
| Alternativ | Beskrivning |
|---|---|
--engine | mlx eller coreml för WeSpeaker; redimnet2 för namngiven identitet; camplusplus för CosyVoice kloning |
--json | JSON-utgångsformat med full inbäddningsvektor |
Namngivna röstidentitet med ReDimNet2-B6
Använd --engine redimnet2 för att matcha en ren röst över inspelningar. Det returnerar en 192-dimensionell normaliserad inbäddning från minst två sekunder av tal. Den fasta sex sekunder CoreML fönster upprepar kortare prover och center-grödor längre.
ReDimNet2 är för namngivna röstprofiler. Diarization håller sina egna WeSpeaker inbäddningar. ReDimNet2, fristående WeSpeaker, och Community-1 centroids kan inte jämföras med varandra.
Använda fall
Högtalarverifiering
Jämför två ljudprover för att avgöra om de är från samma högtalare. Extrahera inbäddningar från både och beräkna kosinets likhet. En högre likhetspoäng indikerar en högre sannolikhet för samma talare.
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
Högtalaridentifiering
Matcha ett okänt ljudprov mot en databas med inskrivna högtalarinbäddningar. Den inskrivna talaren med högsta kosin likhet är den förutspådda identiteten.
Röstsökning
Index en samling ljudinspelningar genom högtalarinbäddning, sedan fråga med ett nytt ljudprov för att hitta alla inspelningar från samma högtalare.
Högtalare inbäddningar fungerar bäst med rent tal på minst 2-3 sekunder. Mycket korta klipp eller bullriga inspelningar kan producera mindre tillförlitliga inbäddningar. Överväg att tillämpa talförbättring först för bullriga ljud.
Modell nedladdningar
| Modell | Backend | Storlek | HuggingFace |
|---|---|---|---|
| WeSpeaker-ResNet34-LM | MLX | ~25 MB | aufklarer/WeSpeaker-ResNet34-LM-MLX |
| WeSpeaker-ResNet34-LM | CoreML | ~25 MB | aufklarer/WeSpeaker-ResNet34-LM-CoreML |
| ReDimNet2-B6 | CoreML | 25 MiB | aufklarer/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