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-LMMLX~25 MBaufklarer/WeSpeaker-ResNet34-LM-MLX
WeSpeaker-ResNet34-LMCoreML~25 MBaufklarer/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)