StyleTTS2 - การแปลงข้อความเป็นเสียงพูดที่ใช้ style diffusion และการเรียนรู้แบบปฏิปักษ์ด้วย SLM ขนาดใหญ่
(github.com/yl4579)- StyleTTS2 เป็นโมเดลแปลงข้อความเป็นเสียงพูดที่มุ่งสร้าง TTS ระดับมนุษย์ โดยใช้ style diffusion และการเรียนรู้แบบปฏิปักษ์บนพื้นฐานของ speech language model (SLM) ขนาดใหญ่
- โมเดลทำให้สไตล์เป็น ตัวแปรสุ่มแฝง ของ diffusion model เพื่อสร้างสไตล์ที่เหมาะกับข้อความได้โดยไม่ต้องมี reference speech และใช้ latent diffusion ที่มีประสิทธิภาพซึ่งอาศัยการสังเคราะห์เสียงพูดที่หลากหลายของ diffusion model
- ใช้ SLM ที่ผ่านการ pretrain ขนาดใหญ่อย่าง WavLM เป็น discriminator และใช้ duration modeling ที่หาอนุพันธ์ได้ เพื่อให้ฝึกแบบ end-to-end และปรับปรุงความเป็นธรรมชาติของเสียงพูด
- บนชุดข้อมูลผู้พูดคนเดียว LJSpeech ผลประเมินโดย native English speaker ระบุว่าสามารถ surpass human recordings ได้ และบนชุดข้อมูลหลายผู้พูด VCTK สามารถ match กับ human recordings ได้ ขณะที่โมเดลที่ฝึกด้วย LibriTTS แสดงประสิทธิภาพสูงกว่าโมเดล publicly available models เดิมในงาน zero-shot speaker adaptation
- เวิร์กโฟลว์การฝึกและการอนุมานครอบคลุม LJSpeech แบบผู้พูดคนเดียว, VCTK·LibriTTS แบบหลายผู้พูด และการ fine-tuning ผู้พูดใหม่จากโมเดลหลายผู้พูดที่ผ่านการ pretrain
- การฝึกขั้นแรกใช้
accelerate launch train_first.py --config_path ./Configs/config.ymlและการฝึกขั้นที่สองใช้python train_second.py --config_path ./Configs/config.yml - เวอร์ชัน DDP ของ
train_second.pyใช้งานไม่ได้ จึงใช้ DP อยู่ในปัจจุบัน และสคริปต์ fine-tuning ก็มีเงื่อนไขที่ DDP ใช้งานไม่ได้เช่นกัน
- การฝึกขั้นแรกใช้
- เงื่อนไขหลักในการรันคือ Python >= 3.7, ติดตั้ง
requirements.txt, เมื่อต้องการรันเดโมให้ติดตั้งphonemizerและespeak-ng, และอัปแซมปลิงข้อมูล LJSpeech เป็น 24 kHz - โมดูลที่ผ่านการ pretrain ประกอบด้วย ASR สำหรับ text aligner, JDC สำหรับ pitch extractor และ PL-BERT
- ASR aligner ผ่านการ pretrain ด้วย corpus ภาษาอังกฤษ (LibriTTS), ภาษาญี่ปุ่น (JVS), และภาษาจีน (AiShell)
- JDC pitch extractor ผ่านการ pretrain ด้วย corpus ภาษาอังกฤษ (LibriTTS) เท่านั้น
- PL-BERT ผ่านการ pretrain ด้วย corpus ภาษาอังกฤษ (Wikipedia) เท่านั้น ดังนั้นภาษาอื่นจึงต้องใช้ PL-BERT สำหรับภาษานั้น ๆ และ multilingual PL-BERT รองรับ 14 ภาษา
- การอนุมานมีให้ผ่าน
Inference_LJSpeech.ipynbสำหรับผู้พูดคนเดียว และInference_LibriTTS.ipynbสำหรับหลายผู้พูด โดยโมเดลที่ผ่านการ pretrain สำหรับ LJSpeech และ LibriTTS ดาวน์โหลดได้จาก Hugging Face - ไลเซนส์ของโค้ดคือ MIT License และเมื่อใช้โมเดลที่ผ่านการ pretrain ต้องปฏิบัติตามเงื่อนไข เช่น แจ้งผู้ฟังว่าเป็นเสียงสังเคราะห์ หรือสังเคราะห์เสียงเผยแพร่ต่อสาธารณะเฉพาะเสียงของผู้พูดที่มีสิทธิ์ใช้งานเสียงเท่านั้น
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ใช้ชิ้นส่วนโอเพนซอร์สอย่าง StyleTTS2, Whisper, OpenHermes2-Mistral-7B สร้างแชตบอตเสียงที่ทำงานแบบโลคัล 100% และตอบสนองได้เร็วกว่า ChatGPT มาก
ไม่ใช่การโต้ตอบแบบ Siri ที่แข็ง ๆ เหมือนผู้ช่วยเสียงรายอื่น แต่สามารถถามตอบกันได้ใกล้เคียงการสนทนาจริง จึงน่าสนุก
บนพีซีเกมมิง Windows ที่มี GPU Nvidia 12GB โดยทดสอบกับ 3060 12GB สามารถติดตั้งทีเดียวแล้วคุยได้เลยโดยไม่ต้องแตะ Python หรือ CUDA: https://apps.microsoft.com/detail/9NC624PBFGB7
เดโมยังมีส่วนที่ไม่เนี้ยบ เช่น ต้องใช้หูฟังและรันเป็นแอปคอนโซล แต่ให้ความรู้สึกเหมือนแสดงให้เห็นล่วงหน้าว่าอีกไม่นานสิ่งนี้จะเป็นไปได้บนพีซีเกมมิงทั่วไปด้วยการประกอบโอเพนซอร์สล้วน ๆ และยังมีโมเดลที่ปรับปรุงแล้วอีกหลายตัวที่ยังไม่ได้เอามาใส่
โดยเฉพาะอยากให้ การขัดจังหวะและการแทรกพูด ทำได้เหมือนบทสนทนาทั่วไป เช่น ถ้าอีกฝ่ายพูดนานเกินไป ฉันสามารถแทรกเข้าไปหยุดได้ หรือระหว่างที่ฉันกำลังพูด AI ก็ส่งเสียงรับสั้น ๆ ได้
ถ้าความเร็วถึงระดับที่เร็วกว่าการทำงานแบบเรียลไทม์ ก็น่าจะเริ่มทำฟีเจอร์แบบนั้นได้ในทางทฤษฎี และสำหรับการสนทนาที่เป็นธรรมชาติอย่างสมบูรณ์ก็ดูเหมือนต้องมี การรับรู้บริบท ที่ AI ดูใบหน้าและท่าทางแล้วตัดสินว่ากำลังจะพูดยาวหรือไม่ด้วย
แม้บน EVGA 3080Ti 12GB ก็ยังมี latency ค่อนข้างสูง และแม้พูดแค่ครั้งเดียว ดูเหมือนมันจะประมวลผลอินพุตเดียวกันหลายครั้ง พร้อมผลการรู้จำที่ต่างกันเล็กน้อยซ้ำ ๆ
สุดท้ายก็เห็นปัญหาที่มันฟังเสียงของตัวเองแล้วตอบกลับตัวเองด้วย
เดือนที่แล้วได้ทดสอบ StyleTTS2 และรวบรวมบันทึกแบบทีละขั้นตอนที่น่าจะช่วยคนที่ต้องการติดตั้งแบบโลคัลไว้: https://llm-tracker.info/books/howto-guides/page/styletts-2
ยังได้เปรียบเทียบความเร็วและคุณภาพแบบง่าย ๆ กับ VITS, XTTS โดยใช้โมเดล LJSpeech ซึ่ง StyleTTS2 ค่อนข้างดีและเร็วมาก: https://fediverse.randomfoo.net/notice/AaOgprU715gcT5GrZ2
สงสัยว่าฟังก์ชันที่เทียบได้กับ inpainting หรือ outpainting จะทำได้ไหม และการสังเคราะห์เสียงคุณภาพระดับนี้ที่เร็วมาก ๆ น่าจะมีการใช้งานได้หลากหลาย โดยเฉพาะในการพัฒนาเกมอินดี้และเกมเชิงทดลอง
anchor
#mambaforgeในลิงก์ก็ใช้งานไม่ได้ด้วยเอกสารค่อนข้างเว้นช่องโหว่ไว้เยอะ ทำให้ขั้นตอนตั้งค่าให้ตรงกันยุ่งยากนิดหน่อย แต่หลังจากราว 20 นาที ก็ทำงานได้ดีบน WSL Ubuntu 22.04
คุณภาพเสียงดีมาก ดีกว่าโปรเจกต์สังเคราะห์เสียงโอเพนซอร์สอื่น ๆ ที่เคยเห็นมามาก และถ้าใช้ GPU 4090 ถือว่า เร็วมาก
ยังไม่แน่ใจว่าเทียบถึงระดับคุณภาพของ ElevenLabs หรือไม่ แต่เสน่ห์ของ ElevenLabs อยู่ที่มีไลบรารีเสียงคุณภาพสูงขนาดใหญ่และเลือกใช้ได้ง่าย ในไลบรารีนี้ผมยังหาวิธีเลือกเสียงอื่นนอกจากเสียงผู้หญิงเริ่มต้นไม่เจอ
จุดสำคัญจริง ๆ ของ ElevenLabs คือ การโคลนเสียง ที่ทำได้แทบจะทันทีจากตัวอย่างเพียง 5 นาที ซึ่งทำได้ดีจนน่าทึ่งและแอบน่าขนลุก หวังว่าฟีเจอร์นี้จะทำได้แบบโอเพนซอร์สเต็มรูปแบบในอนาคต บริการ API แพงเกินไปสำหรับหลายการใช้งาน และแม้แต่ OpenAI ที่ค่อนข้างถูกก็ยังมีค่าใช้จ่ายราว 10 เซนต์สำหรับการสร้างข้อความหลายพันคำ
/Demoแล้วเปิดInference_LJSpeech.ipynbหรือInference_LibriTTS.ipynbก็น่าจะทำงานได้โครงสร้างคือให้การสังเคราะห์เสียงรับผิดชอบเรื่องน้ำเสียงและการออกเสียง ส่วน RVC รับผิดชอบเนื้อเสียง ถ้าผสม StyleTTS กับ pipeline นี้ก็อาจเข้าใกล้ ElevenLabs ได้
การสังเคราะห์เสียงสั้น ๆ แทบจะเป็นปัญหาที่แก้ได้แล้วในโลกการสังเคราะห์เสียง แต่เมื่อพยายามทำ หนังสือเสียง ด้วย text-to-speech ปัญหาต่าง ๆ จะเริ่มพังลง
น่าสนใจที่ตัวอย่างของ TTS2 ฟังดูดีกว่าเสียงจริงที่เป็นคำตอบเฉลยด้วยซ้ำ https://styletts2.github.io/
เช่น ในตัวอย่าง “Then leaving the corpse within the house [...]” เสียงเฉลยออกเสียง
houseแปลก ๆ เหมือนโทนเสียงยกขึ้น แต่เวอร์ชัน TTS2 ฟังเป็นธรรมชาติกว่าอยากใช้กับไฟล์ ePub หลาย ๆ ไฟล์ เช่น ไลต์โนเวลญี่ปุ่นที่ไม่มีหนังสือเสียง ตอนนี้ใช้ TTS ของ Moon+ Reader บน Android อยู่ ซึ่งฟังเป็นหุ่นยนต์พอสมควร
ในปี 2023 ไม่มีทางชนะได้เลย
ถึงอย่างนั้นผลลัพธ์ก็น่าประทับใจ และดีกว่าการสังเคราะห์เสียงอื่น ๆ ทั้งหมด
ตอนนี้หัวข้อบน HN คือ “StyleTTS2 – open-source Eleven Labs quality Text To Speech” แต่หัวข้อต้นฉบับไม่ได้ใส่ชื่อผลิตภัณฑ์เฉพาะ และบทความ arXiv ที่ลิงก์ไว้ก็ไม่ได้กล่าวถึง ElevenLabs
เข้าใจว่าการ แก้ไขหัวข้อ แบบนี้เป็นสิ่งที่ควรหลีกเลี่ยง
ถ้าระบบโอเพนซอร์สเข้าใกล้คุณภาพนั้นได้ก็เป็นเรื่องน่าจับตามาก และคิดว่าคนส่วนใหญ่น่าจะขอบคุณที่มีการเปรียบเทียบนี้ จริง ๆ แล้วผมสนใจก็เพราะการเปรียบเทียบนั้น
อยากถามคนที่ใช้ได้สำเร็จว่า การโคลนเสียง นี้ต่างจาก XTTSv2 อย่างสิ้นเชิง และยิ่งเทียบ ElevenLabs ไม่ได้เลย
ดูเหมือนมันไม่ได้ใส่ใจกับน้ำเสียงมากนัก แค่จับระดับเสียงและจังหวะได้ค่อนข้างดี
ลองปรับค่า
alpha,beta,embedding scale,diffusion stepsหลายแบบแล้ว ยอมรับว่ามันเร็วและคุณภาพเสียงใช้ได้ แต่การโคลนเสียงไม่ได้ทำงานได้ถูกต้องเลยXTTS ก็น่าจะฝึกด้วยภาษามากกว่า 20 ภาษาและผู้พูดหลายล้านคน
ถ้าเคยเห็นเสียงเป็นล้าน ๆ เสียง ย่อมต้องมีเสียงที่คล้ายคุณอยู่ในนั้นแน่นอน สุดท้ายจึงเป็นปัญหาเรื่องข้อมูลฝึก แต่การรวบรวมข้อมูลขนาดใหญ่แบบนั้นและนำมาฝึกเป็นเรื่องยากมาก
alpha,betaไปเยอะมากและอัปโหลดคลิปเสียงหลายคลิป แต่ก็เจอผลแบบเดียวกันคุณภาพนั้น ดีจนน่าเหลือเชื่อจริง ๆ และอยู่ในระดับที่แทบจะจินตนาการได้ยากในช่วงต้นยุค 2000
ถ้าให้ LLM รับบทเป็นตัวละคร แล้วใช้การสังเคราะห์เสียงแบบนี้มอบเสียงให้ NPC ก็น่าจะเปิดความเป็นไปได้ที่น่าสนใจในเกม
ตอนนี้เครื่องจำลองกอล์ฟมีเสียงนกร้อง หญ้าไหว และการเล่นก็สมจริง แต่กลับไม่มีคนเลยสักคน ทำให้ยังมีกลิ่นอายแบบหลังวันสิ้นโลกนิด ๆ
มันต่างจากการหยอกล้อปนกดดันกันในรอบจริง หรือเสียงผู้ชมในการแข่งขันใหญ่ ๆ มาก จึงดูเหมาะมากที่จะเพิ่มการคุยเล่นที่ขับเคลื่อนด้วย LLM เข้าไป
เพิ่งลองใช้ Colab notebook ดู และคุณภาพก็ดูดีมาก อีกทั้งยังรองรับ การโคลนเสียง ด้วย
อยากลองใช้ดู แต่เริ่มเบื่อแล้วกับการต้องสร้าง
venvทุกครั้งเพื่อจะติดตั้ง dependency ของ torchเลยสงสัยว่าคนอื่นจัดการกันอย่างไร อยากรู้ว่ามีวิธีง่าย ๆ ให้
venvหลายตัวใช้ สภาพแวดล้อม torch ร่วมกันได้ไหม หรือมีเครื่องมือที่ช่วยเรื่องนี้หรือเปล่า ถึงแม้จะทำเองแบบแมนนวลได้ก็ตามเวิร์กโฟลว์คือเข้าไปด้วย
nix flake init -t github:dialohq/flake-templates#python,nix develop -c $SHELLแล้วใน shell hook ของสภาพแวดล้อมพัฒนา nix จะรันpoetry installและpoetry activateสงสัยว่าจะมี มาร์เก็ตเพลส LoRA แบบ Civitai สำหรับโมเดลแปลงข้อความเป็นเสียงหรือไม่
https://github.com/microsoft/LoRA