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
# สกัด speaker embedding
.build/release/speech embed-speaker voice.wav
# เอาต์พุต JSON (รวมเวกเตอร์ 256 มิติ)
.build/release/speech embed-speaker voice.wav --json
# เลือก 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 WeSpeaker.loadFromHub()
let embedding1 = try await model.embed(audioFile: "sample1.wav")
let embedding2 = try await model.embed(audioFile: "sample2.wav")
let similarity = cosineSimilarity(embedding1, embedding2)
print("Similarity: \(similarity)") // > 0.7 มักจะเป็นผู้พูดคนเดียวกัน
การระบุตัวผู้พูด
จับคู่ตัวอย่างเสียงที่ไม่ทราบกับฐานข้อมูลของ 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 WeSpeaker.loadFromHub()
// สกัด embedding จากไฟล์
let embedding = try await model.embed(audioFile: "voice.wav")
print("Embedding dimensions: \(embedding.count)") // 256
// สกัด embedding จากตัวอย่างเสียง
let samples: [Float] = loadAudio("voice.wav")
let embedding = try await model.embed(samples: samples, sampleRate: 16000)