Sprechereinbettungen

Extrahiere 256-dimensionale L2-normalisierte Sprechervektoren mit WeSpeaker ResNet34-LM. Diese Einbettungen erfassen die einzigartigen Stimmmerkmale eines Sprechers und können für Identifikation, Verifikation und Sprachsuche verwendet werden.

Architektur

WeSpeaker ResNet34-LM ist ein tiefes Residual-Netzwerk, das für das Erlernen von Sprecherrepräsentationen trainiert wurde.

StufeDetails
EingabeConv2d (1 auf 32 Kanäle)
ResNet34[3, 4, 6, 3] Residual-Blöcke
Stats PoolingMittelwert + Standardabweichung über die Zeit
ProjektionLinear (5120 auf 256)
AusgabeL2-normalisiertes 256-dim-Embedding

Modellgröße: ~6,6M Parameter, ~25 MB auf Disk.

Mel-Features

Das Modell verwendet 80-dimensionale Mel-Frequenz-Features, berechnet mit einem Hamming-Fenster. Die Log-Skalierung verwendet eine einfache log(max(mel, 1e-10))-Formel ohne zusätzliche Normalisierung. Batch-Normalisierung wird zur Konvertierungszeit in die Conv2d-Schichten fusioniert, um die Inferenzeffizienz zu erhöhen.

CLI-Verwendung

# 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

Optionen

OptionBeschreibung
--engineInferenz-Engine: mlx oder coreml
--jsonJSON-Ausgabe mit vollständigem Embedding-Vektor

Anwendungsfälle

Sprecher-Verifikation

Vergleiche zwei Audio-Samples, um festzustellen, ob sie vom selben Sprecher stammen. Extrahiere Embeddings aus beiden und berechne die Kosinusähnlichkeit. Ein höherer Ähnlichkeitswert weist auf eine höhere Wahrscheinlichkeit desselben Sprechers hin.

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

Sprecher-Identifikation

Gleiche ein unbekanntes Audio-Sample gegen eine Datenbank eingeschriebener Sprecher-Embeddings ab. Der eingeschriebene Sprecher mit der höchsten Kosinusähnlichkeit ist die vorhergesagte Identität.

Sprachsuche

Indexiere eine Sammlung von Audioaufnahmen nach Sprecher-Embedding und frage dann mit einem neuen Audio-Sample, um alle Aufnahmen desselben Sprechers zu finden.

Wichtig

Sprecher-Embeddings funktionieren am besten mit sauberer Sprache von mindestens 2–3 Sekunden. Sehr kurze Clips oder verrauschte Aufnahmen können weniger zuverlässige Embeddings erzeugen. Erwäge bei verrauschtem Audio zuerst Sprachverbesserung.

Modell-Downloads

ModellBackendGrößeHuggingFace
WeSpeaker-ResNet34-LMMLX~25 MBaufklarer/WeSpeaker-ResNet34-LM-MLX
WeSpeaker-ResNet34-LMCoreML~25 MBaufklarer/WeSpeaker-ResNet34-LM-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