إنتقل إلى المحتوى الرئيسي

تكامل Qwen3-TTS

شغّل Qwen3-TTS من Alibaba محليًا لتحويل النص إلى كلام متعدد اللغات وعالي الجودة. يغطي هذا الدليل إعداد خادم TTS المتوافق مع OpenAI والمضمّن مع Libre WebUI.

نظرة عامة

Qwen3-TTS نظام متقدم لتحويل النص إلى كلام يوفر:

  • 9 أصوات جاهزة تغطي الإنجليزية والصينية واليابانية والكورية
  • دعم 10 لغات تشمل الألمانية والفرنسية والإسبانية والإيطالية والبرتغالية والروسية
  • استنساخ الصوت من عينات صوتية مدتها 3 ثوانٍ
  • تصميم الصوت باستخدام أوصاف بلغة طبيعية
  • تحكم بالتعليمات في العاطفة والتنغيم

يلف الخادم المضمّن Qwen3-TTS بواجهة API متوافقة مع OpenAI، مما يتيح لـ Libre WebUI استخدامه عبر نظام المكوّنات الإضافية القياسي.

المتطلبات

المكوّنالحد الأدنىالموصى به
Python3.12+3.12 (لا 3.14)
GPU VRAM4GB (نماذج 0.6B)8GB+ (نماذج 1.7B)
RAM8GB16GB+
القرص5GB10GB

دعم المنصات

المنصةالمحركملاحظات
GPU من NVIDIACUDAأفضل أداء، مع دعم bfloat16
Apple SiliconMPSاستخدم نماذج 0.6B لكفاءة الذاكرة
CPUPyTorchأبطأ؛ استخدم نماذج 0.6B
لمستخدمي Apple Silicon

استخدم نسخة النموذج customvoice-0.6b على Mac لتجنب ضغط الذاكرة. قد تسبب نماذج 1.7B عدم استقرار النظام على الأجهزة ذات 16GB من الذاكرة الموحدة.

البدء السريع

1. تثبيت الخادم

cd examples/qwen-tts-server

# Create virtual environment (Python 3.12 required)
python3.12 -m venv venv
source venv/bin/activate # Linux/macOS
# or: venv\Scripts\activate # Windows

# Install dependencies
pip install -r requirements.txt

2. تشغيل الخادم

# NVIDIA GPU (recommended)
python server.py --model customvoice-1.7b

# Apple Silicon
python server.py --model customvoice-0.6b

# CPU (slower)
python server.py --model customvoice-0.6b

يعمل الخادم افتراضيًا على http://localhost:8100.

3. ضبط Libre WebUI

المكوّن الإضافي مضبوط مسبقًا في plugins/qwen-tts.json. فعّله من الإعدادات ← المكوّنات الإضافية ← Qwen3 TTS.

4. اختباره

curl http://localhost:8100/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"model": "qwen3-tts", "input": "Hello, welcome to Libre WebUI!", "voice": "Ryan"}' \
--output speech.wav

النماذج المتاحة

النموذجالحجمالاستخدام
customvoice-1.7b~3.5GBأصوات جاهزة مع تحكم بالتعليمات
customvoice-0.6b~1.5GBنسخة خفيفة لسعة VRAM المحدودة
voicedesign-1.7b~3.5GBإنشاء أصوات من أوصاف نصية
base-1.7b~3.5GBاستنساخ صوت من عينات مدتها 3 ثوانٍ
base-0.6b~1.5GBاستنساخ صوت خفيف

الأصوات

الأصوات الجاهزة (نماذج CustomVoice)

الصوتاللغةالوصف
Ryanالإنجليزيةذكوري، واضح وطبيعي
Aidenالإنجليزيةذكوري، بنبرة دافئة
Vivianالصينيةأنثوي، احترافي
Serenaالصينيةأنثوي، ودود
Uncle_Fuالصينيةذكوري، ناضج
Dylanالصينيةذكوري، بلهجة بكين
Ericالصينيةذكوري، بلهجة سيتشوان
Ono_Annaاليابانيةأنثوي
Soheeالكوريةأنثوي

أسماء OpenAI البديلة للأصوات

للتوافق مع عملاء TTS لـ OpenAI، يطابق الخادم أسماء أصوات OpenAI كما يلي:

صوت OpenAIيطابق
alloyRyan
echoAiden
fableVivian
onyxUncle_Fu
novaSerena
shimmerOno_Anna

مرجع API

توليد الكلام

نقطة النهاية: POST /v1/audio/speech

{
"model": "qwen3-tts",
"input": "Text to convert to speech",
"voice": "Ryan",
"response_format": "wav",
"instruct": "Speak with enthusiasm",
"language": "English"
}
المعلمةالنوعالافتراضيالوصف
modelstringqwen3-ttsمعرّف النموذج
inputstringمطلوبالنص المراد توليده (10,000 حرف كحد أقصى)
voicestringryanاسم الصوت (راجع الجدول أعلاه)
response_formatstringwavتنسيق الصوت (لا يُدعم سوى wav)
instructstring""تعليمة العاطفة أو التنغيم
languagestringكشف تلقائيتجاوز اكتشاف اللغة

الاستجابة: ملف صوتي (audio/wav)

تصميم الصوت

نقطة النهاية: POST /v1/audio/voice-design

أنشئ أصواتًا مخصصة من أوصاف بلغة طبيعية.

{
"model": "qwen3-tts-voicedesign",
"input": "Welcome to our service.",
"voice_description": "A warm, friendly female voice with a slight British accent",
"language": "English"
}
ملاحظة

يتطلب تحميل نموذج voicedesign-1.7b.

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

نقطة النهاية: POST /v1/audio/voice-clone

استنسخ صوتًا من عينة صوتية مدتها 3 ثوانٍ أو أكثر.

curl -X POST http://localhost:8100/v1/audio/voice-clone \
-F "input=Hello, this is my cloned voice." \
-F "reference_audio=@reference.wav" \
-F "reference_text=This is what was said in the reference." \
--output cloned.wav
المعلمةالنوعالوصف
inputstringالنص المراد توليده
reference_audiofileعينة صوتية مدتها 3 ثوانٍ أو أكثر
reference_textstringنص التسجيل المرجعي
ملاحظة

يتطلب تحميل نموذج base-1.7b أو base-0.6b.

سرد الأصوات

نقطة النهاية: GET /v1/voices

{
"voices": [
{"id": "ryan", "name": "Ryan", "language": "English"},
{"id": "aiden", "name": "Aiden", "language": "English"},
...
]
}

فحص الصحة

نقطة النهاية: GET /health

{ "status": "healthy", "model_loaded": true }

ضبط الخادم

python server.py [OPTIONS]
الخيارالافتراضيالوصف
--host0.0.0.0المضيف الذي يرتبط به
--port8100المنفذ الذي يرتبط به
--modelcustomvoice-1.7bنسخة النموذج المراد تحميلها

الوصول عبر الشبكة

للوصول إلى الخادم من أجهزة أخرى على شبكتك:

# Start server on all interfaces
python server.py --host 0.0.0.0 --port 8100

# Access from another machine
curl http://192.168.1.100:8100/v1/audio/speech ...

حدّث نقطة نهاية المكوّن في plugins/qwen-tts.json:

{
"endpoint": "http://192.168.1.100:8100/v1/audio/speech",
"capabilities": {
"tts": {
"endpoint": "http://192.168.1.100:8100/v1/audio/speech"
}
}
}

ميزات الإنتاج

تنقية النص

ينقّي الخادم نص الإدخال تلقائيًا لمنع النموذج من التعليق:

  • يزيل الرموز التعبيرية والرموز
  • يزيل تنسيق markdown ‏(*bold* و_italic_ وغيرهما)
  • يختصر الأحرف المتكررة (FUUUUUFUU)
  • يزيل تعليمات الأداء (*(action)* و(whispers))
  • يطبّع المسافات

تقسيم النص

يُقسَّم النص الطويل تلقائيًا عند حدود الجمل:

  • 500 حرف كحد أقصى لكل جزء
  • مهلة 30 ثانية لكل جزء
  • تُتجاوز الأجزاء الفاشلة وتستمر بقية الأجزاء
  • تُدمج الأجزاء في استجابة صوتية واحدة

يمنع ذلك انتهاء مهلة ردود AI الطويلة مع الحفاظ على تدفق كلام طبيعي.

إعداد متعدد وحدات GPU

في الأنظمة متعددة وحدات GPU، يفرض الخادم التنفيذ على GPU واحدة لتجنب عدم تطابق أجهزة tensor:

device_map = {"": "cuda:0"} # Uses first GPU only

لاستخدام GPU محددة:

CUDA_VISIBLE_DEVICES=1 python server.py --model customvoice-1.7b

استكشاف الأخطاء وإصلاحها

فشل تنزيل النموذج

يُنزَّل النموذج من Hugging Face عند أول تشغيل. إذا فشل:

# Set Hugging Face token for gated models
export HF_TOKEN=hf_...

# Or download manually
huggingface-cli download Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice

نفاد الذاكرة (Apple Silicon)

RuntimeError: MPS backend out of memory

استخدم نسخة النموذج الأصغر:

python server.py --model customvoice-0.6b

نفاد ذاكرة CUDA

torch.cuda.OutOfMemoryError: CUDA out of memory
  1. أغلق التطبيقات الأخرى التي تستخدم GPU
  2. استخدم نسخة النموذج 0.6B
  3. اخفض حجم الجزء في server.py ‏(max_chunk_size=300)

انتهاء مهلة الخادم

إذا انتهت مهلة التوليد مع نص طويل:

  1. يقسّم الخادم النص تلقائيًا ويواصل بالأجزاء المتبقية
  2. افحص سجلات الخادم لمعرفة الأجزاء التي انتهت مهلتها
  3. فكّر في تقصير نص الإدخال

الصوت غير صحيح

  • مقاطع متكررة: تسببها عادةً الرموز التعبيرية أو الأحرف الخاصة. يفترض أن يعالجها المنقّي تلقائيًا.
  • لغة خاطئة: اضبط معلمة language صراحةً في الطلب.
  • وقفات غير طبيعية: قد يُقسّم النص عند حدود خاطئة. تحقق من علامات ترقيم غير مألوفة.

ضبط المكوّن الإضافي

المكوّن المضمّن (plugins/qwen-tts.json):

{
"id": "qwen-tts",
"name": "Qwen3 TTS",
"type": "tts",
"endpoint": "http://localhost:8100/v1/audio/speech",
"auth": {
"header": "",
"key_env": ""
},
"model_map": [
"qwen3-tts",
"qwen3-tts-customvoice",
"qwen3-tts-voicedesign",
"qwen3-tts-clone"
],
"capabilities": {
"tts": {
"endpoint": "http://localhost:8100/v1/audio/speech",
"model_map": [
"qwen3-tts",
"qwen3-tts-customvoice",
"qwen3-tts-voicedesign",
"qwen3-tts-clone"
],
"config": {
"voices": [
"Ryan",
"Aiden",
"Vivian",
"Serena",
"Uncle_Fu",
"Dylan",
"Eric",
"Ono_Anna",
"Sohee"
],
"default_voice": "Ryan",
"formats": ["wav"],
"default_format": "wav",
"max_characters": 10000,
"supports_streaming": false,
"no_auth_required": true
}
}
},
"description": "Qwen3-TTS local TTS server (NVIDIA CUDA, Apple MPS, or CPU)",
"documentation_url": "https://github.com/QwenLM/Qwen3-TTS"
}

الموارد