Speaker Embedding
สกัดเวกเตอร์ผู้พูด 256 มิติที่ผ่านการปรับมาตรฐาน L2 โดยใช้ WeSpeaker ResNet34-LM embedding เหล่านี้จับลักษณะเฉพาะของเสียงผู้พูดและสามารถใช้สำหรับการระบุตัวตน การตรวจสอบ และการค้นหาด้วยเสียงได้
สถาปัตยกรรม
WeSpeaker ResNet34-LM เป็นเครือข่ายแบบ residual ระดับลึกที่ฝึกสำหรับการเรียนรู้การแทนค่าของผู้พูด
| ขั้นตอน | รายละเอียด |
|---|---|
| อินพุต | Conv2d (1 ไป 32 channels) |
| ResNet34 | residual blocks แบบ [3, 4, 6, 3] |
| Stats Pooling | ค่าเฉลี่ย + ส่วนเบี่ยงเบนมาตรฐานตลอดเวลา |
| Projection | Linear (5120 ไป 256) |
| เอาต์พุต | embedding 256 มิติที่ปรับมาตรฐาน L2 |
ขนาดโมเดล: ~6.6M พารามิเตอร์ ~25 MB บนดิสก์
คุณลักษณะ Mel
โมเดลใช้คุณลักษณะ mel-frequency 80 มิติคำนวณด้วย Hamming window การปรับสเกลแบบ log ใช้สูตรง่าย ๆ log(max(mel, 1e-10)) โดยไม่ต้องปรับมาตรฐานเพิ่มเติม Batch normalization ถูกหลอมรวมเข้ากับชั้น Conv2d ตอนแปลงโมเดลเพื่อให้การอนุมานมีประสิทธิภาพ
การใช้งาน 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
ตัวเลือก
| ตัวเลือก | คำอธิบาย |
|---|---|
--engine | Engine การอนุมาน: mlx หรือ coreml |
--json | รูปแบบเอาต์พุต JSON พร้อมเวกเตอร์ embedding เต็ม |
กรณีใช้งาน
การตรวจสอบผู้พูด
เปรียบเทียบตัวอย่างเสียงสองชิ้นเพื่อตัดสินว่ามาจากผู้พูดคนเดียวกันหรือไม่ สกัด embedding ของทั้งสองชิ้นแล้วคำนวณ cosine similarity คะแนนความคล้ายคลึงสูงบ่งบอกถึงความน่าจะเป็นที่จะเป็นผู้พูดคนเดียวกันสูง
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
การระบุตัวผู้พูด
จับคู่ตัวอย่างเสียงที่ไม่ทราบกับฐานข้อมูลของ embedding ผู้พูดที่ลงทะเบียนไว้ ผู้พูดที่ลงทะเบียนซึ่งมี cosine similarity สูงสุดคือตัวตนที่คาดว่าจะเป็น
การค้นหาด้วยเสียง
จัดดัชนีคอลเลกชันของบันทึกเสียงตาม speaker embedding จากนั้นค้นหาด้วยตัวอย่างเสียงใหม่เพื่อหาบันทึกทั้งหมดที่มาจากผู้พูดคนเดียวกัน
Speaker embedding ทำงานดีที่สุดกับเสียงพูดที่สะอาดยาวอย่างน้อย 2-3 วินาที คลิปสั้นมากหรือบันทึกที่มีสัญญาณรบกวนอาจให้ embedding ที่เชื่อถือได้น้อยกว่า พิจารณาใช้ การเพิ่มคุณภาพเสียงพูด ก่อนสำหรับเสียงที่มีสัญญาณรบกวน
การดาวน์โหลดโมเดล
| โมเดล | Backend | ขนาด | HuggingFace |
|---|---|---|---|
| WeSpeaker-ResNet34-LM | MLX | ~25 MB | aufklarer/WeSpeaker-ResNet34-LM-MLX |
| WeSpeaker-ResNet34-LM | CoreML | ~25 MB | aufklarer/WeSpeaker-ResNet34-LM-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