Speaker Embedding

สกัดเวกเตอร์ผู้พูด 256 มิติที่ผ่านการปรับมาตรฐาน L2 โดยใช้ WeSpeaker ResNet34-LM embedding เหล่านี้จับลักษณะเฉพาะของเสียงผู้พูดและสามารถใช้สำหรับการระบุตัวตน การตรวจสอบ และการค้นหาด้วยเสียงได้

สถาปัตยกรรม

WeSpeaker ResNet34-LM เป็นเครือข่ายแบบ residual ระดับลึกที่ฝึกสำหรับการเรียนรู้การแทนค่าของผู้พูด

ขั้นตอนรายละเอียด
อินพุตConv2d (1 ไป 32 channels)
ResNet34residual blocks แบบ [3, 4, 6, 3]
Stats Poolingค่าเฉลี่ย + ส่วนเบี่ยงเบนมาตรฐานตลอดเวลา
ProjectionLinear (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

ตัวเลือก

ตัวเลือกคำอธิบาย
--engineEngine การอนุมาน: 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-LMMLX~25 MBaufklarer/WeSpeaker-ResNet34-LM-MLX
WeSpeaker-ResNet34-LMCoreML~25 MBaufklarer/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)