انتقل إلى المحتوى
HA_

← جميع المقالات

· 3 دقائق قراءة

أصلِح الكلام من مصدره

لماذا حذف مرشّح كان ينظّف النصوص المفرّغة بالأردية من الشوائب كلاماً حقيقياً أيضاً، ولماذا يكمن إصلاح التفريغ الرديء في طريقة استماع الوكيل الصوتي، لا في ما يفعله بالنص بعد ذلك.

voice-aiarchitecture

ترجمة آلية. اقرأ النسخة الأصلية

تشغّل VoxRange وكلاء ذكاء اصطناعي (AI) يجيبون عن مكالمات هاتفية حقيقية بالأردية، وبذلك المزيج من الأردية والإنجليزية الذي يتنقل فيه الناس فعلاً بين اللغتين أثناء الحديث. أنا المهندس المعماري الرئيسي. تتناول هذه التدوينة خطأً واحداً ارتكبناه في جزء الاستماع من هذا المسار، والقاعدة التي استخلصتها منه.

العَرَض

ظل تحويل الكلام إلى نص (speech-to-text) في المكالمات الأردية يُنتج نصوصاً شاردة بالحروف اللاتينية في منتصف النصوص الأردية المفرّغة. فالصوت الهاتفي ضيق النطاق، واختلاط اللغات، والأسماء تجعل التفريغ صعباً أصلاً، وقد زادته هذه الشذرات سوءاً: فما يقوله النص المفرّغ هو ما يستجيب له الوكيل.

كانت الخطوة البديهية هي تنظيف المُخرجات. إذا كان الوكيل مُعدّاً للأردية وعادت شذرة بالحروف اللاتينية، فلتُحذف قبل أن يراها الوكيل.

لماذا كان المرشّح خاطئاً

نجح المرشّح، بمعنى أن الشوائب اختفت. لكن الكلام الحقيقي اختفى معها.

المتصلون لا يلتزمون بنظام كتابة واحد. فكثير من الأردية يُكتب بالحروف اللاتينية بوصفه أردية رومانية، وكثير من الأحاديث اليومية ينتقل إلى الإنجليزية لكلمة أو لعبارة كاملة. مثال مُختلَق: "mera appointment confirm kar dein" طلب عادي، وكل كلمة فيه كلام حقيقي بحروف لاتينية. القاعدة التي تحذف النص اللاتيني لا تستطيع التمييز بين هذه الجملة والضجيج، لأنه حين تعمل لا يبقى أمامها ما تحكم عليه سوى نظام الكتابة، ونظام الكتابة ليس هو المشكلة.

تراجعنا عن المرشّح. وبقي مرشّح أضيق: أنظمة الكتابة التي لا يُعقل أن تكون كلاماً حقيقياً في هذه المكالمات، مثل الحروف السيريلية أو حروف CJK، لا تزال تُحذف، لأن حذفها لا يكلّف شيئاً حقيقياً.

من أين تأتي الشوائب فعلاً

كانت الشذرات الشاردة عَرَضاً لخلل في مرحلة الاستماع، ولذلك فإن الإصلاح ينتمي إلى هناك:

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

كل واحد من هذه يغيّر ما يسمعه النموذج أو ما يتوقعه. ولا يتخلص أي منها من شيء قاله المتصل.

الدرس المرتبط: انجراف الإعدادات

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

كانت القيمة موجودة فقط في بيئة (environment) أحد الخوادم. لم يكن في الشيفرة أو في تاريخها ما يحفظ القيمة المضبوطة، فلم يكن هناك ما يمنع تغيّرها. قيمة ضبط كهذه مكانها في إعدادات خاضعة لإدارة الإصدارات، بجوار الشيفرة التي تقرؤها، مع ملاحظة عن سبب ضبطها على ما هي عليه:

# voice-runtime config, versioned with the code
# How long to wait in silence before ending the caller's turn.
# Too short cuts callers off and fragments transcripts.
END_OF_SPEECH_SILENCE_MS: <tuned value>

وعلّمتنا المكالمة نفسها أمراً ثانياً. فالصمت الميت في نوبة الكلام هو مجموع عدة مراحل: انتظار نهاية الكلام، والتفريغ، والاسترجاع (retrieval)، والـ LLM، وتوليد الكلام. بعض هذه المراحل كان زمنها مقيساً وواحدة لم تكن كذلك. لا يمكنك أن تقرر ما الذي ينبغي تحسينه قبل قياس كل مرحلة من مراحل النوبة، لأن المرحلة التي لا تقيسها هي التي ستجد نفسك تخمّن بشأنها في النهاية.

ما سأقوله لمن يبني الشيء نفسه

  1. عندما ينتج نموذج ما شوائب، ابحث عن المرحلة التي تسببت بها قبل كتابة قاعدة لحذفها. فمرشّحات المُخرجات لا ترى الأسباب.
  2. اختبر أي قاعدة تنظيف على كلام حقيقي غير منظّم، بما في ذلك التنقل بين اللغات، قبل أن تثق بها.
  3. احفظ قيم الضبط في إعدادات خاضعة لإدارة الإصدارات مع سبب مرفق، لا في بيئة الخادم وحدها.
  4. قِس كل مرحلة من مراحل النوبة قبل تحسين أي منها.