Skip to main content
إجراء نداء واحد إلى /audio/speech سهل. سرد مقالة حقيقية هو حيث تظهر المشكلات المثيرة للاهتمام: تقبل نقطة النهاية 4096 حرفًا كحد أقصى لكل طلب، وكل صوت ينتمي إلى نموذج معيّن، وصيغ الصوت تختلف من نموذج إلى آخر، والنص المكتوب ليُقرأ لا يشبه إطلاقًا النص المكتوب ليُسمع. في هذا الدرس سنعالج الأربعة كلها. النتيجة سكربت يُحوِّل عنوان URL إلى ملف صوتي واحد:
سنقوم بما يلي:
  1. اختيار نموذج وصوت يناسبان السرد الطويل
  2. إجراء طلب كلام واحد وحفظ الصوت
  3. تقسيم مقالة طويلة إلى أجزاء تتّسع لحدّ الأحرف
  4. دمج الأجزاء المُولَّدة في ملف واحد دون طبقات مسموعة
  5. إعادة صياغة المقالة إلى نص يستحق الاستماع
  6. جمع القطع معًا، ثم إلقاء نظرة على البثّ للاستخدام التفاعلي

الإعداد

تحتاج إلى Python 3.9 أو أحدث، وحزمة requests، ومفتاح Venice API.

1. اختر نموذجًا وصوتًا

الأصوات تنتمي إلى نماذج. إرسال صوت من عائلة إلى نموذج من عائلة أخرى هو أشيع الأخطاء الأولى، لذا ابدأ بسرد ما يقبله كل نموذج فعليًا:
model_spec.voices هي القائمة المعتمدة للأصوات في نموذج، ويخبرك supported_formats بقيم response_format التي يقبلها. احذف | length من الاستعلام لطباعة أسماء الأصوات نفسها. سنستخدم tts-xai-v1 مع الصوت eve. يدعم pcm، وهو ما يجعل دمج الأجزاء سهلًا في القسم 4.
سرعة التوليد تتفاوت بين نماذج TTS بشكل أكبر بكثير من جودة المخرجات، والفجوة كبيرة بما يكفي لتغيير معماريتك. قِس زمن طلب واقعي مقابل نموذجين أو ثلاثة قبل أن تلتزم. جزء قد يُعيده نموذج في ثوانٍ قليلة قد يستغرق آخر عدة دقائق.

2. إجراء طلب واحد

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

3. تقسيم النص عند حدّ 4096 حرفًا

يقبل حقل input 4096 حرفًا كحد أقصى. النص الأطول يُرفض بالكامل بدلًا من اقتطاعه بصمت:
لذلك نقسّم المقالة أولًا. التقسيم عند حدود الجُمل مهم، لأن جزءًا ينتهي في منتصف جملة يُنتج تعثّرًا مسموعًا عند نقطة الدمج. أنشئ narrate.py:
على نصٍّ من 5362 حرفًا يُنتج هذا أربعة أجزاء، ينتهي كلٌّ منها عند جملة:
قيمة max_chars الافتراضية 1500 لا شيء قريب من سقف 4096، وذلك بقصد. يزداد وقت التوليد مع طول الإدخال، لذلك تعود الأجزاء الأصغر أسرع، ولأنها تعمل بالتوازي فإنها تُنهي المهمة كاملة أسرع. كما تجعل إعادة المحاولة رخيصة عندما يفشل أحد الطلبات.

4. دمج الأجزاء في ملف واحد

ربط صوتٍ مُشفَّر مثل MP3 غير موثوق، لأن كل جزء يحمل ترويسات إطاراته الخاصة. طلب pcm يتجاوز المشكلة كليًا. PCM عيّنات خام دون حاوية، فالدمج مجرد إلحاق بايتات، ووحدة wave في مكتبة Python القياسية تكتب لنا الترويسة.
جزء واحد يعود بسرعة نسبةً إلى ما يحويه من صوت:
استغرق هذا الطلب نحو 13 ثانية لإنتاج 89 ثانية من الكلام. تشغيل الأجزاء الأربعة على التوازي هو ما يُبقي المجموع معقولًا: استغرق السرد الكامل أدناه 15 ثانية من وقت الساعة. ThreadPoolExecutor.map يُعيد النتائج بالترتيب الذي أُرسلت به المدخلات، لذلك تصل الأجزاء بترتيب القراءة رغم أنها وُلِّدت في الوقت نفسه.
PCM الخام لا يحمل معدّل عيّنة، لذلك عليك أن تُوفّر المعدّل الصحيح عند كتابة ترويسة WAV، وهو خاصٌّ بكل نموذج. tts-xai-v1 يُعيد 24 كيلوهرتز بينما tts-gradium-v1 يُعيد 48 كيلوهرتز. إن أخطأت التخمين، يُشغَّل السرد بسرعة وطبقة صوت خاطئتين.
لمعرفة المعدّل لأي نموذج، اطلب مقطعًا قصيرًا واحدًا بصيغة wav واقرأ الترويسة التي يعود بها:

5. إعداد نصّ يبدو مناسبًا للاستماع

قراءة Markdown مستخرَج حرفيًا شبه غير قابلة للاستماع. عناوين URL أوضح مثال. نموذج الكلام يهجّئها حرفًا حرفًا، فيخرج https://docs.venice.ai/llms.txt هكذا:
h t t p s نقطتان مائلة مائلة docs نقطة venice نقطة a i l l m s نقطة t x t
تسبّب العناوين وعلامات النقاط والجداول وكتل الشيفرة نُسخًا أصغر من المشكلة نفسها. بدلًا من محاربة Markdown بالتعبيرات النمطية، يمكننا أن نطلب من نموذج دردشة إعادة صياغة المقالة كنصٍّ مُعدّ للنطق. أنشئ article_to_audio.py:
يبقى استبدال URL_PATTERN كشبكة أمان للرابط العَرضي الذي قد يتركه النموذج.

6. جمع الأجزاء معًا

نقطة الدخول تستخرج، وتكتب النص، وتحفظه، وتسرده:
حفظ script.txt بجانب الصوت يستحق السطرين. حين يبدو سردٌ خاطئًا، يُظهر النصُّ في الغالب سبب ذلك، ويمكنك إصلاحه دون دفع تكلفة توليد جديدة.
سردٌ قرابة ست دقائق، أُنتج في نحو خمس عشرة ثانية. يفتتح النص الآن بنثرٍ لا بأثاث تصفّح:
Venice مبنيّ على مبدأ بسيط لكنه قوي. خصوصية المستخدم أولًا. تنبع بنية المنصة بكاملها من هذا الالتزام الفلسفي.
للتحقق من سرد دون الاستماع إليه كاملًا، أعِد إرسال الصوت عبر /audio/transcriptions وقارن التفريغ بملف script.txt. تفريغ آخر عشرين ثانية طريقة سريعة للتأكد من دمج الأجزاء بالترتيب الصحيح، ويكشف الأجزاء المفقودة وعناوين URL المُهجّاة في ثوانٍ.

البثّ للاستخدام التفاعلي

السرد الدفعي يُحسِّن الوقت الإجمالي. أما واجهة الصوت التفاعلية فأولويتها معاكسة، وهي إخراج أول صوت بأسرع وقت ممكن. تعيين streaming: true يُعيد الجسم جملةً بجملة أثناء التوليد، بحيث يمكن أن يبدأ التشغيل بعد ثانية تقريبًا بدلًا من انتظار المقطع الكامل.
فضّل pcm على mp3 عندما تُغذّي به مباشرةً Web Audio API في المتصفح أو جهاز صوت، لأنه لا يحتاج إلى خطوة فك تشفير.

خيارات الطلب التي تستحق المعرفة

الأخطاء

بما أن الأجزاء مستقلّة، فإن فشلًا يكلّفك دومًا واحدًا منها فقط، وإعادة استدعاء synthesize لذلك الجزء آمنة دائمًا.

الخطوات التالية

بعض الامتدادات الطبيعية من هنا:

تحويل النص إلى كلام

مرجع لنقطة نهاية الكلام ومعاملاتها.

استنساخ الصوت

اسرد بصوت مخصّص بدلًا من صوت جاهز.

إجابات موثّقة بالمصادر عبر البحث في الويب

ولِّد النص الذي ستسرده هذه الأداة.

تحويل الكلام إلى نص

فرِّغ الصوت للتحقق من سرد كامل من طرف إلى طرف.