معظم التأخير في الترجمة المباشرة انتظار: انتظار البث، ثم الكلمة التالية، ثم الجملة. الجزء الوحيد الذي تتحكم فيه هو وضع زمن الاستجابة: تأخير أقل، أو مراجعات أقل.
يرى المستمع الذي يتابع ترجمة مباشرة كل سطر بعد أن يقوله المتحدث بثوانٍ عدة. هذه الفجوة ليست تأخيرًا واحدًا، بل عدة تأخيرات تتراكم على طول سلسلة، ومعظمها شكل من أشكال الانتظار. ومعرفة أي انتظار هو أي تجعل اختيار وضع زمن الاستجابة أمرًا بديهيًا، وتُخبر المطوّر الذي يبني قارئًا بما يجب عرضه ومتى.
مقياس مفيد قبل الأرقام: يتأخر المترجم الفوري البشري عادةً بين ثانيتين وأربع ثوانٍ عن المتحدث. يسمّي المترجمون هذه الفجوة «فجوة الأذن والصوت»، ويتعاملون مع اللغات التي يأتي فيها الفعل في آخر الجملة لا بانتظار الفعل، بل بتوقّعه، أو بتقسيم الجملة إلى أجزاء يمكن أن تقف وحدها. ثانية أو ثانيتان من التأخير ليستا عيبًا في البرمجيات؛ إنهما تقريبًا ما يفعله المترجم البشري الماهر.
تمرّ كل عملية تفريغ نصي مباشر على VocalStack بالمراحل نفسها، وبالترتيب نفسه، وتنتظر كل مرحلة التي قبلها.
يصل النص باللغة الأصلية إلى القارئ تقريبًا كما يُنطق. تتأخر الترجمة ثانية أو ثانيتين، والجملة المنطوقة تأتي بعد ترجمتها، ولذلك يصل مقطع الصوت دائمًا في الأخير. غير أن أول أثر مرئي للسلسلة يظهر قبل أي صوت بكثير: النص نفسه يتحرك.
أول ما يلاحظه الناس في النص المباشر أن أحدث الكلمات تتحرك. تظهر عبارة، ثم تتغير، ثم تستقر. هذه مرحلة المسودة، وهي موجودة لسبب ينطبق على كل نظام للتعرّف على الكلام.
يحسم النظام الكلمة بالنظر إلى ما يأتي بعدها. تبدو «I scream» و«ice cream» متطابقتين في النطق حتى تصل الكلمة التالية، وقد تنتمي اللاحقة «s» إلى هذه الكلمة أو إلى التي بعدها. وما لم يكن هناك صوت على يمين الكلمة، يبقى رسمها تخمينًا، ولذلك تكون أحدث الكلمات في أي نص مباشر دائمًا أقلها يقينًا. المسودة ببساطة هي هذا التخمين معروضًا مبكرًا بدلًا من إخفائه.
تستبدل كل مسودة الذيل الحي بالكامل: الكلمات المسموعة منذ آخر إثبات، وهي ما زالت تتغير. أما الإثبات فنهائي. لا يتغير أبدًا، ويحمل توقيتات على مستوى الكلمة، وتُرقَّم الإثباتات بلا فجوات حتى يستطيع القارئ أن يعرف إن فاته واحد منها.
بالنسبة إلى المطوّر هذه هي القاعدة الوحيدة التي تفرضها واجهة البرمجة الفورية: اعرض كل مقطع مُثبَت، ثم أحدث مسودة بعده، وامسح المسودة عند وصول إثبات. إلحاق المسودات بدلًا من استبدالها يُنتج نصًا مكررًا يومض، فالإثبات ببساطة يستهلك الذيل. ويبني درس WebSocket التعليمي قارئًا يقوم على هذا تحديدًا.
أما المضيف فتحريك النص ثمن زمن الاستجابة المنخفض. عرض الكلمات قبل أن تنتهي العبارة هو ما يجعل النص يبدو مباشرًا. لكن الترجمة لا تحتمل هذه الحيلة، لأنه يمكن تخمين كلمة من نصف عبارة، أما الترجمة فلا يمكن تخمينها.
ترتيب الكلمات هو سبب عجز الترجمة عن مواكبة المسودة. قد يقع الفعل الألماني في آخر الجملة الفرعية، واليابانية تضع الفعل في الآخر. يحتاج أي مترجم إلى الجملة كاملة قبل أن يصوغها صياغة أمينة. وترجمة الكلمات واحدة واحدة تسلّم المستمع أجزاءً يجب أن تُعاد قراءتها حين تُغلق الجملة. وقد اضطر المترجمون إلى انتظار الفعل في الألمانية منذ زمن طويل، قبل أن تحاول البرمجيات ذلك.
لذلك يترجم VocalStack الجمل لا المقاطع. الجمل مفعّلة افتراضيًا، وعند تفعيلها يجمع الخادم الإثباتات في جملة ويترجمها كاملة. وما دامت الجملة مفتوحة فترجمتها مؤقتة؛ فإذا أُغلقت صارت الترجمة نهائية. يحتفظ القارئ بمدخل واحد لكل جملة، ويستبدله مع وصول التحديثات.
الانتظار في النطق أطول من ذلك. لا يُنطق إلا الجملة المغلقة، لأن الجملة التي ما زالت تتغير ستُعاد تركيبها صوتيًا مع كل مراجعة. وتُنطق الجملة الطويلة على أجزاء، فيمكن أن يبدأ الجزء الأول بالتشغيل بينما تُجهَّز بقية الأجزاء.
مع إيقاف الجمل، تحصل كل وحدة إثبات على إطار ترجمة خاص بها. هذا المسار لا ينتظر شيئًا، لكن الجمل الكاملة تُقرأ أفضل بكثير.
تُقاس كل هذه الانتظارات من اللحظة التي يصل فيها الصوت إلى VocalStack. وفي كثير من البثوث كان الصوت متأخرًا أصلًا حين وصل.
حين يكون المصدر بثًّا لا ميكروفونًا، يكون الصوت متأخرًا أصلًا قبل أن يُفرَّغ أي شيء. فهو يتخلف عن الحافة المباشرة، أي عن أحدث لحظة نشرها البث.
يتأخر بث الصوت عبر HTTP العادي، وهو النوع الذي تنشره معظم محطات الراديو عبر الإنترنت، عادةً ثانية إلى ثلاث ثوانٍ. يحتفظ الخادم بمخزن مؤقت للانفجارات: بضع ثوانٍ من الصوت الأخير، تُرسل دفعة واحدة حتى يتمكن مشغّل المستمع الجديد من البدء دون توقف. ويلتحق كل مستمع، بما فيهم VocalStack، بهذه المسافة إلى الخلف. أما HLS فأسوأ، إذ تبدأ قوائمه العميل متأخرًا ثلاثة مقاطع عن الحافة المباشرة، وهذا عمليًا يعني عدة ثوانٍ إلى نصف دقيقة حسب طول المقطع. ويقع DASH القياسي عادةً في النطاق نفسه تقريبًا مع HLS، ولا تقل عنه بوضوح إلا نسخته ذات زمن الاستجابة المنخفض. فالبث «المباشر» لمحطة قد يكون مباشرًا بالطريقة التي تكون بها الرسالة «حديثة».
هذه الأرقام تقريبية، وهي تخص البث لا التفريغ النصي: لا يستطيع أي إعداد في جانب VocalStack أن يستعيد هذه الثواني. فإن كانت تلك الثواني مهمة في حدث ما، فغذِّ المرحلة بالصوت من ميكروفون أو مُرمِّز بدلًا من بث عام. التأخير الذي يسببه البث يُحسم قبل أن يسمع VocalStack كلمة واحدة؛ أما وضع زمن الاستجابة فهو ما يمكنك تحريكه فعلًا.
وضع زمن الاستجابة يفعل شيئًا واحدًا: يحدد التوازن بين التأخير والدقة. يقع الإعداد ضمن Advanced حين تُنشأ عملية التفريغ النصي المباشر، وفي تبويب Speed أثناء تشغيلها. هناك تظهر الشارة إما AUTO أو SPEED أو ACCURACY (ويظهر Fast باسم SPEED). وعبر الواجهة البرمجية يغيّر session.update الوضع أثناء البث.
المقايضة هي التي توحي بها الأسماء. يُخرج Fast النص أسرع لكنه يراجع منه أكثر، ويستغرق Accuracy وقتًا أطول قليلًا ويراجع أقل. ولا يلاحظ الجمهور الجالس الذي يقرأ الترجمة المصاحبة ثانيةً إضافية في الغالب، لكنه يلاحظ الكلمات التي تستمر في التغيّر. لذلك كثيرًا ما يكون Accuracy الخيار الألطف، ما دام مخطط التأخير مستويًا. ويُظهر Auto ما يفعله: فالسطر الذي سرّعه ليسد فجوة يحمل شارة FAST MODE في نص المضيف، مع ملاحظة بأن الدقة قد تكون أقل فيه.
أيًا كان الوضع، يجب أن يكون التفريغ جاهزًا قبل الكلمة الأولى، وإعداده هو التأخير الوحيد الذي تدفعه السلسلة مرة واحدة.
في بعض الخطط يحتاج التفريغ النصي المباشر إلى بضع ثوانٍ ليبدأ. وتختلف المدة حسب الخطة: فصف Start-up speed في صفحة الأسعار يتراوح من بداية باردة تصل إلى 15 ثانية في الدفع حسب الاستخدام، إلى الجاهزية الدائمة في خطة Enterprise.
عبر الواجهة البرمجية يظهر الانتظار على شكل إطارات session.loading أثناء بدء الجلسة، ثم session.ready؛ ولا يرسل العميل الصوت إلا بعد ذلك. ويرى المستمع الذي يفتح الرابط في الأثناء: «مباشر. يظهر السطر الأول بعد لحظة.» وما إن يعمل التفريغ حتى يصبح هذا التأخير وراءك، ولا يبقى إلا سؤال واحد: كم من التأخير المتبقي تحمله؟
أثناء تشغيل بث مباشر، يعرض تبويب Speed لدى المضيف حصيلة كل ذلك: الفجوة الحالية بين المتحدث والنص، مع شارة الوضع بجانبها، ومخططًا لتلك الفجوة عبر التسجيل مع متوسطها وذروتها. وفي النص نفسه يحمل السطر الذي وصل إلى المستمعين متأخرًا شارة تعطي عدد الثواني بين لحظة نطقه ولحظة وصوله.
المخطط الذي يبقى منخفضًا ومستويًا يعني أن الوضع يناسب الصوت. أما المخطط المتصاعد فيعني أن خط المعالجة يتأخر. وفي وضع Accuracy قد تكون تلك اللحظة للانتقال إلى Auto، الذي يقايض بعض الدقة بالسرعة حتى تُغلق الفجوة.
أما المطوّرون فيحصلون على رقم واحد بدلًا من ذلك. حين تنتهي جلسة الوقت الفعلي، يحمل session.done القيمة stats.realtimeFactor، وهي الصوت المُفرَّغ مقسومًا على الوقت الذي استغرقه تفريغه. وتنبيه بشأن الاصطلاح: في أدبيات التعرّف على الكلام، يعني عامل الوقت الفعلي عادةً المقلوب، أي زمن المعالجة على زمن الصوت، حيث الأقل أفضل. أما VocalStack فيعرضه بالعكس، فهنا الأعلى أفضل: تقترب الجلسة المباشرة من 1، والقيمة الأقل من 1 تعني أن الصوت وصل أسرع مما يستطيع خط المعالجة تفريغه.
لا شيء من هذه الثواني غامض. بعضها يخص البث، وبعضها كلمة تنتظر الكلمة التي بعدها، وبعضها الجملة التي تحتاجها الترجمة، والباقي يخص وضع زمن الاستجابة الذي اخترته. يمكنك الاطلاع على التفاصيل إطارًا إطارًا في مرجع API، ويُظهر العرض التوضيحي في الصفحة الرئيسية السلسلة وهي تعمل.