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

# 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

ตัวเลือก

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