لا يحتاج تحويل النص إلى كلام الجيد إلى وحدة معالجة رسومات ولا إلى اشتراك سحابي. يمكن لصوت طبيعي متعدد اللغات أن يتّسع داخل شيء تخجل من تسميته خادمًا — من نوع اللوحات التي تحتفظ بها في درج “تحسبًا لأي طارئ”. حبة بطاطس.
phoonnx هو إطار عملنا البحثي المخصص لهذا الهدف بالضبط: أصوات صغيرة قائمة على VITS تعمل بالكامل دون اتصال، على وحدة المعالجة المركزية، وعلى عتاد رخيص، ويمكننا أيضًا تدريبها بأنفسنا من الصفر.
ما مدى صِغَر الصغير؟
لنضع رقمًا حقيقيًا بدلًا من التلويح بالأيدي. أخذنا صوت phoonnx إنتاجيًا — الصوت
الباسكي “Miro” (OpenVoiceOS/phoonnx_eu-ES_miro_espeak) — مباشرةً من Hugging Face
وأحصينا الأوزان في مخطط ONNX:
import onnx, numpy as np
m = onnx.load("miro_eu-ES.onnx")
print(sum(int(np.prod(i.dims)) for i in m.graph.initializer))
# 15650459
نحو 15.65 مليون معامل. هذا هو الصوت بأكمله — المُرمِّز، وفك التّرميز، وكل شيء — في ملف بحجم 63 ميغابايت. الصوت الأنثوي “Dii” من الإصدار نفسه يصل إلى العدد نفسه بالضبط، لأنهما يتشاركان بنية phoonnx VITS القياسية؛ فالشخصية تكمن في الأوزان، لا في سعة إضافية.
للمقارنة: يمكن لطبقة واحدة من نموذج لغوي حديث “صغير” أن تحمل معاملات أكثر من هذا المُخلِّق الكلامي بأكمله، ومع ذلك فهو يتكلم بطلاقة.
لماذا VITS، ولماذا ONNX
VITS هو العمود الفقري لكل صوت في phoonnx. إنه بنية شاملة من طرف إلى طرف — نص (أو بالأحرى فونيمات) في الدخل، وموجة صوتية في الخرج — دون مُرمِّز صوتي منفصل يحتاج إلى رعاية، ودون حلقة انحدارية ذاتية تزحف عيّنة واحدة في كل مرة. هذا التصميم الشامل هو تحديدًا ما يجعله قابلًا للتنفيذ على حبة بطاطس: تمريرة أمامية واحدة، تخليق متوازٍ، وانتهى الأمر.
نحن لا نشحن PyTorch إلى الحافة. تُصدَّر الأصوات المُدرَّبة إلى ONNX وتُشغَّل عبر
onnxruntime على وحدة المعالجة المركزية — دون CUDA،
ودون وحدة معالجة رسومات، ودون قمار التعريفات. onnxruntime محرك C++ محكم ومحمول،
ومخطط بخمسة عشر مليون معامل يقع بارتياح ضمن ما تمضغه نواة من فئة Raspberry Pi أسرع
من الزمن الحقيقي. النتيجة مساعد صوتي يواصل الكلام عندما ينقطع الإنترنت، وعندما يتعطل
مزود السحابة، أو عندما لا تريد ببساطة أن يغادر صوت منزلك المنزل من الأساس.
الفونيمات هي حيث يختبئ الذكاء
يمكن لنموذج صوتي ضئيل أن يكون ضئيلًا لأن phoonnx يقوم بالعمل اللغوي الصعب مقدمًا، في المُفوْنِم. يحوّل المُفوْنِم (تحويل الحرف إلى فونيم، أو G2P) النص المكتوب إلى تسلسل الوحدات الصوتية التي ينطقها النموذج فعلًا — بحيث لا تحتاج شبكة VITS أبدًا إلى تعلّم الإملاء، بل الصوت فقط.
يستند عملنا في الفونيمات إلى تحويل الحرف إلى IPA لـ 820 لغة و**الصوتيات البرتغالية الكلاسيكية**، اللذين يجعلان من الممكن تدريب أصوات للغات شحيحة الموارد دون أسابيع من التوصيف الخبير.
صُمِّم phoonnx عمدًا ليكون محايدًا تجاه المُفوْنِم، ويحزم جيشًا صغيرًا منها:
espeak-ng، وgruut،
وepitran،
وmisaki،
وtransphone (الذي يمتد إلى الآلاف من
اللغات المفهرسة في Glottolog)، إضافةً إلى متخصصين مثل
mantoq للعربية،
و**cotovia** للغاليسية، و OpenJTalk
لليابانية، و KoG2P للكورية. وهي تُخرج IPA و ARPA و Pinyin و Hangul و Buckwalter —
أيًا كان ما تحتاجه اللغة. بل هناك أيضًا G2P متعدد اللغات قائم على نموذج ومبني على
ByT5، ومُصدَّر إلى ONNX مثل كل شيء آخر.
إسناد الإملاء إلى المُفوْنِم هو الحيلة التي تتيح لنموذج بخمسة عشر مليون معامل أن يبدو جيدًا في لغة شحيحة الموارد لم يرها مكتوبة قط.
إطار عمل لبناء الأصوات، لا لتشغيلها فقط
phoonnx ليس فقط عدة استدلال. إطار العمل
المرافق phoonnx_train هو الطريقة
التي نصنع بها الأصوات في المقام الأول.
يغطي phoonnx_train سلسلة العمل الكاملة:
- المعالجة المسبقة لمجموعة بيانات على نمط LJSpeech إلى بيانات تدريب مُفوْنَمة.
- تدريب مُولِّد VITS (تلك الـ 15.65 مليون معامل تقريبًا) على وحدة معالجة رسومات استهلاكية واحدة أو متوسطة الفئة — نموذج بهذا الصِغَر لا يحتاج إلى عنقود تدريب.
- تصدير نقطة التفتيش المكتملة إلى ONNX عبر سكربت واحد، جاهزة لإسقاطها مباشرةً في
onnxruntimeعلى جهاز.
ولأن الوصفة مفتوحة والنماذج صغيرة، فإن بناء صوت جديد تمامًا للغة لا تملك أي خيار مفتوح دون اتصال هو مشروع بحجم عطلة نهاية أسبوع، لا بحجم منحة بحثية. هكذا كنا نسدّ الفجوات للغات غير المخدومة — الباسكية، والميرانديزية، والبرتغالية الأوروبية وغيرها — بدلًا من انتظار مورّد ليقرر أن لغةً ما مثيرة للاهتمام تجاريًا.
مُدمَج بالفعل في مساعدك
لست مضطرًا إلى لصق أيٍّ من هذا معًا يدويًا. يأتي phoonnx مع إضافة أصيلة لـ
OpenVoiceOS، اسمها ovos-tts-plugin-phoonnx، تجلب الأصوات وتحمّلها نيابةً عنك:
"tts": {
"module": "ovos-tts-plugin-phoonnx",
"ovos-tts-plugin-phoonnx": {
"voice": "OpenVoiceOS/phoonnx_pt-PT_miro_tugaphone"
}
}
اترك voice خارج الإعداد وسيختار أول نموذج يطابق لغتك. ولإدارة الأصوات خارج مساعد
هناك واجهة سطر أوامر، phoonnx-voices، لسرد اللغات، وتصفح الأصوات، وتنزيل النماذج
مسبقًا:
phoonnx-voices list-voices --lang pt-PT
phoonnx-voices download OpenVoiceOS/phoonnx_pt-PT_miro_tugaphone
ولأن phoonnx يتحدث VITS-عبر-ONNX الخالص، فإن محرك الاستدلال الخاص به يشغّل أيضًا أصواتًا مُدرَّبة بواسطة Piper و Mimic3 و Coqui و MMS — أكثر من ألف لغة وصوت في المجموع. زمن تشغيل صغير واحد، وفهرس هائل، ولا شيء منها يتصل بالخارج.
المغزى
على تقنية الصوت التي تحترمك أن تعمل حيث أنت — على عتادك، تحت سيطرتك، وبكابل الشبكة مفصولًا إن شئت. phoonnx هو رهاننا على أن الطريق إلى ذلك ليس نماذج أكبر، بل البنية الصحيحة مصنوعة صغيرة: VITS للعمود الفقري، ومُفوْنِمات ذكية لحمل العبء اللغوي، و ONNX لقابلية النقل، وإطار تدريب مفتوح ليتمكن أي شخص من توسيع الفهرس.
خمسة عشر مليونًا ونصف معامل، تعمل على وحدة المعالجة المركزية، ومُدرَّبة على عتاد يستطيع أي شخص امتلاكه: هذا هو خط أنابيب التدريب خلف كل صوت من phoonnx.