نموذج إزالة ضوضاء يشحن نقطة تفتيش جديدة. صوت TTS يُعاد تدريبه على بيانات أكثر. خط أنابيب استنساخ صوت يبدّل مُصوِّته. في كل حالة، على أحدهم أن يجيب: هل المخرَجات أفضل أم أسوأ من السابق؟ “تبدو أفضل بالنسبة لي” لا تتّسع. تنهار في اللحظة التي لا تكون فيها اللغة لغة تتحدثها، أو حين توجد عشرون نقطة تفتيش للمقارنة بدلًا من اثنتين، أو حين يحتاج التغيير إلى فحص عند كل commit بدلًا من مرة واحدة يدويًا.
الجواب الصارم عن “هل يبدو أفضل” هو درجة الرأي المتوسط (MOS): ضع الصوت أمام لجنة مستمعين، واطلب من كل منهم تقييمه من 1 إلى 5، وتوسّط الدرجات. MOS هو المقياس المعياري لجودة الكلام تحديدًا لأنه يطرح السؤال المهم — هل سيجد إنسان هذا مقبولًا — بدلًا من بديل عنه. إنه أيضًا مكلف. تجنيد لجنة، وتشغيلها باتّساق، وتكرارها لكل لغة، ولكل حالة تسجيل، ولكل إصدار نموذج يشحنه فريق صغير، ليس شيئًا تستطيع لجنة استماع مجاراته.
speechonnxmetrics مكتبة لتقريب ذلك الحكم دون لجنة، عند كل بناء. تجمّع مقاييسها في ثلاث عائلات، واختيار العائلة الصحيحة للموقف أهمّ من أي رقم منفرد.
ثلاث عائلات، ثلاثة أسئلة
مُقدِّرات MOS بلا مرجع شبكات عصبية مدرَّبة على التنبؤ بما ستقوله لجنة استماع، من الصوت وحده. لا تحتاج إلى أصل نظيف — فقط المخرَجات التي تريد الحكم عليها. استخدم هذه العائلة حين لا يوجد حقيقة أرضية للمقارنة معها: تقييم مخرَجات نظام TTS، أو فحص تسجيل حقيقي متدهور أصلًا بعد إزالة الضوضاء.
المقاييس التدخّلية تحتاج إلى مرجع نظيف مطابق وتقيس المسافة بينه وبين الإشارة المتدهورة. استخدم هذه العائلة حين تكون قد صنعت التدهور بنفسك وما زلت تحتفظ بالأصل النظيف: مرّرت تسجيلًا معروف الجودة عبر مُرمِّز، أو نموذج توسيع نطاق ترددي، أو مُحوِّل صوت، وتريد معرفة كم انحرفت المخرَجات عن المصدر.
المقاييس النصية القائمة على ASR تفرّغ المخرَجات بأداة تعرّف على الكلام وتقارن النص المفرَّغ بالنص المتوقَّع. هذا يلتقط شيئًا لا تستطيع العائلتان الأخريان التقاطه: صوت يبدو طبيعيًا ونظيفًا تمامًا لكنه يقول كلمات خاطئة. مُقدِّر MOS بلا مرجع يقيّم الطبيعية، لا الصحة — نطق خاطئ بطلاقة يحرز درجة جيدة. مقياس تدخّلي يحتاج موجة مرجعية، لا جملة مرجعية. مقارنة النص وحدها هي ما يلتقط كلمة خاطئة.
تكشف المكتبة عن هذه عبر دالة واحدة:
import speechonnxmetrics as s
# No-reference: only the output needed, no ground truth exists
s.score("output.wav", ["utmos"])
# Intrusive: needs a clean reference, ref= is required
s.score("degraded.wav", ["stoi", "mcd", "si_sdr"], ref="clean.wav")
تعيش المقاييس النصية في وحدة منفصلة، speechonnxmetrics.asr، لأنها تقارن سلاسل نصية، لا صوتًا — يُوجِّه s.score() فقط المقاييس التي تأخذ موجة صوتية.
MOS بلا مرجع: قراءة الأرقام
تشحن المكتبة أربعة مُقدِّرات MOS، يعيد كل منها قيمًا على مقياس من 1 إلى 5 حيث الأعلى أفضل — المقياس نفسه الذي تستخدمه لجنة بشرية:
| المقياس | الأبعاد | مُدرَّب على | استخدام تجاري |
|---|---|---|---|
utmos | درجة طبيعية واحدة | كلام مُخلَّق (VoiceMOS Challenge) | نعم |
dnsmos | sig / bak / ovrl (جودة الكلام / الضجيج الخلفي / الإجمالي) | ITU-T P.835 | نعم |
dnsmos_p808 | درجة MOS واحدة من استماع جماهيري | ITU-T P.808 | نعم |
sigmos | 7 أبعاد (col، disc، loud، noise، reverb، sig، ovrl) | ITU-T P.804 | نعم |
nisqa | mos مع تفصيل noi/dis/col/loud | NISQA-v2 | لا — CC BY-NC-SA 4.0 |
nisqa هو المقياس الوحيد في المكتبة بأكملها بأوزان غير تجارية. الأربعة الأخرى مرخّصة بـ MIT. لا تصفّي speechonnxmetrics هذا نيابةً عنك؛ إنها تذكر الرخصة وتترك الاختيار للمستدعي.
إليك ما يسجّله صوت حقيقي. بتشغيل التركيبات المُرفَقة الخاصة بالمكتبة نفسها — تسجيل نظيف (source.wav) وإعادة تخليق بمُرمِّز عصبي للمقطع نفسه (facodec_aria.wav) — عبر UTMOS:
>>> s.score("source.wav", ["utmos"])
{'utmos': 4.41}
>>> s.score("facodec_aria.wav", ["utmos"])
{'utmos': 3.21}
يقع التسجيل النظيف قرب أعلى المقياس، كما ينبغي — إنه كلام بشري حقيقي، لا مُخلَّق. تنخفض إعادة التخليق بالمُرمِّز بأكثر من نقطة كاملة. تلك الفجوة، أكثر من أي رقم بمفرده، هي الإشارة المفيدة: تخبرك أن المُرمِّز يُدخِل تدهورًا مسموعًا، وتمنحك رقمًا لتتبّعه أثناء ضبط المُرمِّز.
DNSMOS على التسجيل النظيف نفسه:
>>> s.score("source.wav", ["dnsmos"])
{'dnsmos.sig': 3.45, 'dnsmos.bak': 3.60, 'dnsmos.ovrl': 2.93}
ثلاثة أرقام، لا واحد، وهي تتباعد — يقع ovrl أدنى بشكل ملحوظ من sig وbak معًا. ذلك التباعد معلوماتي لا خلل: ovrl هو تقييم P.835 لتجربة الاستماع الإجمالية، ويميل إلى معاقبة تسجيل بشدة أكبر مما توحي به أي درجة مكوّن بمفردها، خصوصًا لتسجيل من العالم الحقيقي لا استوديو. حين يكون bak منخفضًا، ابحث عن ضجيج خلفي. وحين يكون sig منخفضًا، ابحث عن عيوب على مستوى الصوت — قصّ، انقطاعات، جرس آلي. أبلِغ عن أكثر من مُقدِّر واحد للمقطع نفسه: فهي مدرَّبة على بيانات مختلفة وتختلف بطرق معلوماتية، وفجوة واسعة بين مُقدِّرين مستقلّين على المقطع نفسه إشارة للذهاب والاستماع.
المقاييس التدخّلية: قراءة الأرقام
أحد عشر مقياسًا قائمًا على مرجع تقيس المسافة عن أصل نظيف. أهمّها للمعرفة أولًا:
| المقياس | المدى | الاتجاه | يقيس |
|---|---|---|---|
stoi / estoi | 0–1 | الأعلى أفضل | الوضوح الموضوعي قصير المدى — كم من المحتوى نجا، بمعزل عن مدى طبيعيته |
si_sdr / sdr / snr | ديسيبل، غير محدود | الأعلى أفضل | نسبة الإشارة إلى التشويه / نسبة الإشارة إلى الضجيج |
mcd | ديسيبل، غير محدود | الأدنى أفضل | تشويه مِل-الطيفي — مسافة المغلّف الطيفي، مقياس جودة كلاسيكي لـ TTS/VC |
log_f0_rmse | غير محدود | الأدنى أفضل | خطأ مِنحنى النبرة |
lsd / msd | ديسيبل | الأدنى أفضل | المسافة الطيفية اللوغاريتمية / مِل-الطيفية |
لاحظ انعكاس الاتجاه: يرتفع STOI وعائلة SDR حين تكون الجودة أفضل؛ بينما ينخفض MCD وخطأ النبرة والمسافة الطيفية. الخلط بينها عند قراءة جدول خطأ سهل الوقوع فيه.
تقييم إعادة التخليق بالمُرمِّز نفسها مقابل مصدرها النظيف:
>>> s.score("facodec_aria.wav", ["stoi", "mcd", "si_sdr"], ref="source.wav")
{'stoi': 0.662, 'mcd': 10.46, 'si_sdr': -26.94}
يقول STOI بقيمة 0.66 على مقياس من 0 إلى 1 حيث 1.0 مطابقة تامة إن الوضوح تعرّض لضربة حقيقية — هذا أدنى بكثير مما يسجّله تسجيل مُعالَج قليلًا. ويؤكّد SI-SDR بنحو −27 ديسيبل ذلك: يكون SI-SDR سالبًا كلما فاقت طاقة التشويه الإشارة، والرقم السالب الكبير يعني تغيّرًا بنيويًا كبيرًا، لا مجرد ضجيج مُضاف. MCD بقيمة 10.46 ديسيبل مرتفع؛ عادةً ما تقع أنظمة TTS المنشورة التي تبدو اصطناعية بوضوح لكنها لا تزال متّسقة مع المتحدث في خانة آحاد؛ فـ10+ يشير إلى انحراف طيفي-مغلّفي كبير بين إعادة التخليق والأصل.
المقاييس القائمة على ASR: قراءة الأرقام
تأتي خمسة مقاييس نصية من محاذاة Levenshtein واحدة بين نص مرجعي وفرضية (ما فُرِّغ إليه الصوت فعلًا):
| المقياس | المدى | الاتجاه | المعنى |
|---|---|---|---|
wer | ≥ 0 (عادةً 0–1، قد يتجاوز 1) | الأدنى أفضل | معدّل خطأ الكلمات: الاستبدالات + الحذوفات + الإضافات، مقسومة على عدد كلمات المرجع |
cer | 0–1 | الأدنى أفضل | الفكرة نفسها على مستوى الحرف — أكثر تسامحًا مع اختلافات إملائية/ترميزية بسيطة |
mer | 0–1 | الأدنى أفضل | معدّل خطأ المطابقة |
wil | 0–1 | الأدنى أفضل | معلومات الكلمة المفقودة |
wip | 0–1 | الأعلى أفضل | معلومات الكلمة المحفوظة (1 − wil) |
مثال محلول: المرجع “the quick brown fox jumps over the lazy dog” مقابل الفرضية “the quick brown fox jumped over a lazy dog” (استبدال واحد، “jumps” → “jumped”، وحذف واحد لـ”the”):
>>> from speechonnxmetrics import asr
>>> from speechonnxmetrics.asr import BASIC
>>> asr.wer(reference, hypothesis, normalizer=BASIC)
0.222
>>> asr.cer(reference, hypothesis, normalizer=BASIC)
0.116
معدّل خطأ كلمات بقيمة 0.22 يعني أن كلمة واحدة تقريبًا من كل خمس خاطئة — ملحوظ، يستحق الاستماع. CER أدنى على الزوج نفسه لأن التقييم على مستوى الحرف يعامل استبدال كلمة واحدة كحفنة تعديلات حرفية داخل سلسلة أحرف أطول بكثير، لا رمزًا مفقودًا كاملًا؛ يجيب CER وWER عن سؤالين مختلفين وليسا قابلين للمقارنة المباشرة ببعضهما. معدّل خطأ أعلى من نحو 0.3–0.4 على كلام طبيعي يعني عادةً أن نظام ASR، أو الصوت الذي يفرّغه، لديه مشكلة حقيقية، لا خطأ تقريب.
لا تُطبِّع speechonnxmetrics أبدًا النص نيابةً عنك — تحتسب مقارنة خام حالة الأحرف وعلامات الترقيم كأخطاء، وهو نادرًا ما يكون ما تريده عند تقييم النطق بدلًا من تنسيق التفريغ الدقيق. مرّر مُطبِّعًا صراحةً: BASIC يحوّل إلى أحرف صغيرة ويطوي المسافات البيضاء، وSTRICT يوسّع أيضًا الاختصارات ويزيل الحركات وعلامات الترقيم وكلمات الحشو.
التحفّظ الأهمّ
كل رقم MOS بلا مرجع في هذه المكتبة تنبؤ من نموذج، لا قياس لحقيقة. دُرِّب كلٌّ من UTMOS وDNSMOS وSIGMOS وNISQA على مجموعة بيانات اختبار استماع معيّنة، بلغات وحالات تسجيل معيّنة. مُقدِّر مُدرَّب أساسًا على تسجيلات استوديو إنجليزية قد يسيء الحكم على لغة لم يرها قط في التدريب، أو لهجة لم تقيّمها لجنته أبدًا، أو حالة تسجيل — صوت هاتفي، غرفة صاخبة، ميكروفون شحيح الموارد — خارج توزيع تدريبه. النموذج لا يكذب؛ إنه يستقرئ، والاستقراء من مدخلات غير مألوفة هو حيث تكون المُقدِّرات العصبية أقل موثوقية.
عامل MOS المُتنبَّأ به كدليل، لا كحقيقة أرضية. إنه موثوق فيما يجيده: التقاط تراجعات كبيرة، وترتيب عدة مرشّحين ضد بعضهم، والتنبيه إلى تشغيلة تحتاج إنسانًا ليستمع فعلًا. إنه ليس بديلًا عن لجنة استماع حقيقية حين يكون القرار عالي المخاطر، ولا ينبغي أن يكون الكلمة الأخيرة بشأن لغة أو حالة لم يُدرَّب النموذج الأساسي على الحكم عليها. الإبلاغ عن عدة مُقدِّرات معًا، ومعاملة الاختلاف بينها كدعوة للاستماع لا كضجيج يُتوسَّط بعيدًا، هو التخفيف العملي.
لماذا هذا ما يجعل المقارنة قابلة للاستخدام
لا شيء من هذا مفيد بمعزل عن غيره. يصبح مفيدًا في اللحظة التي يحتاج فيها عدة محركات إلى مقارنة على أساس واحد — أي محرك TTS، أي محرك STT، أي نموذج تحسين نعتمده افتراضيًا. تنشر مكتبات الكلام القائمة على ONNX الخالص التي بُنيت speechonnxmetrics لتقييمها — TTS وASR وإزالة الضوضاء واستنساخ الصوت — مقارنات لكل محرك مُنتَجة بالمقاييس نفسها أعلاه بالضبط: MOS بلا مرجع للأنظمة بلا حقيقة أرضية، ومقاييس تدخّلية حيث يوجد مرجع نظيف، ومعدّلا خطأ الكلمات/الأحرف حيثما تكون صحة النص المفرَّغ محل تساؤل. هذا ما يحوّل “اخترنا هذا المحرك” إلى رقم يستطيع شخص آخر التحقق منه.
إن كان مشروعك يحتاج تقييم لغة، أو محرك، أو حالة تسجيل بهذه الطريقة ولم تُغطَّ بعد، تواصل معنا أو اطّلع على خدماتنا.