1 điểm bởi GN⁺ 1 ngày trước | 1 bình luận | Chia sẻ qua WhatsApp
  • transcribe.cpp là thư viện dựa trên ggml được tạo ra để dễ dàng nhúng nhiều mô hình nhận dạng giọng nói hiện đại vào ứng dụng Mac·Windows·Linux và tăng tốc bằng GPU
  • Chạy 16 họ ASR·hơn 60 mô hình trên Vulkan·Metal·CUDA·TinyBLAS và hỗ trợ cả chép lời theo luồng lẫn chép lời theo lô
  • Tất cả mô hình đều được so sánh số liệu với bản triển khai tham chiếu và kiểm thử WER bằng hàng nghìn phát ngôn, đồng thời công bố kết quả xác minh trên kho mã và Hugging Face
  • Có thể chạy các tệp .bin hiện có cho whisper.cpp và thay thế với hiệu năng tương đương trong hầu hết trường hợp, đồng thời cung cấp binding chính thức cho Python·JavaScript/TypeScript·Rust·ObjC/Swift
  • Ngay cả trên RK3566 công suất thấp cũng có thể chép lời nhanh hơn thời gian thực, giúp triển khai ASR cục bộ trên nhiều thiết bị mà không cần gửi giọng nói lên đám mây

Các ràng buộc khi triển khai ASR đa nền tảng

  • Các lựa chọn suy luận ASR đa nền tảng hiện có về thực chất gần như chỉ giới hạn ở whisper.cpp và ONNX
    • Có thể thêm MLX cho thiết bị Apple, nhưng khi đó phải hỗ trợ hai engine và port mô hình cho từng engine
    • ONNX hữu ích để thêm nhanh mô hình vào Handy, nhưng chạy chỉ trên CPU thì khó tận dụng đủ hiệu năng
  • Một số thư viện hỗ trợ nhiều mô hình lại không rõ mức độ đầu tư của tác giả, mức độ kiểm thử và kế hoạch bảo trì
    • Khó xác nhận liệu có binding để dùng trong ứng dụng desktop·mobile thực tế hay chỉ dừng ở mã demo, có benchmark hay không, và có nhanh hơn ONNX hay không
  • Dựa trên kinh nghiệm triển khai nhập liệu giọng nói đa nền tảng của Handy, cần một engine đáp ứng các điều kiện sau
    • Phải có thể tải tệp xuống và suy luận ngay
    • Phải có thể xác minh chất lượng suy luận tương đương bản triển khai tham chiếu
    • Phải chạy được trên GPU để đạt hiệu năng cao nhất
    • Phải dễ nhúng vào Handy mà không cần thư viện PyTorch cồng kềnh
    • Phải hoạt động trên Mac·Windows·Linux
  • ggml được chọn làm nền tảng để hiện thực các yêu cầu này nhờ cộng đồng mạnh và cách triển khai thuận tiện

Mô hình được hỗ trợ và phương thức tăng tốc

  • transcribe.cpp hướng tới suy luận nhanh, chính xác và hỗ trợ mô hình rộng
    • Hỗ trợ 16 họ ASR và hơn 60 mô hình và dự kiến sẽ bổ sung thêm nhiều mô hình nữa
    • Hỗ trợ phần lớn các mô hình chép lời mới nhất đã công khai, dù vẫn còn một số mô hình chưa có
    • Cung cấp cả chép lời theo luồng và chép lời theo lô
  • Tất cả mô hình được hỗ trợ đều có thể chạy trên các backend tăng tốc sau
    • Vulkan
    • Metal
    • CUDA
    • TinyBLAS
  • Benchmark theo từng mô hình được thực hiện trên môi trường Fedora với CPU Ryzen 4750U·Vulkan và trên M4 Max
  • Hỗ trợ Vulkan được xem là điều kiện tối thiểu để triển khai ứng dụng suy luận cục bộ

Bản triển khai tham chiếu và xác minh độ chính xác

  • Từ trải nghiệm khó tin tưởng độ chính xác suy luận của các mô hình .onnx lấy từ Hugging Face, tác giả đã xác minh số liệu với bản triển khai tham chiếu cho mọi mô hình
  • Cùng với so sánh số liệu, tác giả chạy kiểm tra WER toàn diện để xác nhận đầu ra có giống bản triển khai tham chiếu hay không
    • Mỗi mô hình xử lý hàng nghìn phát ngôn
    • Kết quả rất gần hoặc giống hệt bản triển khai tham chiếu
  • Dữ liệu xác minh được công bố trên kho mã transcribe.cpp và trên trang từng mô hình trong tổ chức handy-computer trên Hugging Face

Tính tương thích với whisper.cpp

  • Để có thể thay thế whisper.cpp đang dùng trong Handy, dự án đã hiện thực mức tương thích gần như thay thế trực tiếp
  • Các tệp mô hình .bin dành cho whisper.cpp được phân phối cùng Handy cũng có thể chạy trên transcribe.cpp
  • Một số cờ và tính năng của whisper.cpp hiện vẫn chưa được hỗ trợ
  • Với hầu hết mục đích sử dụng, phần triển khai whisper đã đủ ổn định và có thể thay thế whisper.cpp với hiệu năng gần tương đương

Binding ngôn ngữ và bảo trì

  • Được viết bằng C/C++ và cung cấp binding được bảo trì chính thức để triển khai chép lời cục bộ trong nhiều môi trường
    • Python
    • JavaScript/TypeScript
    • Rust
    • ObjC/Swift
  • Dự án cũng hoan nghênh đóng góp binding cho ngôn ngữ khác, nhưng người đóng góp phải đảm nhận việc bảo trì binding đó
  • Các nhu cầu thực tế của Handy đã được phản ánh vào thiết kế thư viện, và dự án có kế hoạch tiếp tục duy trì transcribe.cpp dựa trên kinh nghiệm bảo trì Handy
  • Dự án phản ánh kinh nghiệm thu được khi hỗ trợ nhiều mô hình ASR và ca sử dụng thực tế, nhưng vẫn còn những trường hợp chưa xử lý được nên đang nhận đóng góp từ bên ngoài
  • Phiên bản hiện tại là v0.1.0, vẫn còn một số phần thô ráp nên dự án mong nhận báo cáo lỗi

ASR cục bộ mở rộng tới cả thiết bị công suất thấp

  • Mục tiêu là giúp việc chạy ASR trực tiếp trên thiết bị trở nên dễ dàng hơn, qua đó giảm nhu cầu gửi giọng nói lên dịch vụ đám mây
  • Ngay cả trên CPU RK3566 hiệu năng thấp, mô hình vẫn có thể chạy nhanh hơn thời gian thực
  • Tốc độ chép lời bằng hoặc vượt thời gian thực với các mô hình mới nhất có thể hoạt động ở mức điện năng chỉ vài watt
  • Để xử lý nhiều tác vụ suy luận hơn ở cục bộ, quá trình triển khai và chạy engine suy luận trong ứng dụng cần phải trở nên đơn giản hơn
  • transcribe.cpp không thể tự mình giải quyết toàn bộ bài toán triển khai suy luận cục bộ, nhưng được phát triển như một bước giúp hạ thấp rào cản tiếp cận ASR cục bộ

Những hỗ trợ đứng sau dự án

  • Mozilla AI, chương trình BiR và Davide của Mozilla AI đã hỗ trợ dự án từ giai đoạn khám phá ban đầu khi sản phẩm còn chưa có hình hài cụ thể
  • ggml là nền tảng cốt lõi giúp việc triển khai ứng dụng suy luận cục bộ trở nên khả thi
  • Modal đã cung cấp credit dùng cho kiểm thử WER và xác minh CUDA
  • Blacksmith hỗ trợ một phần CI/CD để kiểm tra các sản phẩm phát hành
  • Hugging Face cung cấp không gian lưu trữ riêng tư cho tổ chức handy-computer để có thể tự do tải mô hình lên

Ứng dụng AI trong quá trình phát triển

  • Tác giả nhận thấy một cá nhân khó có thể tự viết từ đầu một engine quy mô như vậy dựa trên ggml chỉ trong vài tháng, nên đã sử dụng hỗ trợ AI trong quá trình phát triển
  • Phần giới thiệu dự án không được viết bằng AI mà gồm các câu do tác giả trực tiếp nói hoặc nhập

1 bình luận

 
Ý kiến từ Hacker News
  • Trông rất tuyệt. Tuy vậy, tôi không tìm thấy trong tài liệu của mô hình tính năng chuyển âm thanh thành Ký hiệu ngữ âm quốc tế (IPA), thay vì diễn giải nghĩa của một ngôn ngữ chưa được biết đến
    Với các ngôn ngữ thiểu số có chưa đến 10.000 người nói, có lẽ sẽ luôn thiếu tài nguyên để huấn luyện mô hình riêng cho từng ngôn ngữ. Nếu có một mô hình chuyển chính âm thanh sang IPA mà không cần nhận diện ngôn ngữ, nó sẽ rất hữu ích cho các nhà ngôn ngữ học nghiên cứu các ngôn ngữ thiểu số trên khắp thế giới

    • Trong lời nói thực tế có rất nhiều hiện tượng lược bỏ và rút gọn, nên ngay cả khi biết ngôn ngữ thì phiên âm âm vị vẫn khó hơn nhiều so với phiên âm theo từ. Cũng có các mô hình như https://huggingface.co/spaces/KoelLabs/IPA-Transcription-EN nhưng tỷ lệ lỗi rất cao
    • Gia đình bên vợ tôi là người Iu Mien, một phân nhóm của dân tộc Dao và Yao ở Trung Quốc. Mien là một ngôn ngữ độc lập, nhưng phần lớn người nói thực tế đều mù chữ và gần như không có giáo trình hay khóa học nào, nên rất khó học
      Cũng có rất ít tư liệu được ghi chép lại, nên tôi muốn tự làm một hệ thống dịch như trong Project Hail Mary
    • Tôi hầu như không biết mô hình nào hỗ trợ tính năng này, nên hiện nó nằm ngoài phạm vi của thư viện, nhưng nếu có mô hình phù hợp thì tôi sẵn sàng hỗ trợ
    • Có một số mô hình nhận diện âm vị tự động (APR) nhưng hiệu năng chỉ ở mức tạm được
    • Có vẻ để thực tế hữu dụng, các mô hình này cần biết phạm vi âm thanh mà chúng dự kiến sẽ nghe. IPA biểu diễn rất nhiều âm, nhưng mỗi ngôn ngữ chỉ dùng một phần trong số đó
      Chẳng hạn âm l tối và l sáng trong tiếng Anh (ball/light), hay âm p bật hơi (pin/spin), có thể phân biệt nghĩa trong ngôn ngữ khác nhưng không phải trong tiếng Anh. Tôi tự hỏi liệu các nhà ngôn ngữ học có muốn nhận một bản phiên âm IPA trung thực tối đa rồi tự chuẩn hóa thủ công hay không
  • Chúc mừng phát hành. Tôi đang dùng Handy rất tốt trên Mac và điện thoại, đặc biệt hữu ích khi nhận diện giọng nói mặc định của Apple nghe sai các thuật ngữ chuyên ngành
    Tôi tò mò liệu có thể xin một quỹ hỗ trợ chi phí bảo trì hay không. Nếu muốn được trả công cho loại dự án này, nên tìm tổ chức nào và đề nghị hỗ trợ theo cách nào?

    • Khi Handy trở nên phổ biến, tôi vô tình trở thành một người bảo trì mã nguồn mở, và may mắn là hiện có quyên góp cá nhân cùng nhiều nhà tài trợ hỗ trợ công việc này
      Tôi muốn tiếp tục đóng góp cho mã nguồn mở, nên rất hoan nghênh những nơi ủng hộ điều đó, đặc biệt là các tổ chức tin vào và thúc đẩy mã nguồn mở. Có thể trao đổi chi tiết qua contact@handy.computer
    • Tính năng đọc chính tả mặc định của hệ điều hành trên iOS buộc phải tải danh bạ lên Apple mỗi khi yêu cầu, ngay cả khi không dùng iCloud, nên tôi đành phải tắt nó
  • Nhiều hệ thống chuyển giọng nói thành văn bản nhận diện lời nói khá chính xác, nhưng không hỗ trợ đúng quy trình làm việc tôi muốn. Tôi cần mở tài liệu ra, nói, và văn bản phải được nhập liên tục với độ trễ tối thiểu tại vị trí con trỏ
    Cách dừng ghi âm rồi dán toàn bộ một lần không hữu ích; điểm mấu chốt là nhập liên tục

    • Ngược lại, tôi lại thấy cách ghi âm xong rồi phiên âm một lượt phù hợp hơn. Khi nhìn nhập theo thời gian thực, tôi khó giữ mạch suy nghĩ đến cùng vì cứ phải kiểm tra lỗi phiên âm
      Nói hết mọi thứ trong đầu về một chủ đề trong 5–10 phút rồi mới xem lại sẽ hữu ích hơn vì không làm đứt dòng suy nghĩ
    • Nếu muốn thì có thể sửa Handy khá dễ để làm được điều đó. Tôi cũng định thêm nó thành tính năng chính thức của ứng dụng, nhưng còn nhiều việc cần giải quyết trước
    • Nhiều từ tiếng Anh chỉ có thể xác định khi có ngữ cảnh xung quanh. Ví dụ theretheir không thể phân biệt chỉ bằng phát âm
    • Tính hữu ích của tính năng phiên âm thay đổi tùy theo cách dùng. Nếu trong lúc đọc chính tả mà mở cửa sổ khác hoặc xem biểu đồ và dữ liệu, sẽ dễ cung cấp thông tin hỗ trợ cho lời nói hơn
      Một số ứng dụng còn dùng cả nội dung đang sao chép hoặc đang xem làm ngữ cảnh phiên âm để cải thiện kết quả: https://superwhisper.com/docs/common-issues/context#types-of...
    • Tôi đã thử cách này ở https://github.com/electronstudio/low_latency_dictation nhưng độ chính xác của mô hình thời gian thực thấp. Vì vậy trước khi chốt văn bản, tôi chạy thêm bước xử lý thứ hai bằng một mô hình chính xác hơn
  • Tôi muốn biết liệu giống Whisper.cpp, có thể đưa ngữ cảnh vào để tăng mạnh độ chính xác hay không

    • Có thể
  • Trong bốn binding ngôn ngữ mà người bảo trì hỗ trợ, bản cho Python nằm ở https://github.com/handy-computer/transcribe.cpp/tree/main/b...
    Hiện vẫn chưa có binary wheel PyPI kèm phụ thuộc, và thư viện PyPI hiện tại gọi thư viện được cài riêng qua ctypes, nhưng có vẻ sẽ phát hành trong tương lai

    • Tôi đã gửi một PR lên PyPI để xin thêm dung lượng lưu trữ cho gói CUDA, nhưng có vẻ vẫn chưa được duyệt. Tôi rất muốn nhận được trợ giúp để cải thiện trải nghiệm nhà phát triển (DX) của binding này
  • Tôi bắt gặp nó đúng lúc. Gần đây tôi hay nghe nói về việc đưa tổng hợp giọng nói (TTS) vào các công cụ prompt, nên muốn tự thử
    Quy trình nói dài các ý tưởng nảy ra trong đầu để tạo thành tài liệu, chỉnh sửa rồi gửi cho AI nghe có vẻ rất hấp dẫn

  • Đây là một đóng góp khổng lồ cho cộng đồng, và thật đáng ngạc nhiên khi nó được làm bởi một người. Tôi cứ tưởng đến cuối sẽ có thông báo gọi vốn Series A
    AI có thể được dùng để nhanh chóng tung ra các sản phẩm chất lượng thấp, nhưng nó cũng cho thấy ta có thể mở rộng tham vọng để làm ra những thứ chặt chẽ và bền vững hơn trước. Thay vì tự nhúng Transcribe.cpp vào từng ứng dụng, tôi nghĩ những khả năng như vậy nên dùng được ở mọi nơi thông qua hệ điều hành hoặc các ứng dụng như Handy

    • Đúng vậy, tôi là tác giả kiêm người bảo trì, và sự hỗ trợ từ các nhà tài trợ cùng khoản quyên góp của cộng đồng Handy đã giúp ích rất nhiều. Đặc biệt, Mozilla AI đã hỗ trợ công việc ban đầu, giúp tôi có thời gian biến giấc mơ mơ hồ cho Handy thành một dự án thực tế và phát hành v0.1.0
      Một ngày nào đó tôi muốn phân phối libtranscribe một cách bài bản để nó trở thành giống như một thư viện hệ thống. Sẽ mất thời gian để ổn định, nhưng tôi tin là có thể
  • Hoạt động tốt hơn nhiều so với transcribe-rs trước đây. Sau khi cập nhật ứng dụng nhập giọng nói ngoại tuyến để dùng thư viện mới, tốc độ được cải thiện đáng kể: https://github.com/notune/android_transcribe_app

  • Trong tương lai, suy luận cục bộ sẽ tăng lên vì nhiều lý do, và nhận định rằng để nhiều ứng dụng dùng được hơn thì việc chạy và triển khai phải dễ dàng hơn là rất chính xác
    Việc không có từ nào trong bài viết do AI tạo ra mà đều xuất phát từ miệng hoặc ngón tay cũng khiến dự án đáng tin cậy hơn và dễ tiếp cận hơn

    • Chúng ta dùng công cụ nào thì công cụ đó sẽ định hình tư duy, nên tôi khó đồng ý với nhận định này. LLM nhận dạng giọng nói rốt cuộc vẫn là LLM, và lỗi của nó được hình thành theo những kỳ vọng nội tại trong quá trình huấn luyện, đồng thời ảnh hưởng đến cả những từ xuất hiện trên màn hình
      Dùng thường xuyên rồi thì sẽ học được những cách sắp xếp từ nào được chép lại chính xác, và điều này trở thành một phần của quá trình tư duy. Theo thời gian, LLM và tư duy đan xen vào nhau, nên kiểu sử dụng AI này cũng có thể thực sự thay đổi câu chữ cuối cùng
  • Tôi cũng từng gặp vấn đề tương tự khi tìm cách vận hành máy chủ API phiên âm cục bộ. Thứ thiếu nhất là hỗ trợ streaming và hỗ trợ các từ đặc biệt để tăng ưu tiên khi nhận dạng, nên thật mừng vì ở đây có streaming

    • Sau khi whisper.cpp xuất hiện, tôi đã tự vận hành trên máy chủ 3090 Ti. Dù có giải pháp thay thế nhanh hơn và tốt hơn xuất hiện thì nó vẫn tiếp tục hoạt động ổn định, trọng số nhỏ và đủ nhanh hơn mức cần thiết
      Chỉ cần đưa lên home server cục bộ như bên dưới là có thể dễ dàng tạo API phiên âm cục bộ. Các tham số suy luận cần tinh chỉnh đôi chút, nhưng khi đã chốt xong thì hoạt động rất tốt

      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

    • Điều chỉnh trọng số từ nhiều khả năng sẽ chỉ được hỗ trợ muộn hơn khá nhiều, nhưng streaming thì đã có sẵn
      Mong ai đó đóng góp một ví dụ máy chủ tốt cho codebase và giúp xử lý các vấn đề, hoặc tạo một máy chủ vững chắc bằng transcribe.cpp hay binding ở ngôn ngữ khác. Khi hoàn thiện, tôi cũng sẵn sàng nối trực tiếp nó vào dự án chính