รัน 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 ได้
2 ความคิดเห็น
สำหรับ TTS ภาษาเกาหลี
supertonic
voxcpm
omnivoice
ประมาณนี้น่าจะถือว่าฟังได้อยู่ครับ
ความคิดเห็นจาก 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...