รัน TTS คุณภาพสูงบน CPU ในเครื่องด้วย Kokoro
(ariya.io)- การสร้างเสียงในเครื่องตอนนี้สามารถให้คุณภาพที่สมจริงได้เพียงพอ แม้ไม่มี GPU เฉพาะ โดยในสภาพแวดล้อมตัวอย่างจะปล่อย GPU ไว้สำหรับการ inference ของ LLM และให้ CPU จัดการ TTS
- Kokoro เป็นโมเดลขนาด 82M พารามิเตอร์ แต่รองรับหลายภาษา เช่น อังกฤษ จีน ฮินดี และมีเสียงให้ใช้ราว 50 เสียง โดยปรับให้เหมาะกับภาษาอังกฤษมากที่สุด
- การตั้งค่าที่ง่ายที่สุดคือการรันคอนเทนเนอร์ Kokoro-FastAPI ซึ่งมีโมเดลเสียงรวมมาให้ล่วงหน้า ทำให้อิมเมจมีขนาดประมาณ 5GB
- มีอินเทอร์เฟซที่เข้ากันได้กับ OpenAI speech API จึงสามารถเปลี่ยนโปรแกรมที่ใช้ API เสียงเดิมมาเป็น TTS ในเครื่อง ได้ค่อนข้างง่าย
- การสังเคราะห์ย่อหน้าสั้น ๆ ใช้เวลาประมาณ Intel Core i7-4770K 4.7 วินาที, Apple M2 Pro 4.5 วินาที, AMD Ryzen 7 8745HS 1.5 วินาที ทำให้สามารถใช้งานแบบ ฟังแทนการอ่าน คำตอบจาก LLM ในเครื่องได้
Kokoro TTS ที่รันได้ด้วย CPU อย่างเดียว
- เมื่อไม่กี่ปีก่อน การสร้างเสียงในเครื่องให้สมจริงยังเป็นเรื่องยาก แต่ตอนนี้สามารถสร้างเสียงคุณภาพสูงได้โดย ไม่ต้องฝากข้อมูลส่วนตัวไว้กับบริการภายนอก
- ตัวอย่างนี้รันบนเครื่อง GTX 1080 Ti สำหรับ LLM ในเครื่องที่เคยกล่าวถึงก่อนหน้านี้
- GPU เฉพาะ ของเครื่องดังกล่าวถูกสงวนไว้สำหรับการ inference ของ LLM
- การสังเคราะห์เสียงใช้ CPU เพียงอย่างเดียว
- โมเดลที่ใช้คือ Kokoro
- เป็นโมเดลขนาด 82M พารามิเตอร์
- สร้างเสียงที่สมจริงได้หลายภาษา เช่น อังกฤษ จีน ฮินดี
- มีเสียงให้ใช้ประมาณ 50 เสียง และปรับให้เหมาะกับภาษาอังกฤษเป็นหลัก
- การตั้งค่าเซิร์ฟเวอร์ที่ง่ายที่สุดคือใช้คอนเทนเนอร์อิมเมจ Kokoro-FastAPI
- มีโมเดลเสียงที่ดาวน์โหลดไว้ล่วงหน้ารวมอยู่ด้วย
- ด้วยเหตุนี้คอนเทนเนอร์อิมเมจจึงมีขนาดประมาณ 5GB
- คำสั่งรันด้วย Docker หรือ Podman:
podman run -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-cpu - หลังรันแล้ว สามารถเปิดเว็บ UI ได้ที่
localhost:8880/webใส่ข้อความเพื่อสร้างเสียงและเล่นอัตโนมัติได้
API ที่เข้ากันได้กับ OpenAI และตัวอย่างการรัน
- คอนเทนเนอร์ Kokoro-FastAPI นอกจากเว็บ UI แล้ว ยังมี อินเทอร์เฟซ TTS ที่เข้ากันได้กับ OpenAI speech API
- สามารถปรับโปรแกรมที่ใช้ OpenAI speech API เดิมให้ใช้งานร่วมกันได้ง่าย
- โค้ดตัวอย่าง JavaScript และ Python อยู่ที่ github.com/remotebrowser/speak
- ตัวอย่างการรัน JavaScript:
export TTS_API_BASE_URL=http://127.0.0.1:8880/v1 ./speak.js "Good morning! How are you today?" - ตัวอย่างการรัน Python:
export TTS_API_BASE_URL=http://127.0.0.1:8880/v1 ./speak.py "Good morning! How are you today?" - เสียงที่สร้างขึ้นจะถูกบันทึกเป็น ไฟล์ MP3
- หากติดตั้ง SoX หรือ Sound eXchange ไว้ เสียงจะเล่นโดยอัตโนมัติ
- ดูข้อมูลเกี่ยวกับ SoX ได้ที่ sox.sf.net
- หากต้องการเลือกเสียงอื่น ให้ตั้งค่าตัวแปรสภาพแวดล้อม
TTS_VOICEexport TTS_API_BASE_URL=http://127.0.0.1:8880/v1 export TTS_VOICE="am_eric" ./speak.js "Good morning! How are you today?" - รายชื่อเสียงทั้งหมดที่ใช้ได้อยู่ใน Kokoro VOICES.md
เวลาในการสังเคราะห์ตาม CPU และทางเลือกอื่น
- ผลการสังเคราะห์ย่อหน้าทดสอบสั้น ๆ ด้วยเสียง
am_ericโดยใช้เวลาที่ดีที่สุดจากการรัน 3 ครั้ง มีดังนี้- Intel Core i7-4770K: 4.7 วินาที
- Apple M2 Pro: 4.5 วินาที
- AMD Ryzen 7 8745HS: 1.5 วินาที
- CPU ตัวแรกในรายการเป็นรุ่นที่เปิดตัวเมื่อ 12 ปีก่อน และ CPU รุ่นเก่าก็ยังสามารถจัดการงานนี้ได้
- อีกทางเลือกของ TTS แบบคอนเทนเนอร์ที่เข้ากันได้กับ OpenAI คือ Speaches
- ต่างจาก Kokoro-FastAPI ตรงที่คอนเทนเนอร์อิมเมจไม่มี weight ของเสียงรวมอยู่ และต้องดาวน์โหลดอย่างชัดเจนผ่าน API
- มีฟีเจอร์ STT คุณภาพสูง รวมถึง Whisper
- หากแอปพลิเคชันต้องการทั้ง TTS และ STT ก็อาจเป็นตัวเลือกที่จัดการได้ในที่เดียว
- เมื่อนำไปใช้ร่วมกับ LLM ในเครื่อง จะทำให้สามารถใช้งานแบบ ฟังคำตอบเป็นเสียง แทนการอ่านคำตอบของ LLM ได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เคยใช้ Kokoro ค่อนข้างเยอะในผลิตภัณฑ์ด้านการเข้าถึง และทำงานด้วยได้ดีเพราะไม่ต้องมี GPU ของ NVidia แบบที่ TTS หลายตัวที่คุณภาพใกล้เคียงกันต้องใช้
โดยเฉพาะชอบตรงที่สามารถใส่ คู่มือการออกเสียง IPA เองได้ เพราะมีบางกรณีที่คำสำคัญเป็นคำพ้องรูป แล้ว Kokoro ออกเสียงผิด
แต่ถ้าให้พูดแค่คำเดียวหรือสองคำจะทำได้ไม่ดีนัก เช่น ถ้าให้พูดแค่ "six" มันแทบจะพูดเป็น "ah-six-ah" เสมอ แต่ถ้าใส่ประโยคที่ยาวขึ้นอย่าง "The word is: six" ก็จะอ่านถูกต้อง และเพราะ Kokoro API ให้ timestamp ของแต่ละคำในประโยค จึงใช้สคริปต์ Python ตัดเอาเฉพาะคำที่ต้องการได้ น้ำเสียงจะค่อนข้างเรียบไปหน่อย แต่เสถียรมาก
ถามใน Discord แล้วได้ยินว่าเป็นข้อจำกัดจากจำนวนพารามิเตอร์ที่เล็ก และเพื่อให้ความเป็นธรรมกับ Kokoro เสียงของ eleven-labs ก็มีปัญหาแบบนี้เป็นครั้งคราวเหมือนกัน
งานที่ใช้ของฉันแทบทั้งหมดเป็นคำเดี่ยว ๆ เลยไม่เหมาะ เพราะไม่อยากต้องมาจัดการเชื่อมต่อหรือแบ่ง input กับ output เอง
เรื่องนี้เป็นหัวข้อที่สนใจจริง ๆ เลยอ่านแล้วสนุก
เมื่อก่อนเคยดูแล whisperx แยกไว้ เพราะมองว่านอกจากการถอดเสียงธรรมดาแล้ว การจับเวลาและการระบุผู้พูด ที่จำเป็นสำหรับงานอย่างซับไตเติลก็สำคัญด้วย แต่พึ่งพา pyannote และไลเซนส์ก็ก้ำกึ่ง ทำให้การทำ automation สำหรับติดตั้งยุ่งยากขึ้น
เลยไปมองหาสิ่งที่ให้การถอดเสียงดีกว่าและรองรับการแยกผู้พูดด้วย สุดท้ายเลือก parakeet สำหรับการถอดเสียง และ softformer สำหรับการแยกผู้พูด แต่เอนจินที่ใช้ได้ส่วนใหญ่ไม่ได้รวม softformer ไว้
ผมทำเซิร์ฟเวอร์ที่เข้ากันได้กับ OpenAI สำหรับ parakeet-rs ซึ่งรองรับ softformer (https://github.com/altunenes/parakeet-rs) และใช้งานร่วมกับแอปถอดเสียงบนเดสก์ท็อป OpenWhispr ที่จัดการฟีเจอร์อำนวยความสะดวกหลายอย่าง
เพราะใช้ GPU ทำงานอื่นอยู่ จึงยังไม่ได้เพิ่มเส้นทาง GPU ตอนนี้ถอดเสียงด้วย CPU ล้วน ๆ แต่การที่สามารถรันการถอดเสียงแบบ local ได้เมื่อต้องการนั้นให้ความรู้สึกทรงพลังมาก
สำหรับงานที่อยากทำ ถ้าใช้ Senko ร่วมกับ parakeet การแยกผู้พูดทำได้ดีมาก บน MacBook ของผมเร็วและแม่นกว่า Pyannote กับ whisper
โมเดลนี้ดีมากจริง ๆ เสียดายที่เพราะ GPU ไม่พอ เลยแทบไม่ได้ลองเล่นโมเดล local เท่าไร แต่เมื่อประมาณหนึ่งเดือนก่อนติดตั้ง Kokoro บน GTX1650 แล้วทำ TTS สำหรับอ่านบทความ
ใน WebUI ง่าย ๆ ถ้าวาง URL หรือก้อนข้อความที่คัดลอกมา Python จะจัดรูปให้แล้วส่งไปยัง Kokoro เพื่อสร้าง TTS จากนั้นเสิร์ฟผลลัพธ์เป็น RSS สำหรับ Apple Podcasts ใช้ตอนขับรถตอนเช้าเพื่อไล่อ่านบทความหรือบล็อกที่เก็บไว้
สักวันอยากลองทำอะไรคล้าย NotebookLM ที่แบ่งใช้หลายเสียง แล้วอ่านข่าวที่เก็บไว้ให้ฟังเหมือนรายการวิทยุตอนเช้า
เมื่อไม่กี่เดือนก่อนทำ ส่วนขยาย Chrome ที่ทำสิ่งนี้ได้บนเว็บเพจใดก็ได้ และไฮไลต์ประโยคที่กำลังอ่านไปพร้อมกัน
มันข้ามทั้งขั้นตอนเปิดคอนเทนเนอร์และขั้นตอนคัดลอกเนื้อหาเว็บไซต์ไปวางได้ จึงอาจมีประโยชน์สำหรับคนที่อยากใช้ Kokoro ให้สะดวกขึ้น
https://chromewebstore.google.com/detail/local-reader-ai-on-...
TTS พัฒนาไปไกลมากจริง ๆ และมีตัวเลือกเยอะ Kokoro ก็มี ส่วน Pocket TTS เป็นโมเดลเล็กขนาด 100M แต่ก็ทำ voice cloning ได้
Chatterbox Turbo ใหญ่ขึ้นอีกหน่อย แต่รองรับการควบคุมอารมณ์ของเสียงได้ดีกว่า และ Fish Audio S2 ใหญ่กว่า แต่ควบคุมโทนและอารมณ์ได้ละเอียดกว่ามากแทบไม่มีข้อจำกัด ทั้งหมดนี้รันบน MacBook ได้ง่าย ๆ
รีโพซิทอรีที่เหมาะสำหรับเริ่มเปรียบเทียบโมเดล TTS คือ https://github.com/5uck1ess/tts-bench
Kokoro เป็นโมเดลที่ดีมากเมื่อคิดว่าเปิดตัวเมื่อ 1.5 ปีก่อน และมีประสิทธิภาพยอดเยี่ยมเมื่อเทียบกับขนาด: https://5uck1ess.github.io/tts-bench/scores.html
เคยลองใช้ Piper เป็น TTS แบบ local มาก่อน Kokoro ก็ดูน่าสนใจเหมือนกัน
เจ๋งมาก ใช้ Linux อยู่เลยใช้ Aqua หรือ Whipsrflow อะไรพวกนั้นไม่ได้ จึงใช้โซลูชันที่ทำเองมาตั้งแต่มกราคม
เพิ่งจัดระเบียบไม่นานนี้ให้ติดตั้งง่ายขึ้น ถ้าสนใจดูได้ที่นี่: https://github.com/Hugo0/voiceio
มันค่อย ๆ ปรับปรุงตัวเองเมื่อเวลาผ่านไป รันบนเครื่อง local และโดยรวมเป็นซอฟต์แวร์ที่ใช้งานได้ดี ทุกวันนี้การโต้ตอบกับ PC ของผมประมาณ 60% เป็น การป้อนข้อมูลด้วยเสียง ล้วน ๆ
ชอบ Kokoro มาก ใช้ให้มันอ่านอีบุ๊กที่ไม่มีออดิโอบุ๊กให้ฟัง และสำหรับงานนี้ก็ทำงานได้ค่อนข้างดี
ทำสคริปต์ Python ที่อ่าน epub/html รันโมเดล แล้วเขียนออกมาเป็น mp3 ไว้แล้ว
จำนวนภาษาที่ Kokoro รองรับยังจำกัดอยู่ จึงต้องใช้โมเดลอื่นสำหรับการรองรับ ภาษาดัตช์ แต่คุณภาพไม่ดีเท่ากัน ปกติมักช้ากว่ามากและใหญ่กว่าด้วย จึงใหญ่เกินไปสำหรับ VRAM 8GB
สุดท้ายถึงกับลองใช้ TTS ที่มากับ Windows แม้ฟังดูไม่เป็นธรรมชาติ แต่อย่างน้อยก็ออกเสียงคำส่วนใหญ่ได้และเร็วมาก
ใช้เวลาหนึ่งวันลองเล่น AI แล้วตัดเลเยอร์ราคาแพงออกจาก Kokoro และมันรันบน CPU มือถือกับ MNN ได้เร็วขึ้น 3 เท่า
คุณภาพใกล้เคียงกันมาก อาจขึ้นอยู่กับสภาพแวดล้อม แต่สคริปต์อยู่ที่นี่: https://github.com/DavidVentura/translator-rs/blob/master/sc...