ข้ามไปยังเนื้อหาหลัก

การเชื่อมต่อ 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

แพลตฟอร์มที่รองรับ

แพลตฟอร์มBackendหมายเหตุ
NVIDIA GPUCUDAประสิทธิภาพดีที่สุด รองรับ bfloat16
Apple SiliconMPSใช้โมเดล 0.6B เพื่อประหยัดหน่วยความจำ
CPUPyTorchช้ากว่า ควรใช้โมเดล 0.6B
สำหรับผู้ใช้ Apple Silicon

ใช้โมเดลรุ่น customvoice-0.6b บน Mac เพื่อลดแรงกดดันต่อหน่วยความจำ โมเดล 1.7B อาจทำให้ระบบไม่เสถียรบนเครื่องที่มี unified memory 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 เปิดใช้ที่ Settings → Plugins → 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

เพื่อให้เข้ากันได้กับไคลเอ็นต์ OpenAI TTS เซิร์ฟเวอร์จะแมปชื่อเสียงของ OpenAI ดังนี้:

เสียง OpenAIแมปไปยัง
alloyRyan
echoAiden
fableVivian
onyxUncle_Fu
novaSerena
shimmerOno_Anna

เอกสารอ้างอิง API

การสร้างเสียงพูด

Endpoint: 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)

การออกแบบเสียง

Endpoint: 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

การโคลนเสียง

Endpoint: 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

แสดงรายการเสียง

Endpoint: GET /v1/voices

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

ตรวจสถานะ

Endpoint: GET /health

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

การกำหนดค่าเซิร์ฟเวอร์

python server.py [OPTIONS]
ตัวเลือกค่าเริ่มต้นคำอธิบาย
--host0.0.0.0โฮสต์ที่จะ bind
--port8100พอร์ตที่จะ bind
--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 ...

อัปเดต endpoint ของปลั๊กอินใน 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"
}
}
}

ฟีเจอร์สำหรับระบบใช้งานจริง

การทำความสะอาดข้อความ

เซิร์ฟเวอร์จะทำความสะอาดข้อความขาเข้าโดยอัตโนมัติเพื่อป้องกันโมเดลค้าง:

  • ลบ emoji และสัญลักษณ์
  • ลบการจัดรูปแบบ Markdown (*bold*, _italic_ เป็นต้น)
  • ยุบอักขระซ้ำ (FUUUUUFUU)
  • ลบคำกำกับท่าทาง (*(action)*, (whispers))
  • ปรับ whitespace ให้เป็นมาตรฐาน

การแบ่งข้อความ

ข้อความยาวจะถูกแบ่งอัตโนมัติตามขอบเขตประโยค:

  • สูงสุด 500 อักขระต่อส่วน
  • timeout 30 วินาทีต่อส่วน
  • ข้ามส่วนที่ล้มเหลวและทำส่วนที่เหลือต่อ
  • รวมทุกส่วนเป็นการตอบกลับเสียงรายการเดียว

วิธีนี้ป้องกัน timeout ของคำตอบ 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. ตรวจ log เซิร์ฟเวอร์เพื่อดูว่าส่วนใดหมดเวลา
  3. ลองย่อข้อความขาเข้า

เสียงไม่ถูกต้อง

  • พยางค์ซ้ำ: มักเกิดจาก emoji หรืออักขระพิเศษ ตัวทำความสะอาดควรจัดการโดยอัตโนมัติ
  • ภาษาผิด: ตั้งพารามิเตอร์ 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"
}

แหล่งข้อมูล