في الإصدار التجريبي (بيتا) من Telegram لنظام Android 13.0.3 (بناء 7179)، كان من الممكن إرسال الرسائل الصوتية المسجلة كنص: كان زر «Aa» بجانب زر الإيقاف المؤقت يقوم بنسخ التسجيل حتى قبل إرساله، وكان المستخدم يختار ما سيصل إلى المستلم — النص أو الصوت نفسه. أشير إلى أن هذه الميزة متاحة فقط لمشتركي Premium. لاحقًا، أزيلت خاصية النسخ من إصدار بيتا باعتبارها تجربة مؤقتة من أحد المطورين؛ بينما بقيت الميزة الجديدة الثانية في نفس البناء — وهي التسجيل التجريبي للرسائل الصوتية مع خاصية إلغاء الضوضاء باستخدام الشبكة العصبية RNNoise. هذا ينطبق على من يستخدمون إصدار بيتا: الإصدار المستقر 13.0.2 لا يحتوي على أي من هاتين الميزتين.

كيف بدت الميزة في إصدار بيتا

كان زر «Aa» يظهر في وضع التسجيل المقفل (hands-free recording) — عندما يتم سحب الإصبع للأعلى من أيقونة الميكروفون أثناء التسجيل، ويستمر التسجيل دون الحاجة إلى الضغط المستمر. كان الضغط على «Aa» يعرض النسخ، ثم كان يبقى اختيار ما سيتم إرساله. إذا تم تعديل الرسالة الصوتية أو قصها، كان إصدار بيتا يقترح نسخها مرة أخرى.

يتم تفعيل التسجيل مع خاصية إلغاء الضوضاء في الإعدادات التجريبية لإصدار بيتا. تتم إزالة الضوضاء من الصوت قبل ضغطه إلى صيغة Opus — وهي الصيغة التي يخزن بها Telegram الرسائل الصوتية ويرسلها. تحذير من نفس البناء: خاصية إلغاء الضوضاء قد تفسد تسجيل الموسيقى والكلام الهادئ جدًا. غناء لحن في رسالة صوتية باستخدام هذا الوضع هو فكرة سيئة: بالنسبة للشبكة، تبدو الموسيقى كضوضاء، والسبب مذكور أدناه.

لماذا يعتبر النسخ قبل الإرسال آلية جديدة

خاصية نسخ الرسائل الصوتية موجودة في Telegram منذ فترة طويلة، ولكنها مخصصة فقط للرسائل الموجودة بالفعل في الدردشة. يقوم الخادم بذلك: يستدعي العميل الدالة messages.transcribeAudio، messages.transcribeAudio وللدالة معاملان — الدردشة ورقم الرسالة فيها. يأتي الرد مع معرف النسخ والنص؛ وقد تعود التسجيلات الطويلة مع إشارة "قيد المعالجة"، وعندها يتم إضافة النص بتحديثات منفصلة updateTranscribedAudio.

التسجيل غير المرسل لا يحتوي على رقم رسالة، لذلك لا يمكن تطبيق هذه الدالة عليه. لا توجد دالة تقبل الملف نفسه، لا في مخطط API العام (TDLib بتاريخ 8 أكتوبر) ولا في الشيفرة المصدرية لنظام Android 13.0.2 مع الطبقة 231. كما أن نظام التعرف على الكلام الخاص بنظام Android (android.speech) لا يُستخدم في شيفرة 13.0.2.

كيف تجاوز إصدار بيتا هذا القيد، لا يظهر من المصادر المفتوحة: الشيفرة المصدرية للبناء 13.0.3 لم تُنشر، وينتهي المستودع عند 13.0.2 (7175)، الذي صدر في 13 أكتوبر. لا توجد سطور للزر الجديد حتى على منصة الترجمة — وهذا يتوافق مع فرضية التجربة الشخصية التي لم تصل إلى مرحلة التوطين. فرضية، وليست حقيقة من الشيفرة: كان التعرف يتم إما عبر دالة خادم غير موجودة بعد في المخطط العام، أو على الجهاز نفسه.

لمن تتوفر خاصية النسخ الآن

بالنسبة للرسائل الصوتية المستلمة، القواعد واضحة في شيفرة العميل. خاصية النسخ غير المحدودة هي جزء من Premium — في وصف الاشتراك، هذه العبارة تتحدث عن نسخ أي رسالة صوتية واردة. بدون Premium، يقدم الخادم نسخًا تجريبية: يقرأ العميل عددها الأسبوعي والحد الأقصى لطول التسجيل من إعدادات الخادم، المفاتيح transcribe_audio_trial_weekly_number و transcribe_audio_trial_duration_max. كان الحد الأقصى للطول في لقطات إعدادات أكتوبر هو 300 ثانية، وتغير عدد التجارب الأسبوعية بين 0 و 2. عندما تنتهي التجارب، يعرض العميل التاريخ الذي يجب الانتظار حتى يتم تجديدها، أو يقترح الاشتراك في Premium.

كيف يعمل RNNoise

RNNoise هي مكتبة مفتوحة المصدر لإلغاء الضوضاء من Xiph.Org تحت ترخيص BSD. مؤلفها هو Jean-Marc Valin، أحد مبتكري ترميز Opus؛ وقد وُصف عملها في مقالته عام 2017.

النهج هجين. تقوم معالجة الإشارة الكلاسيكية بتقطيع الصوت إلى إطارات مدتها 10 مللي ثانية (480 عينة عند 48 كيلو هرتز) وتحلل طيف كل إطار إلى 22 نطاقًا، تكون عروضها قريبة من كيفية تمييز الأذن للترددات. شبكة عصبية متكررة صغيرة — تتذكر الإطارات السابقة — تنظر إلى خصائص النطاقات وتصدر لكل منها معاملًا من 0 إلى 1: كمية الطاقة التي يجب الاحتفاظ بها في هذا النطاق. يقوم مرشح منفصل لدرجة الصوت بتنظيف الضوضاء بين توافقيات الصوت. في الوقت نفسه، تصدر الشبكة احتمال وجود كلام في الإطار على الإطلاق.

تتحكم الشبكة في 22 معاملًا، وليس مئات العينات الترددية، لذا فهي صغيرة وتعمل في الوقت الفعلي على معالج الهاتف. الجانب السلبي هو أنها دُرّبت على فصل الكلام عن الضوضاء، وكل ما لا يشبه الكلام تعتبره ضوضاء. من هنا يأتي التحذير بشأن الموسيقى؛ والصوت الهادئ يضيع لنفس السبب — خصائصه في النطاقات قريبة من الخلفية.

RNNoise كان موجودًا بالفعل في التطبيق

لم تكن هناك حاجة لإضافة المكتبة. توجد الشيفرة المصدرية في مستودع عميل Android في jni/voip/rnnoise، ويتم تجميعها في مكتبة ثابتة وتضمينها في المكتبة الأصلية الرئيسية للتطبيق. كانت تعمل حتى الآن في محادثات الفيديو: تمرر وحدة الاتصال كل إطار من الميكروفون عبر RNNoise، وتأخذ تقدير الكلام لمؤشر المتحدث، وتستبدل الصوت بالصوت النظيف عندما تكون خاصية "إلغاء الضوضاء" مفعلة في إعدادات محادثة الفيديو.

يسجل العميل الرسائل الصوتية من الميكروفون أحاديًا بتردد 48 كيلو هرتز ويضغطها باستخدام ترميز Opus في وضع الصوت. يتطابق تردد التسجيل مع التردد الذي يعمل عليه RNNoise، لذا فإن تجربة إصدار بيتا تقتصر على حلقة واحدة بين الميكروفون والمُرمّز — وهي نفس الحلقة الموجودة في محادثات الفيديو منذ فترة طويلة.