دليل تحويل النص إلى كلام بالذكاء الاصطناعي محلياً

شغّل أصوات الدردشة على حاسوبك. يحتاج معظم أصحاب البث إلى الأصوات المدمجة فقط.

هل أحتاج هذا؟

تعني «محلي» أحد أمرين: صوت مدمج في SSN يعمل في متصفحك، أو خادم أصوات تشغّله بنفسك.

أريد…افعل هذا
أصوات مجانية بلا تثبيتاستخدم الأصوات المدمجة. يتوقف معظم المستخدمين هنا.
استخدام خادم أصوات أشغّله بالفعلتوصيل خادم.
صوت مستنسخراجع استنساخ الصوت.
Fish Audio في OBSراجع إعداد Fish Audio.
أصوات سحابية مدفوعةراجع مرجع TTS.
يعمل مع أي دردشة يلتقطها SSN. الصوت تابع لمشغّل SSN وليس YouTube أو Twitch. بخلاف تحويل النص إلى كلام في النظام، تولّد أصوات الذكاء الاصطناعي المحلية صوتها بنفسها، فيستطيع OBS التقاطه. مقارنة المزودين والاستماع للعينات.

الأصوات المدمجة (بلا تثبيت)

تعمل هذه داخل SSN في متصفحك. لا خادم ولا Docker ولا مفتاح API.

الصوتالصوتحمل الحاسوبقيمة الرابط
Kokoroممتازمتوسط. أسرع مع GPU.ttsprovider=kokoro
Piperجيد جداًمنخفض. المعالج فقط.ttsprovider=piper
Kittenجيدمنخفض جداً. المعالج فقط.ttsprovider=kitten
eSpeak-NGآليضئيل جداً. المعالج فقط.ttsprovider=espeak

الإعداد في 4 خطوات

  1. أضف &speech=en-US&ttsprovider=kokoro إلى dock.html . (أو piper, kitten, espeak.)
  2. أضف ذلك الرابط إلى OBS بوصفه مصدر المتصفح. هذه هي الصفحة التي تُصدر الصوت.
  3. في خصائصه، فعّل التحكم بالصوت عبر OBS (Control audio via OBS).
  4. أرسل رسالة اختبار قصيرة، مثل Testing local TTS.
dock.html?session=YOUR_SESSION&speech=en-US&ttsprovider=kokoro
أول استخدام بطيء. ينزّل Kokoro وPiper نماذجهما أولاً (نحو 50–200 MB). تعيد مرات التحميل التالية استخدامها لكنها تحتاج لحظة للبدء. يحتفظ OBS بنسخته الخاصة منفصلةً عن Chrome.

الأصوات والسرعة واللغات الأخرى: إعدادات المزود. تفضل النقر؟ استخدم دليل الإعداد.

توصيل خادم TTS الخاص بك

يمنحك الخادم أصواتاً أكثر أو استنساخ صوت أو صوتاً تعيد استخدامه بين الأدوات. يتواصل SSN معه كما يتواصل مع متوافق مع OpenAI . لا تحتاج إلى مفتاح API.

  1. شغّل خادمك. Kokoro-FastAPI هو الأسهل.
  2. في SSN، افتح قائمة مزودي TTS واختر نقطة نهاية مخصصة أو محلية لتحويل النص إلى كلام.
  3. في Custom / Local API Endpoint، أدخل عنوان خادمك، مثل http://127.0.0.1:8880/v1/audio/speech.
  4. اترك مفتاح API فارغاً.
  5. اختر صوتاً يعرفه خادمك: af_bella لـ Kokoro، nova لـ openedai-speech.
  6. انسخ الرابط إلى OBS وأرسل رسالة اختبار.
خريطة بأسلوب لقطة شاشة لحقول تحويل النص إلى كلام المحلي في Social Stream Ninja
حقل endpoint هو المهم.
OBS على حاسوب مختلف؟ اقرأ قاعدة localhost أولاً. المتصفح يحظره؟ استخدم الجسر.
الخادمالنموذجGPUالقرصالمنفذ
Kokoro-FastAPI (موصى به)Kokoro 82Mاختياري~2 GB8880
openedai-speech (Piper)PiperCPU فقط<1 GB8000
kokoro-webKokoro 82Mاختياري~2 GB3000

تحتاج هذه إلى Docker Desktop مثبتاً وقيد التشغيل. وهو مجاني للاستخدام الشخصي.

قاعدة localhost

هذا أكثر الأخطاء شيوعاً.

localhost و 127.0.0.1 يعنيان دائماً «هذا الحاسوب نفسه». إذا كان OBS على حاسوب وخادم الصوت على آخر، 127.0.0.1 في OBS يشير إلى حاسوب OBS.
رسم يوضح أن localhost يعني الجهاز نفسه، بينما يحتاج جهاز آخر إلى عنوان LAN
إعدادكاستخدم هذا العنوان
OBS والخادم على الحاسوب نفسهhttp://127.0.0.1:8880/v1/audio/speech
الخادم على حاسوب آخر في المنزلhttp://192.168.x.x:8880/v1/audio/speech، بعنوان IP المحلي لذلك الحاسوب
اختبار تطبيق SSN يعمل وOBS صامتيحتاج OBS إلى عنوان يعمل لديه. اختبار التطبيق لا يثبت قدرة OBS على الوصول إلى الخادم.

تحقق أيضاً من سماح الجدار الناري بالمنفذ ومن نشر Docker له (-p 8880:8880).

Kokoro-FastAPI

Kokoro-FastAPI يشغّل Kokoro كخادم محلي. يعمل على المعالج ولا يحتاج GPU.

  1. افتح طرفية (Command Prompt أو PowerShell أو Terminal) وشغّل أحد هذه الأوامر:
    docker run -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-cpu:v0.2.2

    بطاقة NVIDIA (أسرع):

    docker run --gpus all -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-gpu:v0.2.0post4
    ينزّل التشغيل الأول نحو 1.5–2 GB مرة واحدة.
  2. افتح http://localhost:8880/web/. ينبغي أن تظهر صفحة لاختبار الأصوات، مع أكثر من 67 صوتاً.
  3. استخدم هذا الرابط (غيّر العنوان إن كان الخادم على حاسوب آخر):
    dock.html?session=YOUR_SESSION&speech=en-US&ttsprovider=customtts&openaiendpoint=http://127.0.0.1:8880/v1/audio/speech&voiceopenai=af_bella
استخدم أسماء أصوات Kokoro، مثل af_bella, af_sarah, am_adam أو bf_emma. أسماء OpenAI مثل nova أو alloy قد لا يعمل.

تشغيله تلقائياً مع Docker:

docker run -d --restart unless-stopped -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-cpu:v0.2.2

openedai-speech (Piper وXTTS-v2)

مشروع مؤرشف. أُرشف openedai-speech في يناير 2026 ويصف نفسه بأنه متقادم في معظمه. ما زال يعمل كمثال لكنه لا يتلقى تحديثات. أبقه محلياً ولا تعرض منفذه للإنترنت؛ فهو بلا تسجيل دخول.

الخيار A: خادم Piper خفيف (CPU)

أقل من 1 GB. لا استنساخ أصوات.

docker run -d --restart unless-stopped -p 8000:8000 ghcr.io/matatonic/openedai-speech-min

الأصوات: alloy, echo, fable, onyx, nova, shimmer.

dock.html?session=YOUR_SESSION&speech=en-US&ttsprovider=openai&openaiendpoint=http://localhost:8000/v1/audio/speech&voiceopenai=nova
تشغيله من المصدر على Windows (أخطاء HTTP 500)

أضف مجلد البيئة الافتراضية Scripts إلى PATH أولاً، وإلا فلن يجد piper.exe أو ffmpeg.exe.

cd openedai-speech
$env:Path = "$PWD\.venv\Scripts;$env:Path"
.\.venv\Scripts\python.exe speech.py --xtts_device none -H 127.0.0.1 -P 8000

الخيار B: استنساخ الصوت XTTS-v2 (GPU)

يحتاج الخادم الكامل وليس openedai-speech-min. خطط لنحو 4 GB من ذاكرة GPU. يعمل المعالج لكنه بطيء.

إعداد XTTS-v2 في 4 خطوات
  1. نزّل الخادم وشغّله:
    git clone https://github.com/matatonic/openedai-speech.git
    cd openedai-speech
    Copy-Item sample.env speech.env
    docker compose up -d
    على macOS أو Linux، استخدم cp sample.env speech.env. يحتاج Docker إلى الوصول إلى GPU. يُنزّل النموذج في أول استخدام.
  2. أنشئ مقطعاً مرجعياً نظيفاً لصوت تملك إذناً باستخدامه. أحادي القناة، 22050 Hz، من 6 إلى 30 ثانية:
    ffmpeg -i input.mp3 -ac 1 -ar 22050 -t 6 -y voices/me.wav
  3. في config/voice_to_speaker.yaml، أضفه تحت القسم الموجود tts-1-hd (احتفظ بالأصوات الموجودة):
    tts-1-hd:
      me:
        model: xtts
        speaker: voices/me.wav
        language: en
    غيّر me إلى الاسم الذي سيرسله SSN.
  4. شغّل docker compose restart، ثم استخدم:
    dock.html?session=YOUR_SESSION&speech=en-US&ttsprovider=customtts&openaiendpoint=http://127.0.0.1:8000/v1/audio/speech&openaimodel=tts-1-hd&voiceopenai=me&openaiformat=wav
openaimodel=tts-1-hd مطلوب. بدونه يرسل SSN tts-1، فيستخدم الخادم Piper بدلاً منه. voiceopenai يجب أن يطابق اسم الصوت في ملف YAML.

المتصفح يحظره؟ شغّل الجسر وغيّر فقط openaiendpoint إلى http://127.0.0.1:8124/v1/audio/speech.

جسر TTS المحلي

أداة صغيرة من SSN. تستقبل طلب SSN وتمرره إلى خادم الصوت ثم تعيد الصوت بطريقة تقبلها المتصفحات. تتطلب Node.js.

أبسط قاعدة: شغّل الجسر على حاسوب OBS. عندها يستخدم OBS دائماً http://127.0.0.1:8124/v1/audio/speech، حتى لو كان خادم الصوت على حاسوب آخر.
رسم يوضح استدعاء OBS للجسر المحلي واستدعاء الجسر لخادم تحويل النص إلى كلام
  1. أخبر الجسر بمكان خادمك. PowerShell:
    $env:SSN_TTS_TARGET="http://127.0.0.1:8880/v1/audio/speech"
    الخادم على حاسوب آخر؟ استخدم عنوان IP المحلي له، مثل http://192.168.x.x:8880/v1/audio/speech.
  2. في مجلد SSN، شغّل node scripts/local-tts-bridge.cjs. أبقِه قيد التشغيل.
  3. وجّه SSN إلى الجسر:
    dock.html?session=YOUR_SESSION&speech=en-US&ttsprovider=customtts&openaiendpoint=http://127.0.0.1:8124/v1/audio/speech&voiceopenai=af_bella

macOS/Linux، في سطر واحد: SSN_TTS_TARGET="http://127.0.0.1:8880/v1/audio/speech" node scripts/local-tts-bridge.cjs. داخل local-tts-bridge ، node server.cjs يفعل الشيء نفسه. غيّر المنفذ باستخدام SSN_TTS_BRIDGE_PORT=8125. جميع الخيارات: ملف README للجسر.

وضع GPT-SoVITS

يستخدم GPT-SoVITS واجهته الخاصة /tts . يترجم الجسر الطلبات له.

$env:SSN_TTS_REF_AUDIO_PATH="C:\voices\speaker.wav"
$env:SSN_TTS_REF_TEXT="Reference audio transcript here."
$env:SSN_TTS_TARGET="http://127.0.0.1:9880/tts"
node scripts/local-tts-bridge.cjs --mode gptsovits
dock.html?session=YOUR_SESSION&speech=en-US&ttsprovider=customtts&openaiendpoint=http://127.0.0.1:8124/v1/audio/speech&openaiformat=wav
وضع خادم F5-TTS

تستخدم بعض طبقات F5-TTS /synthesize_speech/?text=...&voice=.... يترجم الجسر الطلبات لها.

$env:SSN_TTS_TARGET="http://127.0.0.1:7860/synthesize_speech/"
node scripts/local-tts-bridge.cjs --mode f5
dock.html?session=YOUR_SESSION&speech=en-US&ttsprovider=customtts&openaiendpoint=http://127.0.0.1:8124/v1/audio/speech&voiceopenai=default_en&openaiformat=wav

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

الاستنساخ ليس إعداداً في SSN بل ميزة في بعض خوادم الصوت. يرسل SSN نص الدردشة ويختار الخادم الصوت المستنسخ.

  1. سجّل مقطعاً واضحاً لمتحدث واحد، عادةً من 3 إلى 30 ثانية، مع ضجيج خلفية قليل.
  2. تحتاج بعض الخوادم أيضاً النص المطابق تماماً للكلام في المقطع.
  3. يحول الخادم المقطع إلى ملف تعريف صوت.
  4. يرسل SSN نص الدردشة باستخدام ttsprovider=customtts.
  5. يعيد الخادم صوتاً، عادةً WAV أو MP3، ويشغّله SSN.
استنسخ فقط أصواتاً تملكها أو لديك إذن باستخدامها.
XTTS-v2 غير تجاري افتراضيًا. خيار ترخيص Coqui Public Model License يسمح بالاستخدام غير التجاري فقط. قد لا يكون البث الذي يحقق دخلاً مؤهلاً. تحقق من الترخيص أو احصل على إذن أولاً.

إذا كانت ذاكرة GPU لديك 6 GB أو أقل، ابدأ بنماذج صغيرة على خوادم متوافقة مع OpenAI. تعمل النماذج الأكبر أيضاً إذا استُضيفت في مكان آخر.

الخياريستنسخ منيناسب GPU بذاكرة 6 GB؟كيفية الاتصال
XTTS-v2 / openedai-speechمقطع WAV قصيرنعم، نحو 4 GBمباشرةً، /v1/audio/speech. المشروع مؤرشف.
chatterbox-tts-api / Chatterbox-TTS-Serverمقطع مرجعيعلى الأرجح مع Turbo أو مقاطع صغيرةمباشرةً أو عبر الجسر. GPU أكثر سلاسة من المعالج، ويختلف الإعداد حسب النسخة المتفرعة.
Qwen3-TTS (0.6B / 1.7B)مقطع 3 ثوانٍعلى الأرجح (0.6B Base)يحتاج طبقة توافق مع OpenAI.
GPT-SoVITS5 ثوانٍ؛ أفضل مع دقيقة واحدةعلى الأرجح مع fp16 / تثبيت خفيفالجسر --mode gptsovits.
F5-TTSمقطع مع نصهربماطبقة توافق أو جسر --mode f5 مع F5-TTS_server.
MisoTTS 8Bصوت مرجعيلا؛ يُوصى بـ 24 GBاستضافة بعيدة فقط. لا توجد نقطة اتصال REST محلية في المستودع.

Kokoro المدمج وKokoro-FastAPI لا يستنسخان الأصوات.

ما اختُبر مع SSN

اختُبر بكليهما dock.html و featured.html:

  • openedai-speech (Piper): كلام فعلي على المعالج، مباشرةً وعبر الجسر.
  • Chatterbox-TTS-Server: كلام فعلي على المعالج باستخدام Emily.wav، مباشرة وعبر الجسر.
  • chatterbox-tts-api: اختُبرت صيغة الطلب مباشرةً وعبر الجسر.
  • GPT-SoVITS و F5-TTS_server: عبر أوضاع الجسر فقط.
  • F5-TTS الرسمي و Qwen3-TTS: تحتاج طبقة توافق أولاً (CLI أو Gradio أو مكتبة فقط).

ما الحاسوب الذي أحتاجه؟

تقديرات أولية لا ضمانات. يغير حجم النموذج وطول النص والتطبيقات الأخرى استهلاك الذاكرة.

الخيارالحد الأدنىمناسب
تحويل النص إلى كلام في النظام / eSpeakأي جهاز PCأي جهاز PC
Kitten المدمجCPU منخفض المواصفات، و4 GB من RAMمعالج حاسوب محمول و8 GB RAM
Piper المدمجمعالج حديث و4–8 GB RAMCPU حديث، و8 GB من RAM
Kokoro المدمجCPU حديث، و8 GB من RAMGPU يدعم WebGPU أو معالج سريع، و8–16 GB RAM
Kokoro-FastAPICPU، و8 GB من RAMNVIDIA GPU اختياري، و8–16 GB RAM
openedai-speech Piperمعالج و4–8 GB RAMCPU، و8 GB من RAM
openedai-speech XTTSNVIDIA GPU بنحو 4 GB، و8–16 GB RAMGPU من NVIDIA بذاكرة 6 GB+، و16 GB من RAM
Chatterboxالمعالج في بعض الإصدارات، بطيءGPU من NVIDIA بذاكرة 6 GB+، و16 GB من RAM
GPT-SoVITS / F5-TTS / Qwen3-TTSالمعالج للاختبار، بطيءGPU من NVIDIA بذاكرة 6 GB+، و16 GB من RAM
MisoTTS 8Bليس مع 6 GBGPU بذاكرة 24 GB أو مضيف بعيد

إدخال الصوت إلى OBS

OBS Browser Source (موصى به)

يعمل مع الأصوات المدمجة وخادمك الخاص.

  1. أضف مصدر المتصفح باستخدام dock.html لـ TTS.
  2. فعّل التحكم بالصوت عبر OBS (Control audio via OBS).
  3. انقر على موافق. يظهر TTS الآن في مازج OBS.

تطبيق سطح المكتب SSN

يستخدم تطبيق سطح المكتب إعدادات الرابط نفسها، لكن الصوت يخرج من التطبيق لا OBS. التقطه باستخدام صوت سطح المكتب أو التقاط إدخال الصوت (Audio Input Capture). لفصل TTS عن الأصوات الأخرى، وجّه التطبيق إلى كابل افتراضي: خطوات توجيه الصوت.

لا تخلط بين اختبار التطبيق وOBS. الضغط على Test في التطبيق يختبر من التطبيق. عند استخدام رابط في OBS، يجب أن يصل OBS إلى الخادم ويشغّل الصوت.
تفاصيل إضافية لتطبيق سطح المكتب

نوافذ التطبيق أقل تشدداً بشأن أذونات المتصفح CORS من Chrome. يظل الجسر الخيار الأضمن للخوادم التي ترفض طلبات المتصفح. لـ Kokoro المدمج، يستطيع التطبيق استخدام ninjafy.tts بدلاً من تحميل النموذج داخل المتصفح.

تحويل النص إلى كلام في النظام (&speech=en-US دون مزود) يعتمد على الأصوات المتوفرة في OBS. غالباً لا توجد أصوات أو توجد أصوات لا تُنتج خرجاً قابلاً للالتقاط. استخدم أحد المزودين أعلاه بدلاً منه.

مقارنة متجاورة

الخيارالإعدادالجودةخاصيعمل في OBSالتكلفة
Kokoro المدمجلا شيء5/5نعمنعممجاني
Piper المدمجلا شيء4/5نعمنعممجاني
Kitten المدمجلا شيء3/5نعمنعممجاني
eSpeak المدمجلا شيء2/5نعمنعممجاني
Kokoro-FastAPIDocker5/5نعمنعممجاني
openedai-speechDocker4/5نعمنعممجاني
ElevenLabsمفتاح API (API key)5/5لانعمخطط مدفوعة
تحويل النص إلى كلام في النظاملا شيء2/5نعميحتاج توجيه الصوتمجاني

حل المشكلات

قائمة تحقق بأسلوب لقطة شاشة لحل مشكلات تحويل النص إلى كلام المحلي
يعمل في مكان دون آخر؟ افحص بالترتيب: الحاسوب والعنوان والصوت وأذونات المتصفح وصوت OBS.
المشكلةجرّب هذا
اختبار التطبيق يعمل وOBS صامتيجب أن يصل OBS إلى الخادم بنفسه. الخادم على حاسوب آخر؟ استبدل 127.0.0.1 بعنوان IP المحلي له. تحقق من التحكم بالصوت عبر OBS (Control audio via OBS). ما زال محظوراً؟ شغّل الجسر على حاسوب OBS.
تُقرأ أولى الحروف أو الكلمات فقطإزالة (Remove) ttsquick من رابط OBS (مثلاً &ttsquick=14) وحدّث. أثناء الاختبار، أزل أيضاً typewriter= لاستبعاد مشكلات التوقيت.
الخادم لا يستجيبتأكد من تشغيل Docker والحاوية. على حاسوب الخادم، افتح http://127.0.0.1:8880/web/ (Kokoro-FastAPI أو منفذ خادمك). من حاسوب OBS، افتح http://SERVER_LAN_IP:8880/web/. إذا فشل، فلن يصل إليه OBS أيضاً. تحقق من جدار الخادم الناري.
«Blocked by CORS» أو «private network» أو «failed fetch»حظره المتصفح قبل وصوله إلى الخادم. شغّل node scripts/local-tts-bridge.cjs على حاسوب OBS واستخدم http://127.0.0.1:8124/v1/audio/speech. صفحة Dock المستضافة على beta أكثر عرضة للحظر؛ الجسر أو نافذة التطبيق المحلي أسهل.
صوت غير صحيح أو غير موجودKokoro-FastAPI: af_bella, af_sarah, am_adam، أو صوتاً من صفحته. openedai-speech: nova, echo, alloy. تراعي بعض الخوادم حالة الأحرف.
الصوت يعمل لكن OBS لا يلتقطهفعّل التحكم بالصوت عبر OBS (Control audio via OBS). راقب عداد مازج OBS خلال الاختبار. تأكد من ضبط &ttsprovider=؛ قد يحتاج System TTS إلى صوت سطح المكتب أو كابل افتراضي.
لم يُعثر على صورة Dockerتتغير وسوم الصور. تحقق من الوسم الحالي على Kokoro-FastAPI أو openedai-speech.

لمطوري الخوادم

كيف يتواصل SSN مع خادم مخصص. تحتاج هذا فقط إذا كنت تبني خادماً أو تشخّصه.

chat text -> SSN -> your endpoint (or the bridge) -> TTS server -> audio -> SSN plays it
ما يرسله SSN

مع ttsprovider=customtts, localtts أو openai، يرسل SSN طلب JSON POST:

POST /v1/audio/speech
{
  "model": "tts-1",
  "input": "Chat message text",
  "voice": "af_bella",
  "response_format": "mp3",
  "speed": 1.0
}

عندما لا يُضبط مفتاح API، لا يرسل SSN ترويسة Authorization.

ما يستطيع SSN تشغيله
الاستجابةهل يعمل؟ملاحظات
ملف صوتينعمالأفضل. audio/mpeg, audio/wav, audio/ogg, audio/aac، أو أي نوع صوت يستطيع المتصفح تشغيله.
JSON يتضمن عنوان صوتنعمفحوص url, audio_url, output_url, data.url، وأول data[] .
JSON مع صوت بترميز base64نعمفحوص audio, audio_data, audioContent, b64_json، والقيمة المتداخلة data ، وعناوين URL للبيانات.
PCM خامفقط عند استخدام غلافأرسله كملف WAV أو WAV بترميز base64.

الصيغ: mp3 صغير ومدعوم على نطاق واسع. wav يناسب خوادم الاستنساخ واختبار الجسر. استخدم opus فقط إذا دعمه الخادم والمتصفح معاً.

لا بث متتابع بعد. ينتظر SSN الاستجابة كاملة ثم يشغّلها. أبقِ رسائل الدردشة قصيرة.

إعدادات الرابط لخادمك
الإعدادمثالما الذي يفعله
ttsprovidercustomttsاستخدم خادمك الخاص. (openai يعمل أيضاً.)
openaiendpointhttp://localhost:8880/v1/audio/speechعنوان خادمك. غيّر المنفذ ليطابقه.
speechen-USيفعّل TTS بالإنجليزية.
voiceopenaiaf_bellaاسم الصوت. يعتمد على الخادم.
openaimodeltts-1-hdاسم النموذج. الافتراضي tts-1.
openaiformatmp3mp3 أو wav أو opus أو flac.
openaispeed1.0سرعة الكلام (0.5–2.0).

مقبول أيضاً: customttsendpoint, localttsendpoint, customttsvoice, localttsvoice, customttsmodel, localttsmodel, customttsformat, localttsformat. خيارات القراءة مثل simpletts, skipmessages و ttsquick تعمل مع أي مزود: جميع إعدادات الروابط.

روابط مثال:

Kokoro-FastAPI:  dock.html?session=YOUR_SESSION&speech=en-US&ttsprovider=customtts&openaiendpoint=http://localhost:8880/v1/audio/speech&voiceopenai=af_bella&openaispeed=1.1
openedai-speech: dock.html?session=YOUR_SESSION&speech=en-US&ttsprovider=customtts&openaiendpoint=http://localhost:8000/v1/audio/speech&voiceopenai=nova
kokoro-web:      dock.html?session=YOUR_SESSION&speech=en-US&ttsprovider=customtts&openaiendpoint=http://localhost:3000/api/v1/audio/speech&voiceopenai=af_bella