embeddings المتحدّث
استخرج متّجهات متحدّث بأبعاد 256 مُطبَّعة وفق L2 باستخدام WeSpeaker ResNet34-LM. تلتقط هذه الـ embeddings الخصائص الصوتية الفريدة للمتحدّث ويمكن استخدامها للتعرّف عليه، والتحقّق منه، والبحث بالصوت.
البنية
WeSpeaker ResNet34-LM شبكة عصبيّة عميقة من النوع residual مُدرَّبة لتعلّم تمثيل المتحدّثين.
| المرحلة | التفاصيل |
|---|---|
| المدخل | Conv2d (من 1 إلى 32 قناة) |
| ResNet34 | كتل residual بنمط [3, 4, 6, 3] |
| Stats Pooling | المتوسّط + الانحراف المعياري على امتداد الزمن |
| الإسقاط | Linear (من 5120 إلى 256) |
| الخرج | embedding بأبعاد 256 مُطبَّع وفق L2 |
حجم النموذج: ~6.6 مليون معامل، ~25 MB على القرص.
خصائص mel
يستخدم النموذج خصائص mel بأبعاد 80 محسوبة بنافذة Hamming. يعتمد التحجيم اللوغاريتمي صيغة بسيطة 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 | محرّك الاستدلال: mlx أو coreml |
--json | صيغة خرج JSON مع المتّجه الكامل لـ embedding |
حالات الاستخدام
التحقّق من المتحدّث
قارن عيّنتين صوتيّتين لتحديد ما إن كانتا للمتحدّث نفسه. استخرج embeddings من كلتيهما واحسب تشابه جيب التمام. كلّما ارتفعت قيمة التشابه زاد احتمال أنّهما للمتحدّث نفسه.
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 typically same speaker
التعرّف على المتحدّث
قارن عيّنة صوتيّة مجهولة بقاعدة بيانات من embeddings متحدّثين مُسجَّلين. المتحدّث المُسجَّل صاحب أعلى تشابه جيب التمام هو الهويّة المتوقّعة.
البحث بالصوت
افهرس مجموعة من التسجيلات الصوتية حسب embedding المتحدّث، ثمّ استعلم بعيّنة صوتيّة جديدة للعثور على كلّ التسجيلات للمتحدّث نفسه.
تعمل embeddings المتحدّث بأفضل صورة مع كلام نظيف مدّته 2-3 ثوانٍ على الأقل. قد تُنتج المقاطع القصيرة جدًا أو التسجيلات الضوضائية embeddings أقلّ موثوقيّة. فكِّر بتطبيق تحسين الكلام أوّلاً للصوت المُشوّش.
تنزيلات النماذج
| النموذج | الواجهة الخلفية | الحجم | HuggingFace |
|---|---|---|---|
| WeSpeaker-ResNet34-LM | MLX | ~25 MB | aufklarer/WeSpeaker-ResNet34-LM-MLX |
| WeSpeaker-ResNet34-LM | CoreML | ~25 MB | aufklarer/WeSpeaker-ResNet34-LM-CoreML |
واجهة Swift
import SpeechVAD
let model = try await WeSpeaker.loadFromHub()
// Extract embedding from file
let embedding = try await model.embed(audioFile: "voice.wav")
print("Embedding dimensions: \(embedding.count)") // 256
// Extract embedding from audio samples
let samples: [Float] = loadAudio("voice.wav")
let embedding = try await model.embed(samples: samples, sampleRate: 16000)