การผสาน Kyutai TTS
รันโมเดล TTS ของ Kyutai ในเครื่องเพื่อแปลงข้อความเป็นเสียงคุณภาพสูง คู่มือนี้ครอบคลุมทั้ง Pocket TTS (CPU) และ TTS 1.6B (GPU) พร้อมเซิร์ฟเวอร์ที่เข้ากันได้กับ OpenAI ซึ่งรวมอยู่ใน Libre WebUI
ภาพรวม
Kyutai มีโมเดล TTS สองแบบ:
| โมเดล | พารามิเตอร์ | อุปกรณ์ | เหมาะสำหรับ |
|---|---|---|---|
| Pocket TTS | 100M | CPU เท่านั้น | แล็ปท็อปและสภาพแวดล้อมทรัพยากรน้อย |
| TTS 1.6B | 1.6B | GPU/MPS/CPU | เซิร์ฟเวอร์และการสังเคราะห์คุณภาพสูง |
ทั้งสองใช้เฟรมเวิร์ก CALM (Continuous Audio Language Models) และรองรับการโคลนเสียงจากตัวอย่างเสียง
Pocket TTS (CPU)
TTS น้ำหนักเบาที่ทำงานแบบเรียลไทม์บน CPU โดยไม่ต้องใช้ GPU
ข้อกำหนด
| ส่วนประกอบ | ขั้นต่ำ |
|---|---|
| Python | 3.10 - 3.14 |
| PyTorch | 2.5+ |
| RAM | 4GB |
| Disk | 500MB |
เริ่มต้นอย่างรวดเร็ว
cd examples/kyutai-tts-server
# Create virtual environment
python3 -m venv venv
source venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Start server
python server.py
เซิร์ฟเวอร์ทำงานที่ http://localhost:8200
ทดสอบ
curl http://localhost:8200/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"model": "kyutai-tts", "input": "Hello, welcome to Libre WebUI!", "voice": "alba"}' \
--output speech.wav
เสียง
| เสียง | คำอธิบาย |
|---|---|
| Alba | หญิง ชัดเจนและเป็นธรรมชาติ |
| Marius | ชาย โทนอุ่น |
| Javert | ชาย น่าเชื่อถือ |
| Jean | ชาย นุ่มนวล |
| Fantine | หญิง อ่อนโยน |
| Cosette | หญิง อายุน้อย |
| Eponine | หญิง มีอารมณ์ |
| Azelma | หญิง สดใส |
ประสิทธิภาพ
- เร็วกว่าระยะเวลาจริงประมาณ 6 เท่าบน MacBook Air M4
- ความหน่วงประมาณ 200ms สำหรับส่วนเสียงแรก
- ใช้ CPU เพียง 2 คอร์
TTS 1.6B (GPU)
TTS คุณภาพสูงพร้อมการเร่ง GPU เลือกอุปกรณ์อัตโนมัติ: CUDA > MPS > CPU
ข้อกำหนด
| ส่วนประกอบ | ขั้นต่ำ | แนะนำ |
|---|---|---|
| Python | 3.10+ | 3.12 |
| GPU VRAM | 6GB | 8GB+ |
| RAM | 8GB | 16GB+ |
| Disk | 4GB | 8GB |
การรองรับแพลตฟอร์ม
| แพลตฟอร์ม | Backend | หมายเหตุ |
|---|---|---|
| NVIDIA GPU | CUDA | ประสิทธิภาพดีที่สุด รองรับ bfloat16 |
| Apple Silicon | MPS | ใช้ float16 |
| CPU | PyTorch | ช้ากว่า ใช้ float32 |
เริ่มต้นอย่างรวดเร็ว
cd examples/kyutai-tts-1.6b-server
# Create virtual environment
python3 -m venv venv
source venv/bin/activate
# Install PyTorch with CUDA (for NVIDIA GPUs)
pip install torch --index-url https://download.pytorch.org/whl/cu121
# Install dependencies
pip install -r requirements.txt
# Start server (auto-detects GPU)
python server.py
เซิร์ฟเวอร์ทำงานที่ http://localhost:8201
การเลือกอุปกรณ์
# Auto-detect (CUDA > MPS > CPU)
python server.py
# Force specific device
python server.py --device cuda
python server.py --device mps
python server.py --device cpu
ทดสอบ
curl http://localhost:8201/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"model": "kyutai-tts-1.6b", "input": "Hello from the GPU!", "voice": "alba"}' \
--output speech.wav
เสียง
Alba MacKenna (CC BY 4.0):
| เสียง | รูปแบบ |
|---|---|
alba / alba-casual | การสนทนาสบาย ๆ |
alba-merchant | ตัวละครพ่อค้า |
alba-announcer | รูปแบบผู้ประกาศ |
Expresso (CC BY-NC 4.0 - non-commercial):
| เสียง | อารมณ์ |
|---|---|
expresso-happy | มีความสุข |
expresso-sad | เศร้า |
expresso-angry | โกรธ |
VCTK (CC BY 4.0):
vctk-p225,vctk-p226,vctk-p227,vctk-p228
การโคลนเสียง
เซิร์ฟเวอร์ทั้งสองรองรับการโคลนเสียงจากไฟล์เสียง
Pocket TTS
# From local file
curl http://localhost:8200/v1/audio/voice-clone \
-F "input=Hello from a cloned voice" \
-F "reference_audio=@my_voice.wav" \
--output cloned.wav
# From HuggingFace URL
curl http://localhost:8200/v1/audio/voice-clone-url \
-H "Content-Type: application/json" \
-d '{
"input": "Hello world!",
"voice_url": "hf://kyutai/tts-voices/alba-mackenna/casual.wav"
}' \
--output speech.wav
TTS 1.6B
ส่งเส้นทางเสียง HuggingFace ใด ๆ เป็นพารามิเตอร์ voice:
curl http://localhost:8201/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"model": "kyutai-tts-1.6b",
"input": "Custom voice synthesis",
"voice": "hf://kyutai/tts-voices/vctk/p230.wav"
}' \
--output speech.wav
เอกสารอ้างอิง API
การสร้างเสียงพูด
Endpoint: POST /v1/audio/speech
{
"model": "kyutai-tts",
"input": "Text to convert to speech",
"voice": "alba",
"response_format": "wav",
"stream": false
}
| พารามิเตอร์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
model | string | แตกต่าง | kyutai-tts หรือ kyutai-tts-1.6b |
input | string | ต้องระบุ | ข้อความที่ต้องสังเคราะห์ (สูงสุด 10,000 อักขระ) |
voice | string | alba | ชื่อเสียงหรือเส้นทาง HuggingFace |
response_format | string | wav | รูปแบบเสียง (รองรับเฉพาะ wav) |
stream | boolean | false | เปิด streaming (เฉพาะ Pocket TTS) |
cfg_coef | float | 2.0 | การนำทางแบบไม่ใช้ classifier (เฉพาะ 1.6B) |
การตอบกลับ: ไฟล์เสียง (audio/wav)
นามแฝงเสียง OpenAI
เพื่อให้เข้ากันได้กับไคลเอนต์ OpenAI TTS:
| เสียง OpenAI | Pocket TTS | TTS 1.6B |
|---|---|---|
alloy | alba | alba |
echo | marius | vctk-p225 |
fable | cosette | expresso-happy |
onyx | javert | vctk-p226 |
nova | fantine | alba-announcer |
shimmer | eponine | alba-merchant |
แสดงรายการเสียง
Endpoint: GET /v1/voices
ตรวจสุขภาพ
Endpoint: GET /health
การกำหนดค่า plugin
Pocket TTS
เปิดใน การตั้งค่า > Plugin > Kyutai TTS
ไฟล์ plugin: plugins/kyutai-tts.json
{
"id": "kyutai-tts",
"name": "Kyutai TTS",
"type": "tts",
"endpoint": "http://localhost:8200/v1/audio/speech",
"capabilities": {
"tts": {
"config": {
"voices": [
"Alba",
"Marius",
"Javert",
"Jean",
"Fantine",
"Cosette",
"Eponine",
"Azelma"
],
"default_voice": "Alba",
"supports_streaming": true,
"no_auth_required": true
}
}
}
}
TTS 1.6B
เปิดใน การตั้งค่า > Plugin > Kyutai TTS 1.6B
ไฟล์ plugin: plugins/kyutai-tts-1.6b.json
{
"id": "kyutai-tts-1.6b",
"name": "Kyutai TTS 1.6B",
"type": "tts",
"endpoint": "http://localhost:8201/v1/audio/speech",
"capabilities": {
"tts": {
"config": {
"voices": [
"Alba",
"Alba-Casual",
"Alba-Merchant",
"Alba-Announcer",
"Expresso-Happy",
"Expresso-Sad",
"Expresso-Angry",
"VCTK-P225",
"VCTK-P226"
],
"default_voice": "Alba",
"supports_streaming": true,
"no_auth_required": true
}
}
}
}
การเข้าถึงเครือข่าย
เพื่อเข้าถึงจากเครื่องอื่น:
# Start server on all interfaces
python server.py --host 0.0.0.0
# Access from another machine
curl http://192.168.1.100:8200/v1/audio/speech ...
อัปเดต endpoint plugin ให้สอดคล้อง:
{
"endpoint": "http://192.168.1.100:8200/v1/audio/speech"
}
การแก้ปัญหา
ดาวน์โหลดโมเดลล้มเหลว
โมเดลจะดาวน์โหลดจาก HuggingFace ในการรันครั้งแรก:
# Set token for gated models
export HF_TOKEN=hf_...
หน่วยความจำ CUDA ไม่พอ
สำหรับ TTS 1.6B เมื่อ VRAM จำกัด:
- ปิดแอป GPU อื่น
- ลอง
cfg_coef=1.5เพื่อลดการใช้หน่วยความจำ - ใช้ Pocket TTS แทน (ใช้ CPU)
ปัญหาคุณภาพเสียง
- เสียงเหมือนหุ่นยนต์: ลองเสียงอื่น
- เสียงถูกตัด: ข้อความอาจยาวเกินไป เซิร์ฟเวอร์จะแบ่งอัตโนมัติ
- ออกเสียงผิด: โมเดลปรับเหมาะสำหรับอังกฤษและฝรั่งเศส
ปัญหา MPS (Apple Silicon)
RuntimeError: MPS backend error
โมเดล 1.6B ใช้ float16 บน MPS หากยังมีปัญหา ให้บังคับใช้ CPU:
python server.py --device cpu
เปรียบเทียบกับ Qwen3-TTS
| ฟีเจอร์ | Kyutai Pocket | Kyutai 1.6B | Qwen3-TTS |
|---|---|---|---|
| พารามิเตอร์ | 100M | 1.6B | 0.6B-1.7B |
| ต้องใช้ GPU | ไม่ | ไม่บังคับ | ใช่ |
| ภาษา | อังกฤษ | EN/FR | 10 ภาษา |
| โคลนเสียง | ใช่ | ใช่ | ใช่ |
| ออกแบบเสียง | ไม่ | ไม่ | ใช่ |
| พอร์ต | 8200 | 8201 | 8100 |
เลือก Kyutai สำหรับกรณีเน้นภาษาอังกฤษและตั้งค่าง่ายกว่า เลือก Qwen3-TTS เมื่อต้องการหลายภาษาและฟีเจอร์ออกแบบเสียง
แหล่งข้อมูล
- Kyutai TTS - หน้าโปรเจกต์ทางการ
- Pocket TTS GitHub - โมเดล CPU
- Delayed Streams Modeling - โมเดล 1.6B
- คอลเลกชันเสียง - เสียงที่มี
- การ์ดโมเดล - รายละเอียดทางเทคนิค