1 คะแนน โดย GN⁺ 1 일 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ความคิดเห็น

 
GN⁺ 1 일 전
ความคิดเห็นจาก Hacker News
  • ดูเจ๋งมาก แต่อ่านเอกสารของโมเดลแล้วยังไม่เจอฟังก์ชันที่ถอดเสียงเป็น สัทอักษรสากล (IPA) จากเสียงโดยตรง แทนที่จะตีความความหมายของภาษาที่ไม่เป็นที่รู้จัก
    สำหรับภาษาชนกลุ่มน้อยที่มีผู้พูดไม่ถึง 10,000 คน อาจไม่มีทรัพยากรพอสำหรับฝึกโมเดลเฉพาะภาษาไปตลอด หากมีโมเดลที่ไม่ต้องระบุภาษาก่อนและแปลงเสียงเป็น IPA ได้โดยตรง ก็น่าจะช่วยนักภาษาศาสตร์ที่ศึกษาภาษาชนกลุ่มน้อยทั่วโลกได้มาก

    • ในการพูดจริงมีทั้งการละและการกร่อนเสียงจำนวนมาก ต่อให้รู้ภาษาอยู่แล้ว การทำ การถอดหน่วยเสียง ก็ยากกว่าการถอดเป็นคำมาก มีโมเดลอย่าง https://huggingface.co/spaces/KoelLabs/IPA-Transcription-EN อยู่บ้าง แต่ก็มีอัตราความผิดพลาดสูงมาก
    • ครอบครัวฝ่ายภรรยามาจาก Iu Mien ซึ่งเป็นกลุ่มย่อยของชาว Dao/Yao ในจีน Mien เป็นภาษาหนึ่งต่างหาก แต่ผู้พูดส่วนใหญ่แทบอ่านเขียนไม่ได้ และแทบไม่มีแบบเรียนหรือคอร์สให้เรียน จึงเรียนได้ยากมาก
      เอกสารที่เป็นลายลักษณ์อักษรก็มีน้อย เลยอยากสร้างระบบแปลขึ้นมาเองแบบใน Project Hail Mary
    • แทบไม่รู้จักโมเดลที่รองรับความสามารถนี้เลย ตอนนี้จึงยังอยู่นอกขอบเขตของไลบรารี แต่ถ้ามีโมเดลที่เหมาะสมก็ยินดีรองรับ
    • มีโมเดล Automatic Phoneme Recognition (APR) อยู่บ้าง แต่ประสิทธิภาพก็แค่พอใช้
    • โมเดลแบบนี้น่าจะต้องรู้ก่อนว่าจะได้ยิน ช่วงเสียง แบบไหนจึงจะใช้งานได้จริง เสียงที่ IPA แทนได้นั้นมีจำนวนมาก แต่แต่ละภาษาจะใช้เพียงบางส่วนเท่านั้น
      เช่น dark l กับ light l ในอังกฤษ (ball/light) หรือเสียง p พ่นลมกับไม่พ่นลม (pin/spin) อาจใช้แยกความหมายในภาษาอื่น แต่ไม่ใช่ในภาษาอังกฤษ เลยสงสัยว่านักภาษาศาสตร์ต้องการ IPA ที่ถอดมาอย่างซื่อสัตย์ที่สุดก่อน แล้วค่อยปรับให้เป็นมาตรฐานด้วยมือหรือไม่
  • ขอแสดงความยินดีกับการเปิดตัว ใช้ Handy บน Mac และมือถืออยู่แล้ว และมันมีประโยชน์มากโดยเฉพาะเวลาที่ระบบรู้จำเสียงพื้นฐานของ Apple ฟังศัพท์เฉพาะทางผิด
    สงสัยว่ามีทางให้มูลนิธิช่วยออกค่าใช้จ่ายในการดูแลรักษาได้ไหม ถ้าจะรับค่าตอบแทนจากโปรเจกต์แบบนี้ ควรไปหาองค์กรแบบไหนและขอการสนับสนุนอย่างไร

    • พอ Handy ได้รับความนิยม ก็กลายเป็น ผู้ดูแลโอเพนซอร์ส โดยไม่ตั้งใจ และโชคดีที่มีเงินบริจาคส่วนบุคคลกับผู้สนับสนุนหลายรายช่วยสนับสนุนงานนี้อยู่
      อยากทำงานช่วยโอเพนซอร์สต่อไป ดังนั้นถ้าเป็นที่ที่สนับสนุนสิ่งนี้ก็ยินดีมาก โดยเฉพาะองค์กรที่เชื่อในโอเพนซอร์สและช่วยผลักดันให้เติบโต คุยรายละเอียดได้ที่ contact@handy.computer
    • ระบบป้อนตามคำบอกของ iOS ที่มากับระบบปฏิบัติการ จะอัปโหลดรายชื่อติดต่อไปยัง Apple ทุกครั้งที่ร้องขอ แม้ไม่ได้ใช้ iCloud ก็ตาม เลยต้องปิดมันไว้
  • ระบบแปลงเสียงเป็นข้อความหลายตัวรู้จำคำพูดได้แม่น แต่ไม่รองรับเวิร์กโฟลว์ที่ต้องการ ควรจะเปิดเอกสารแล้วพูด จากนั้นข้อความต้อง พิมพ์ต่อเนื่องด้วยความหน่วงต่ำที่สุด ตรงตำแหน่งเคอร์เซอร์
    แบบที่ต้องหยุดอัดแล้วค่อยวางข้อความทีเดียวไม่ค่อยมีประโยชน์ ประเด็นสำคัญคือการป้อนต่อเนื่อง

    • กลับกัน แบบถอดเสียงทีเดียวหลังอัดเสร็จกลับเหมาะกว่า พอเห็น การป้อนแบบเรียลไทม์ แล้วจะคอยเช็กความผิดพลาดของการถอดเสียง ทำให้คิดต่อเนื่องจนจบได้ยาก
      การพูดสิ่งที่อยู่ในหัวเกี่ยวกับหัวข้อหนึ่งออกมาให้หมด 5-10 นาทีแล้วค่อยทบทวน กลับช่วยไม่ให้กระแสความคิดสะดุดมากกว่า
    • ถ้าต้องการ สามารถแก้ Handy เพื่อทำแบบนี้ได้ค่อนข้างง่าย มีแผนจะเพิ่มเป็น ฟีเจอร์ทางการ ของแอปด้วย แต่ตอนนี้ยังมีเรื่องที่ต้องแก้อีกเยอะ
    • คำภาษาอังกฤษหลายคำต้องอาศัยบริบทแวดล้อมจึงจะตัดสินได้ เช่น there กับ their แยกกันไม่ได้จากการออกเสียงอย่างเดียว
    • ประโยชน์ของฟังก์ชันถอดเสียงขึ้นอยู่กับวิธีใช้งาน ระหว่างป้อนตามคำบอก หากเปิดหน้าต่างอื่นหรือดูกราฟกับข้อมูลอยู่ ก็จะมีข้อมูลช่วยหนุนสิ่งที่พูดได้ง่ายขึ้น
      บางแอปยังใช้สิ่งที่คัดลอกไว้หรือสิ่งที่กำลังดูอยู่เป็น บริบทของการถอดเสียง เพื่อปรับผลลัพธ์ให้ดีขึ้นด้วย: https://superwhisper.com/docs/common-issues/context#types-of...
    • เคยลองแนวทางนี้ที่ https://github.com/electronstudio/low_latency_dictation แต่ ความแม่นยำของโมเดลเรียลไทม์ ยังต่ำ จึงใช้โมเดลที่แม่นยำกว่าประมวลผลรอบที่สองก่อนยืนยันข้อความ
  • สงสัยว่าเหมือน Whisper.cpp ไหม คือสามารถ ป้อนบริบท เพื่อเพิ่มความแม่นยำได้มากหรือไม่

    • ได้
  • ในบรรดาภาษา binding ทั้งสี่ที่ผู้ดูแลรองรับ เวอร์ชันสำหรับ Python อยู่ที่ https://github.com/handy-computer/transcribe.cpp/tree/main/b...
    ตอนนี้ยังไม่มี PyPI binary wheel ที่รวม dependency มาให้ และไลบรารีบน PyPI ปัจจุบันเรียกไลบรารีที่ติดตั้งแยกผ่าน ctypes แต่ดูเหมือนมีแผนจะออกในอนาคต

    • ส่ง PR ไปที่ PyPI เพื่อขอพื้นที่เก็บข้อมูลเพิ่มสำหรับแพ็กเกจ CUDA แล้ว แต่ดูเหมือนยังไม่ได้รับการอนุมัติ อยากได้ความช่วยเหลือในการปรับปรุง ประสบการณ์นักพัฒนา (DX) ของ binding นี้
  • เจอเข้าพอดีในจังหวะเหมาะ ช่วงนี้ได้ยินบ่อยเรื่องการใส่ การสังเคราะห์เสียงพูด (TTS) ลงในเครื่องมือ prompt เลยอยากลองเองดู
    วงจรที่พูดความคิดยาว ๆ ออกมาให้เป็นเอกสาร แล้วค่อยแก้ไขก่อนส่งต่อให้ AI ดูน่าสนใจมาก

  • เป็นการช่วยชุมชนอย่างมหาศาล และน่าทึ่งที่ทำคนเดียว ตอนท้ายแอบคิดว่าจะมีประกาศระดมทุน Series A โผล่มาเสียอีก
    แม้ AI จะถูกใช้ปั่นผลงานคุณภาพต่ำออกมาเร็ว ๆ ได้ แต่ก็แสดงให้เห็นเหมือนกันว่าสามารถขยายความทะเยอทะยานเพื่อสร้างสิ่งที่เข้มงวดและอยู่ได้นานกว่าที่เคยได้ มองว่าแทนที่จะใส่ Transcribe.cpp ลงแอปโดยตรง ความสามารถแบบนี้ควร ใช้งานได้จากทุกที่ ผ่านระบบปฏิบัติการหรือแอปอย่าง Handy มากกว่า

    • ใช่แล้ว เป็นทั้งผู้เขียนและผู้ดูแลโปรเจกต์ และเงินบริจาคจากผู้สนับสนุนกับชุมชน Handy ช่วยได้มาก โดยเฉพาะ Mozilla AI ที่สนับสนุนงานช่วงแรก ทำให้มีเวลาพอจะเปลี่ยนความฝันลาง ๆ สำหรับ Handy ให้กลายเป็นโปรเจกต์จริงและออก v0.1.0 ได้
      สักวันหนึ่งก็อยากแจกจ่าย libtranscribe ให้เหมาะสมและทำให้มันเป็นเหมือน system library แม้ต้องใช้เวลาพอสมควรกว่าจะนิ่ง แต่คิดว่าน่าจะเป็นไปได้
  • ทำงานได้ดีกว่า transcribe-rs เดิมมาก พอลองอัปเดตให้แอปป้อนข้อมูลด้วยเสียงแบบออฟไลน์ใช้ไลบรารีตัวใหม่ด้วย ก็พบว่าความเร็วดีขึ้นมาก: https://github.com/notune/android_transcribe_app

  • ต่อไปนี้ การอนุมานบนเครื่อง จะเพิ่มขึ้นด้วยหลายเหตุผล และข้อวินิจฉัยที่ว่าหากต้องการให้แอปจำนวนมากขึ้นนำไปใช้ ก็ต้องทำให้รันและแจกจ่ายได้ง่ายนั้นถือว่าแม่นยำ
    การที่ไม่มีคำใดในบทความนี้ถูกเขียนโดย AI แต่ทั้งหมดมาจากปากหรือปลายนิ้ว ก็ยิ่งทำให้โปรเจ็กต์นี้น่าเชื่อถือและเข้าถึงได้ง่ายขึ้นด้วย

    • เครื่องมือที่เราใช้ย่อมหล่อหลอมความคิด ดังนั้นจึงเห็นด้วยกับข้ออ้างนี้ได้ยาก ระบบรู้จำเสียงพูดแบบ LLM ก็ยังคงเป็น LLM อยู่ดี และความผิดพลาดก็ถูกก่อรูปตามความคาดหวังที่ฝังอยู่ในกระบวนการฝึก รวมถึงส่งผลต่อคำที่ปรากฏบนหน้าจอด้วย
      หากใช้บ่อยเข้า ก็จะเรียนรู้ว่าการเรียงคำแบบใดถูกถอดเสียงได้อย่างแม่นยำ และสิ่งนี้จะกลายเป็นส่วนหนึ่งของกระบวนการคิด เมื่อเวลาผ่านไป 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 หรือไบนดิงต่าง ๆ เมื่อเสร็จแล้วก็ยินดีจะเชื่อมเข้ากับโปรเจ็กต์หลักโดยตรงด้วย