یک مدل رفعنویز یک checkpoint تازه عرضه میکند. یک صدای TTS روی دادهی بیشتری دوباره آموزش میبیند. یک خط لولهٔ شبیهسازی صدا vocoder اش را تعویض میکند. در هر مورد، کسی باید پاسخ دهد: خروجی بهتر است یا بدتر از قبل؟ «بهنظر من بهتر است» مقیاسپذیر نیست. همان لحظهای که زبان، زبانی نیست که خودتان صحبت کنید، همان لحظهای که بهجای دو، بیست checkpoint برای مقایسه هست، یا همان لحظهای که تغییر باید در هر commit بررسی شود نه یکبار با دست، از هم میپاشد.
پاسخ دقیق به «آیا بهتر به نظر میرسد» یک امتیاز میانگین نظر (MOS) است: صدا را جلوی یک پانل از شنوندگان بگذارید، از هر یک بخواهید آن را از ۱ تا ۵ رتبهبندی کند، و امتیازها را میانگین بگیرید. MOS سنجهٔ استاندارد کیفیت گفتار است دقیقاً چون پرسشی را میپرسد که اهمیت دارد — آیا یک انسان این را قابلقبول مییابد — بهجای یک جایگزین برای آن. همچنین گران است. استخدام یک پانل، اجرای پیوستهٔ آن، و تکرارش برای هر زبان، هر شرایط ضبط و هر نسخهٔ مدلی که یک تیم کوچک عرضه میکند چیزی نیست که یک پانل شنیداری بتواند با آن همگام بماند.
speechonnxmetrics کتابخانهای است برای تقریب زدنِ آن قضاوت بدون یک پانل، روی هر build. این کتابخانه سنجههایش را در سه خانواده گروهبندی میکند، و انتخاب خانوادهٔ درست برای موقعیت بیش از هر عدد منفردی اهمیت دارد.
سه خانواده، سه پرسش
برآوردگرهای MOS بدونمرجع شبکههای عصبیای هستند که آموزش دیدهاند تا پیشبینی کنند یک پانل شنیداری چه میگفت، تنها از خودِ صدا. آنها به هیچ اصل تمیزی نیاز ندارند — تنها به خروجیای که میخواهید قضاوت کنید. این خانواده را وقتی به کار ببرید که هیچ حقیقت زمینیِ مقایسهای وجود ندارد: امتیازدهی به خروجی یک سامانهٔ TTS، یا بررسیِ یک ضبط واقعیِ از پیش تخریبشده پس از رفع نویز.
سنجههای تهاجمی به یک مرجع تمیزِ مطابق نیاز دارند و فاصلهٔ میان آن و سیگنالِ تخریبشده را اندازه میگیرند. این خانواده را وقتی به کار ببرید که خودتان تخریب را ساختهاید و هنوز اصلِ تمیز را دارید: یک ضبط شناختهشدهخوب را از میان یک codec، یک مدل بسط پهنایباند یا یک تبدیلکنندهٔ صدا عبور دادهاید و میخواهید بدانید خروجی چقدر از مبدأ فاصله گرفته.
سنجههای متنیِ مبتنی بر ASR خروجی را با یک تشخیصدهندهٔ گفتار رونویسی میکنند و رونوشت را در برابر متن مورد انتظار diff میکنند. این چیزی را میگیرد که آن دو خانوادهٔ دیگر نمیتوانند: صدایی که کاملاً طبیعی و تمیز به نظر میرسد اما واژههای اشتباه میگوید. یک پیشبینِ 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 عرضه میشود، هر یک مقادیری روی یک مقیاس ۱ تا ۵ برمیگرداند که بالاتر بهتر است — همان مقیاسی که یک پانل انسانی به کار میبرد:
| سنجه | ابعاد | آموزشدیده روی | استفادهٔ تجاری |
|---|---|---|---|
utmos | یک امتیاز طبیعیبودن | گفتار سنتزشده (VoiceMOS Challenge) | بله |
dnsmos | sig / bak / ovrl (کیفیت گفتار / نویز پسزمینه / کلی) | ITU-T P.835 | بله |
dnsmos_p808 | یک MOS شنیداریِ جمعسپاریشده | ITU-T P.808 | بله |
sigmos | ۷ بُعد (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 این را برایتان فیلتر نمیکند؛ مجوز را اعلام میکند و انتخاب را به فراخوان میسپارد.
این هم آنچه صدای واقعی امتیاز میگیرد. اجرای fixture های بستهٔ خودِ کتابخانه — یک ضبط تمیز (source.wav) و یک بازسنتزِ neural-codec از همان کلیپ (facodec_aria.wav) — از میان UTMOS:
>>> s.score("source.wav", ["utmos"])
{'utmos': 4.41}
>>> s.score("facodec_aria.wav", ["utmos"])
{'utmos': 3.21}
ضبط تمیز نزدیک بالای مقیاس مینشیند، همانطور که باید — این گفتار واقعیِ انسانی است، نه سنتزشده. بازسنتزِ codec بیش از یک نمرهٔ کامل افت میکند. آن شکاف، بیش از هر یک از دو عدد بهتنهایی، سیگنال سودمند است: به شما میگوید codec تخریبِ قابلشنیدنی وارد میکند، و عددی برای پیگیری در حین تنظیمِ codec به شما میدهد.
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 | ۰ تا ۱ | بالاتر بهتر است | وضوح عینیِ کوتاهمدت — چقدر از محتوا زنده میماند، مستقل از اینکه چقدر طبیعی بهنظر میرسد |
si_sdr / sdr / snr | dB، نامحدود | بالاتر بهتر است | نسبت سیگنال به اعوجاج / سیگنال به نویز |
mcd | dB، نامحدود | پایینتر بهتر است | اعوجاج mel-cepstral — فاصلهٔ پوششِ طیفی، یک سنجهٔ کلاسیک کیفیت TTS/VC |
log_f0_rmse | نامحدود | پایینتر بهتر است | خطای منحنی زیروبمی |
lsd / msd | dB | پایینتر بهتر است | فاصلهٔ log-spectral / mel-spectral |
توجه کنید جهتها برعکس میشوند: STOI و خانوادهٔ SDR وقتی کیفیت بهتر است بالا میروند؛ MCD، خطای زیروبمی و فاصلهٔ طیفی پایین میآیند. اشتباه گرفتن آنها هنگام خواندن یک جدول خطایی آسان است.
امتیازدهی به همان بازسنتزِ codec در برابر مبدأ تمیزش:
>>> s.score("facodec_aria.wav", ["stoi", "mcd", "si_sdr"], ref="source.wav")
{'stoi': 0.662, 'mcd': 10.46, 'si_sdr': -26.94}
STOI برابر ۰٫۶۶ روی مقیاسی از ۰ تا ۱ که ۱٫۰ یک تطبیق کامل است میگوید وضوح ضربهٔ واقعی خورده — این بهوضوح پایینتر از چیزی است که یک ضبط سبکپردازششده امتیاز میگرفت. یک SI-SDR تقریباً منفی ۲۷ دسیبل این را تأیید میکند: SI-SDR هرگاه انرژیِ اعوجاج بر سیگنال بچربد منفی میشود، و یک عدد منفیِ بزرگ به معنای تغییر ساختاریِ سنگین است، نه صرفاً نویزِ افزوده. MCD برابر ۱۰٫۴۶ دسیبل بالاست؛ سامانههای TTS منتشرشدهای که بهوضوح مصنوعی اما همچنان از نظر گوینده یکدست بهنظر میرسند معمولاً در رقمهای تکرقمی مینشینند، پس ۱۰+ نشانگر رانشِ چشمگیرِ پوششِ طیفی میان بازسنتز و اصل است.
سنجههای مبتنی بر ASR: خواندن اعداد
پنج سنجهٔ متنی از یک همترازیِ Levenshtein میان یک رونوشت مرجع و یک فرضیه (آنچه صدا واقعاً به آن رونویسی شده) میآیند:
| سنجه | بازه | جهت | معنا |
|---|---|---|---|
wer | ≥ ۰ (معمولاً ۰ تا ۱، میتواند از ۱ فراتر رود) | پایینتر بهتر است | نرخ خطای واژه: جایگزینیها + حذفها + درجها، تقسیم بر شمار واژههای مرجع |
cer | ۰ تا ۱ | پایینتر بهتر است | همان ایده در سطح نویسه — بخشندهتر نسبت به عدمتطابقهای جزئیِ هجی/توکنسازی |
mer | ۰ تا ۱ | پایینتر بهتر است | نرخ خطای تطابق |
wil | ۰ تا ۱ | پایینتر بهتر است | اطلاعات واژگانیِ ازدسترفته |
wip | ۰ تا ۱ | بالاتر بهتر است | اطلاعات واژگانیِ حفظشده (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
یک WER برابر ۰٫۲۲ یعنی تقریباً یک واژه از هر پنج تا اشتباه است — محسوس، ارزشِ گوشدادن دارد. CER روی همان جفت پایینتر است چون امتیازدهیِ سطح-نویسه یک جایگزینیِ یکواژهای را بهعنوان مشتی ویرایشِ نویسهای درون یک رشتهٔ نویسهایِ بسیار طولانیتر میبیند، نه یک توکن کاملاً ازدسترفته؛ CER و WER به پرسشهای متفاوتی پاسخ میدهند و مستقیماً با هم قابلمقایسه نیستند. WER بالاتر از تقریباً ۰٫۳ تا ۰٫۴ روی گفتار طبیعی معمولاً یعنی سامانهٔ ASR، یا صدایی که رونویسی میکند، مشکلی واقعی دارد، نه یک خطای گرد کردن.
speechonnxmetrics هرگز متن را از طرف شما نرمالسازی نمیکند — یک مقایسهٔ خام حالت حروف و نشانهگذاری را بهعنوان خطا میشمارد، که بهندرت چیزی است که وقتی تلفظ را امتیازدهی میکنید نه قالببندیِ دقیق رونویسی، میخواهید. یک نرمالساز را صراحتاً پاس دهید: BASIC حالت حروف را کوچک میکند و فاصلههای سفید را جمع میکند، STRICT همچنین اختصارها را باز میکند و نشانههای نگارشی، نشانهگذاری و واژههای پرکننده را حذف میکند.
مهمترین هشدار
هر عددِ MOS بدونمرجع در این کتابخانه یک پیشبینی از یک مدل است، نه اندازهگیریِ یک واقعیت. UTMOS، DNSMOS، SIGMOS و NISQA هر یک روی یک مجموعهٔ خاص از دادهی آزمون شنیداری، در زبانها و شرایط ضبط خاص آموزش دیدهاند. یک پیشبین که عمدتاً روی ضبطهای استودیوییِ انگلیسی آموزش دیده میتواند زبانی را که هرگز در آموزش ندیده، لهجهای را که پانل آموزشیاش هرگز رتبهبندی نکرده، یا شرایط ضبطی — صدای تلفن، یک اتاق پرنویز، یک میکروفون کممنبع — بیرون از توزیع آموزشیاش را غلط قضاوت کند. مدل دروغ نمیگوید؛ برونیابی میکند، و برونیابی از ورودیهای ناآشنا جایی است که پیشبینهای عصبی کمترین قابلیتاعتماد را دارند.
با یک MOS پیشبینیشده بهعنوان شواهد رفتار کنید، نه بهعنوان حقیقت زمینی. برای آنچه در آن خوب است قابلاعتماد است: گیر انداختن پسرفتهای بزرگ، رتبهبندیِ چند نامزد در برابر هم، و پرچمگذاریِ اجرایی که نیاز به گوشدادنِ واقعیِ یک انسان دارد. جایگزینی برای یک پانل شنیداریِ واقعی نیست وقتی تصمیمی پرمخاطره است، و نباید حرف آخر دربارهٔ زبان یا شرایطی باشد که خودِ مدل زیربنایی برای قضاوت آن آموزش ندیده. گزارش چند پیشبین با هم، و رفتار با اختلافنظر میانشان بهعنوان محرکی برای گوشدادن بهجای نویزی برای میانگینگیری، تدبیر عملی است.
چرا این چیزی است که یک مقایسه را قابلاستفاده میکند
هیچکدام از اینها بهتنهایی سودمند نیست. سودمند میشود همان لحظهای که چند موتور باید روی همان پایه مقایسه شوند — کدام موتور TTS، کدام موتور STT، کدام مدل بهبود بهعنوان پیشفرض. کتابخانههای گفتاریِ خالصِ ONNX که speechonnxmetrics برای ارزیابیِ آنها ساخته شد — TTS، ASR، رفعنویز، شبیهسازی صدا — مقایسههای بهازای-هر-موتور تولیدشده دقیقاً با سنجههای بالا را منتشر میکنند: MOS بدونمرجع برای سامانههای بدون حقیقت زمینی، سنجههای تهاجمی جایی که یک مرجع تمیز وجود دارد، WER/CER هرجا درستیِ رونوشت زیر سؤال است. این چیزی است که «این موتور را انتخاب کردیم» را به عددی تبدیل میکند که کس دیگری میتواند بررسی کند.
اگر پروژهٔ شما به ارزیابیِ یک زبان، یک موتور یا یک شرایط ضبط به این شیوه نیاز دارد و هنوز پوشش داده نشده، با ما تماس بگیرید یا به خدمات ما نگاه کنید.