G.711 هشتبیتی به معنی PCM خطیِ هشتبیتی نیست. در PCMU و PCMA هر بایت پس از مقیاسبندیِ لگاریتمی یک نمونه را کد میکند؛ تفسیرِ اشتباهِ کدک میتواند همان بایتها را به مقدارهای متفاوت تبدیل کند. این تمرین چند نگاشتِ عددیِ معلوم را اجرا میکند؛ فایلِ تماس، RTP یا تشخیصِ گفتار اجرا نشده است.
PCMU، PCMA و PCM16 سه نامِ جایگزین نیستند
طبق RFC3551، PCMU ازμ-law و PCMA از A-law استفاده میکنند و در این نمایه هر نمونه یک octet هشتبیتی است. مثالِ ما قراردادِ صریحِ تککاناله و ۸۰۰۰ نمونهدرثانیه دارد. بایتِ خامِ بدونِ توضیحِ قالب، خودش نمیگوید کدام کدک، نرخ یا تعدادِ کانال را دارد؛ ازپسوند یا حدسِ صدا این اطلاعات را استخراج نکردهایم.
کدِ آموزشی دو نگاشتِ جدا میدهد و چند جوابِ معلوم را با جدولهای مرجعِ کدِ CPython۳٫۱۲ تطبیق میدهد. آن منبع برای مقایسهٔ مقدارها خوانده شده است؛ ما ماژولِ audioop را وارد، نصب یا روی نسخهٔ جدیدِ Python موجود فرض نکردهایم. همهٔ کدِ تمرین با کتابخانهٔ استاندارد و حسابِ بیت انجام میشود.
چهار بایت، دو خروجی
دنبالهٔاصیلِ hex برابر ۰۰، ۷F، ۸۰ و FF است. اگرکدک PCMU باشد، نمونههای PCM16 بهترتیب−۳۲۱۲۴، ۰، ۳۲۱۲۴ و ۰ میشوند. با PCMA همان بایتها−۵۵۰۴، −۸۴۸، ۵۵۰۴ و ۸۴۸ میدهند. تغییرِ نامِ کدک، جزئیاتِ نمایشی نیست؛ تابعِ تبدیل فرق میکند.
| بایت | تفسیرِ PCMU | تفسیرِ PCMA |
|---|---|---|
| 00 | −۳۲۱۲۴ | −۵۵۰۴ |
| 7F | ۰ | −۸۴۸ |
| 80 | ۳۲۱۲۴ | ۵۵۰۴ |
| FF | ۰ | ۸۴۸ |
فایل Python دوازده جوابِ معلوم را کنترل میکند و برای هر دو تابع، خروجیِ تمام ۲۵۶ بایت را ازنظرِ بازهٔPCM16 بررسی میکند. این ۵۱۲ کنترلِ بازه را با تطبیقِ تمامِ نگاشتها با مرجع یکی نمینامیم؛ پاسخهای معلومِ مقایسهشده دوازدهتا هستند. خروجیِ بایتیِ PCM16 در این کد little-endian است و بازخوانیِ چهار نمونه نیز کنترل میشود.
۲۰ میلیثانیه تحتِ قراردادِ معلوم
در ۸۰۰۰ نمونهدرثانیه و تککانال، ۲۰ میلیثانیه ۱۶۰ نمونه است؛ G.711 خامِ این نمونه ۱۶۰ بایت دارد و بعد از بازکردن به PCM16، ۳۲۰ بایت میشود. نرخِ بیتِ payload برابر ۸۰۰۰×۸=۶۴۰۰۰ بیتدرثانیه است. سرآیندِ RTP، شبکه یا ظرفِ فایل در این حساب نیست.
برای کنترلِ عددها، ۱۶۰ بایت FF را در حالت PCMU باز میکنیم؛ ۱۶۰ نمونهٔصفر به دست میآید. اگر همان ۱۶۰ بایت را بیدلیل PCM16 فرض کنیم، فقط ۸۰ نمونه میخوانیم و مدتِ محاسبهشده هم غلط میشود. این شاهدِ قالبِ اصیلِ تمرین است؛ ازآن دربارهٔسکوتِ واقعی، کیفیتِ شنیداری یا رفتارِ ASR نتیجه نمیگیریم.
این نمونه کدام کارها را انجام نمیدهد؟
سرآیندِ RTP را جدا نمیکند، مذاکرهٔSDP را تفسیر نمیکند و بستهٔگمشده، jitter یاچندکانال را بازسازی نمیکند. قراردادهای دیگرِ قالب در تابع رد میشوند، اما بدون metadata معتبر نمیتوان هرجریانِ ناشناس را خودکار تشخیص داد. خروجی هم ظرفِ WAV نیست؛ فقط بایتهای PCM16 است و عوضکردنِ برچسب، بازنمونهبرداریِ واقعی انجام نمیدهد.
نرخِ نمونهبرداری و عمقِ بیت و نرخِ بیت را برای تفاوتِ واحدها بخوانید. اگرصدای تلفنیِ مجاز را برای اپرانگار آماده میکنید، کدک، نرخ، کانال و نیازِ خروجی را پیش از تبدیل با تیم روشن کنید؛ این راهنما پذیرشِ مستقیمِ هر G.711 یا دقتِ تشخیصِ آن در محصول را تضمین نمیکند.
فایل تمرین و منبع
نگاشتِ بایتِ معلومِ PCMU/PCMA به PCM16؛ بدون audioop یا ASR · چهار بایتِ اصیل با دو تفسیرِ متفاوتِ کدک
- مرجع اصلی RFC3551، ژوئیه ۲۰۰۳، PCMA/PCMU وقراردادِ بایت
- کدِ مرجع CPython۳٫۱۲؛ جدولهای نگاشتِ PCMU/PCMA، فقطمرجعِ جوابهایِ معلوم
منابع در ۳ نوامبر ۲۰۲۶ خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.