- transcribe.cpp เป็นไลบรารีบนพื้นฐาน ggml ที่สร้างขึ้นเพื่อฝังโมเดลรู้จำเสียงพูดรุ่นใหม่หลายแบบลงในแอป Mac, Windows, Linux ได้ง่าย และเร่งความเร็วด้วย GPU
- รัน ASR 16 ตระกูล และโมเดลมากกว่า 60 แบบ บน Vulkan, Metal, CUDA, TinyBLAS พร้อมรองรับทั้งการถอดเสียงแบบสตรีมมิงและแบบแบตช์
- เปรียบเทียบเชิงตัวเลขกับ reference implementation สำหรับทุกโมเดล และทำ WER test ด้วยถ้อยคำหลายพันรายการ พร้อมเผยแพร่ผลการตรวจสอบในรีโพซิทอรีและบน Hugging Face
- สามารถรันไฟล์
.binเดิมสำหรับ whisper.cpp และใช้แทนได้ด้วยประสิทธิภาพใกล้เคียงกันในงานส่วนใหญ่ พร้อมมี official bindings สำหรับ Python, JavaScript/TypeScript, Rust, ObjC/Swift - แม้บน RK3566 ที่ใช้พลังงานต่ำก็ถอดเสียงได้เร็วกว่าเรียลไทม์ ทำให้สามารถนำ local ASR ไปใช้งานบนอุปกรณ์หลากหลายโดยไม่ต้องส่งเสียงขึ้นคลาวด์
ข้อจำกัดของการ deploy ASR ข้ามแพลตฟอร์ม
- ตัวเลือกสำหรับการ infer ASR แบบข้ามแพลตฟอร์มที่มีอยู่เดิมแทบจำกัดอยู่ที่ whisper.cpp และ ONNX
- สำหรับอุปกรณ์ Apple สามารถเพิ่ม MLX ได้ แต่จะต้องรองรับเอนจินสองตัวและพอร์ตโมเดลสำหรับแต่ละเอนจิน
- ONNX มีประโยชน์ในการเพิ่มโมเดลเข้า Handy ได้อย่างรวดเร็ว แต่ถ้ารันเฉพาะบน CPU ก็ใช้ประสิทธิภาพได้ไม่เต็มที่
- ไลบรารีบางตัวที่รองรับหลายโมเดลมีความไม่ชัดเจนเรื่องผู้เขียน ระดับการทดสอบ และแผนการดูแลรักษา
- ยากที่จะตรวจสอบว่ามี binding สำหรับใช้ในแอปเดสก์ท็อปและมือถือจริงหรือไม่ เป็นแค่โค้ดเดโมหรือเปล่า มี benchmark หรือไม่ และเร็วกว่า ONNX หรือไม่
- จากประสบการณ์ deploy ระบบป้อนเสียงแบบข้ามแพลตฟอร์มของ Handy จึงต้องการเอนจินที่ตรงตามเงื่อนไขต่อไปนี้
- ดาวน์โหลดไฟล์แล้ว infer ได้ทันที
- ตรวจสอบได้ว่าคุณภาพการ infer เทียบเท่ากับ reference implementation หรือไม่
- ต้องรันบน GPU เพื่อประสิทธิภาพสูงสุด
- ฝังลงใน Handy ได้ง่ายโดยไม่ต้องใช้ไลบรารี PyTorch ขนาดใหญ่
- ทำงานได้บน Mac, Windows, Linux
- ggml ถูกเลือกเป็นฐานในการทำตามข้อกำหนดเหล่านี้ เพราะมีคอมมูนิตี้แข็งแรงและรูปแบบการ deploy ที่สะดวก
โมเดลที่รองรับและวิธีเร่งความเร็ว
- transcribe.cpp ตั้งเป้าหมายให้ infer ได้รวดเร็วและแม่นยำ พร้อมรองรับโมเดลอย่างกว้างขวาง
- รองรับ ASR 16 ตระกูล และโมเดลมากกว่า 60 แบบ และมีแผนเพิ่มโมเดลอีก
- รองรับโมเดลถอดเสียงรุ่นใหม่ที่เผยแพร่สาธารณะส่วนใหญ่ แต่ยังมีบางโมเดลที่ยังไม่รวมอยู่
- มีทั้งการถอดเสียงแบบสตรีมมิงและแบบแบตช์
- โมเดลที่รองรับทั้งหมดสามารถรันบน acceleration backend ต่อไปนี้
- Vulkan
- Metal
- CUDA
- TinyBLAS
- benchmark รายโมเดลทำบนสภาพแวดล้อม Fedora ด้วย Ryzen 4750U CPU + Vulkan และบน M4 Max
- กำหนดให้การรองรับ Vulkan เป็นเงื่อนไขขั้นต่ำสำหรับการ deploy แอป infer แบบโลคัล
การตรวจสอบความถูกต้องกับ reference implementation
- จากประสบการณ์ที่ยากจะมั่นใจในความถูกต้องของการ infer ของโมเดล
.onnxที่ได้จาก Hugging Face จึงทำ การตรวจสอบเชิงตัวเลขกับ reference implementation สำหรับทุกโมเดล - นอกจากการเปรียบเทียบเชิงตัวเลข ยังรันการตรวจ WER เต็มรูปแบบเพื่อยืนยันว่าให้ผลลัพธ์เหมือน reference implementation หรือไม่
- ประมวลผลถ้อยคำหลายพันรายการต่อโมเดล
- ผลลัพธ์ใกล้เคียงมากหรือเหมือนกับ reference implementation
- ข้อมูลการตรวจสอบถูกเผยแพร่ในรีโพซิทอรี transcribe.cpp และในหน้าโมเดลแต่ละรายการของ องค์กร handy-computer บน Hugging Face
ความเข้ากันได้กับ whisper.cpp
- เพื่อให้สามารถแทนที่ whisper.cpp ที่ใช้ใน Handy ได้ จึงทำความเข้ากันได้ที่ ใกล้เคียงกับการแทนแบบ drop-in
- ไฟล์โมเดล
.binสำหรับ whisper.cpp ที่ deploy พร้อม Handy สามารถรันบน transcribe.cpp ได้ด้วย - flag และฟีเจอร์บางส่วนของ whisper.cpp ยังไม่รองรับ
- สำหรับการใช้งานส่วนใหญ่ implementation ของ whisper มีความเสถียรเพียงพอ และสามารถแทนที่ whisper.cpp ได้ด้วยประสิทธิภาพโดยรวมใกล้เคียงกัน
Language bindings และการดูแลรักษา
- เขียนด้วย C/C++ และมี official maintained bindings เพื่อ deploy การถอดเสียงแบบโลคัลในหลายสภาพแวดล้อม
- Python
- JavaScript/TypeScript
- Rust
- ObjC/Swift
- ยินดีรับ contribution สำหรับ binding ภาษาอื่น แต่ผู้ร่วมพัฒนาต้องรับผิดชอบการดูแลรักษา binding นั้น
- ความต้องการจริงของ Handy ถูกสะท้อนในการออกแบบไลบรารี และมีแผนจะดูแล transcribe.cpp ต่อเนื่องจากประสบการณ์การดูแล Handy
- นำประสบการณ์จากการรองรับโมเดล ASR หลากหลายและกรณีใช้งานจริงมาปรับใช้ แต่ยังมีกรณีที่ยังจัดการไม่ได้ จึงรับ contribution จากภายนอก
- เวอร์ชันปัจจุบันคือ v0.1.0 ยังมีส่วนที่ไม่เรียบร้อย จึงขอให้ รายงาน issue
local ASR ที่ขยายไปถึงอุปกรณ์ใช้พลังงานต่ำ
- เป้าหมายคือทำให้การรัน ASR บนอุปกรณ์โดยตรงง่ายขึ้น เพื่อลด ความจำเป็นในการส่งเสียงไปยังบริการคลาวด์
- แม้บน CPU RK3566 ที่ประสิทธิภาพไม่สูง ก็สามารถรันโมเดลได้เร็วกว่าเรียลไทม์
- ความเร็วถอดเสียงสูงกว่าเรียลไทม์ด้วยโมเดลสมัยใหม่ทำงานได้ในระดับพลังงานไม่กี่วัตต์
- หากต้องการให้การ infer จำนวนมากขึ้นเกิดขึ้นแบบโลคัล ขั้นตอนการ deploy และรันเอนจิน infer ในแอปพลิเคชันต้องง่ายขึ้น
- transcribe.cpp เพียงตัวเดียวไม่สามารถแก้ปัญหาการ deploy inference แบบโลคัลทั้งหมดได้ แต่พัฒนาขึ้นเพื่อเป็นขั้นตอนหนึ่งในการลดกำแพงการเริ่มใช้งาน local ASR
การสนับสนุนที่หนุนโครงการ
- Mozilla AI, โปรแกรม BiR และ Davide จาก Mozilla AI สนับสนุนโครงการตั้งแต่ช่วงสำรวจแรกเริ่มที่ยังไม่มีรูปแบบผลิตภัณฑ์ชัดเจน
- ggml เป็นรากฐานสำคัญที่ทำให้สามารถ deploy แอป infer แบบโลคัลได้
- Modal มอบเครดิตที่ใช้สำหรับ WER test และการตรวจสอบ CUDA
- Blacksmith สนับสนุนบางส่วนของ CI/CD ที่ตรวจสอบไฟล์ release
- Hugging Face ให้พื้นที่เก็บข้อมูลแบบ private แก่องค์กร handy-computer เพื่อให้อัปโหลดโมเดลได้อย่างอิสระ
การใช้ AI ในกระบวนการพัฒนา
- เห็นว่าการเขียนเอนจินบนพื้นฐาน ggml ขนาดนี้ตั้งแต่ต้นโดยคนเดียวภายในไม่กี่เดือนเป็นเรื่องยาก จึงใช้ AI assistance ในการพัฒนา
- บทความแนะนำโครงการไม่ได้เขียนด้วย AI แต่ประกอบจากประโยคที่พูดหรือพิมพ์เอง
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ดูเจ๋งมาก แต่อ่านเอกสารของโมเดลแล้วยังไม่เจอฟังก์ชันที่ถอดเสียงเป็น สัทอักษรสากล (IPA) จากเสียงโดยตรง แทนที่จะตีความความหมายของภาษาที่ไม่เป็นที่รู้จัก
สำหรับภาษาชนกลุ่มน้อยที่มีผู้พูดไม่ถึง 10,000 คน อาจไม่มีทรัพยากรพอสำหรับฝึกโมเดลเฉพาะภาษาไปตลอด หากมีโมเดลที่ไม่ต้องระบุภาษาก่อนและแปลงเสียงเป็น IPA ได้โดยตรง ก็น่าจะช่วยนักภาษาศาสตร์ที่ศึกษาภาษาชนกลุ่มน้อยทั่วโลกได้มาก
เอกสารที่เป็นลายลักษณ์อักษรก็มีน้อย เลยอยากสร้างระบบแปลขึ้นมาเองแบบใน Project Hail Mary
เช่น dark l กับ light l ในอังกฤษ (ball/light) หรือเสียง p พ่นลมกับไม่พ่นลม (pin/spin) อาจใช้แยกความหมายในภาษาอื่น แต่ไม่ใช่ในภาษาอังกฤษ เลยสงสัยว่านักภาษาศาสตร์ต้องการ IPA ที่ถอดมาอย่างซื่อสัตย์ที่สุดก่อน แล้วค่อยปรับให้เป็นมาตรฐานด้วยมือหรือไม่
ขอแสดงความยินดีกับการเปิดตัว ใช้ Handy บน Mac และมือถืออยู่แล้ว และมันมีประโยชน์มากโดยเฉพาะเวลาที่ระบบรู้จำเสียงพื้นฐานของ Apple ฟังศัพท์เฉพาะทางผิด
สงสัยว่ามีทางให้มูลนิธิช่วยออกค่าใช้จ่ายในการดูแลรักษาได้ไหม ถ้าจะรับค่าตอบแทนจากโปรเจกต์แบบนี้ ควรไปหาองค์กรแบบไหนและขอการสนับสนุนอย่างไร
อยากทำงานช่วยโอเพนซอร์สต่อไป ดังนั้นถ้าเป็นที่ที่สนับสนุนสิ่งนี้ก็ยินดีมาก โดยเฉพาะองค์กรที่เชื่อในโอเพนซอร์สและช่วยผลักดันให้เติบโต คุยรายละเอียดได้ที่ contact@handy.computer
ระบบแปลงเสียงเป็นข้อความหลายตัวรู้จำคำพูดได้แม่น แต่ไม่รองรับเวิร์กโฟลว์ที่ต้องการ ควรจะเปิดเอกสารแล้วพูด จากนั้นข้อความต้อง พิมพ์ต่อเนื่องด้วยความหน่วงต่ำที่สุด ตรงตำแหน่งเคอร์เซอร์
แบบที่ต้องหยุดอัดแล้วค่อยวางข้อความทีเดียวไม่ค่อยมีประโยชน์ ประเด็นสำคัญคือการป้อนต่อเนื่อง
การพูดสิ่งที่อยู่ในหัวเกี่ยวกับหัวข้อหนึ่งออกมาให้หมด 5-10 นาทีแล้วค่อยทบทวน กลับช่วยไม่ให้กระแสความคิดสะดุดมากกว่า
บางแอปยังใช้สิ่งที่คัดลอกไว้หรือสิ่งที่กำลังดูอยู่เป็น บริบทของการถอดเสียง เพื่อปรับผลลัพธ์ให้ดีขึ้นด้วย: https://superwhisper.com/docs/common-issues/context#types-of...
สงสัยว่าเหมือน Whisper.cpp ไหม คือสามารถ ป้อนบริบท เพื่อเพิ่มความแม่นยำได้มากหรือไม่
ในบรรดาภาษา binding ทั้งสี่ที่ผู้ดูแลรองรับ เวอร์ชันสำหรับ Python อยู่ที่ https://github.com/handy-computer/transcribe.cpp/tree/main/b...
ตอนนี้ยังไม่มี PyPI binary wheel ที่รวม dependency มาให้ และไลบรารีบน PyPI ปัจจุบันเรียกไลบรารีที่ติดตั้งแยกผ่าน ctypes แต่ดูเหมือนมีแผนจะออกในอนาคต
เจอเข้าพอดีในจังหวะเหมาะ ช่วงนี้ได้ยินบ่อยเรื่องการใส่ การสังเคราะห์เสียงพูด (TTS) ลงในเครื่องมือ prompt เลยอยากลองเองดู
วงจรที่พูดความคิดยาว ๆ ออกมาให้เป็นเอกสาร แล้วค่อยแก้ไขก่อนส่งต่อให้ AI ดูน่าสนใจมาก
เป็นการช่วยชุมชนอย่างมหาศาล และน่าทึ่งที่ทำคนเดียว ตอนท้ายแอบคิดว่าจะมีประกาศระดมทุน Series A โผล่มาเสียอีก
แม้ AI จะถูกใช้ปั่นผลงานคุณภาพต่ำออกมาเร็ว ๆ ได้ แต่ก็แสดงให้เห็นเหมือนกันว่าสามารถขยายความทะเยอทะยานเพื่อสร้างสิ่งที่เข้มงวดและอยู่ได้นานกว่าที่เคยได้ มองว่าแทนที่จะใส่ Transcribe.cpp ลงแอปโดยตรง ความสามารถแบบนี้ควร ใช้งานได้จากทุกที่ ผ่านระบบปฏิบัติการหรือแอปอย่าง Handy มากกว่า
สักวันหนึ่งก็อยากแจกจ่าย libtranscribe ให้เหมาะสมและทำให้มันเป็นเหมือน system library แม้ต้องใช้เวลาพอสมควรกว่าจะนิ่ง แต่คิดว่าน่าจะเป็นไปได้
ทำงานได้ดีกว่า transcribe-rs เดิมมาก พอลองอัปเดตให้แอปป้อนข้อมูลด้วยเสียงแบบออฟไลน์ใช้ไลบรารีตัวใหม่ด้วย ก็พบว่าความเร็วดีขึ้นมาก: https://github.com/notune/android_transcribe_app
ต่อไปนี้ การอนุมานบนเครื่อง จะเพิ่มขึ้นด้วยหลายเหตุผล และข้อวินิจฉัยที่ว่าหากต้องการให้แอปจำนวนมากขึ้นนำไปใช้ ก็ต้องทำให้รันและแจกจ่ายได้ง่ายนั้นถือว่าแม่นยำ
การที่ไม่มีคำใดในบทความนี้ถูกเขียนโดย AI แต่ทั้งหมดมาจากปากหรือปลายนิ้ว ก็ยิ่งทำให้โปรเจ็กต์นี้น่าเชื่อถือและเข้าถึงได้ง่ายขึ้นด้วย
หากใช้บ่อยเข้า ก็จะเรียนรู้ว่าการเรียงคำแบบใดถูกถอดเสียงได้อย่างแม่นยำ และสิ่งนี้จะกลายเป็นส่วนหนึ่งของกระบวนการคิด เมื่อเวลาผ่านไป LLM กับความคิดจะพันกัน, ดังนั้นการใช้ AI ในลักษณะนี้ก็อาจเปลี่ยนประโยคสุดท้ายได้จริง
ตอนลองหาทางรันเซิร์ฟเวอร์ API สำหรับถอดเสียงบนเครื่องเองก็เจอปัญหาคล้ายกัน สิ่งที่ขาดที่สุดคือการรองรับสตรีมมิงและการรองรับคำพิเศษเพื่อเพิ่มลำดับความสำคัญระหว่างการรู้จำ ซึ่งดีใจที่ตัวนี้มีสตรีมมิงมาให้
หลังจาก whisper.cpp ออกมา ก็รันใช้งานเองบนเซิร์ฟเวอร์ 3090 Ti มาตลอด ต่อให้มีทางเลือกที่เร็วกว่าและดีกว่าออกมา มันก็ยังทำงานต่อได้ไม่มีปัญหา น้ำหนักโมเดลเล็ก และเร็วเกินพอสำหรับสิ่งที่ต้องใช้
ถ้านำขึ้นโฮมเซิร์ฟเวอร์ในเครื่องแบบด้านล่าง ก็สร้าง API ถอดเสียงบนเครื่อง ได้อย่างง่ายดาย ต้องปรับพารามิเตอร์การอนุมานนิดหน่อย แต่พอลงตัวครั้งหนึ่งแล้วจะทำงานได้ดีมาก
MODEL="/home/user/projects/ggml-org/whisper.cpp/models/ggml-large-v3-turbo.bin"WHISPER_SERVER_BIN="/home/user/projects/ggml-org/whisper.cpp/build/bin/whisper-server""$WHISPER_SERVER_BIN" --model "$MODEL" --language en --host 127.0.0.1 --port 7812การปรับน้ำหนักคำน่าจะถูกรองรับในอีกนานพอสมควร แต่สตรีมมิงมีให้แล้ว
หวังว่าจะมีใครสักคนช่วยส่งตัวอย่างเซิร์ฟเวอร์ดี ๆ เข้าไปในโค้ดเบสและช่วยแก้ปัญหาด้วย หรือไม่ก็ทำเซิร์ฟเวอร์ที่แข็งแรงสำหรับภาษาอื่นผ่าน transcribe.cpp หรือไบนดิงต่าง ๆ เมื่อเสร็จแล้วก็ยินดีจะเชื่อมเข้ากับโปรเจ็กต์หลักโดยตรงด้วย