AnySpeechRecognizer: ASR cục bộ và diarization cho ứng dụng Swift
AnySpeechRecognizer đưa API tương tự SpeechAnalyzer tới Parakeet và Qwen3-ASR chạy Core ML, đồng thời bổ sung speaker diarization. AnyDecisionModel cung cấp câu trả lời có kiểu và xác suất cho các tác vụ quyết định trên nền tảng Apple.
Một pipeline ghi âm cuộc họp không chỉ cần transcript. Nó còn có thể cần mốc thời gian từng từ, điểm tin cậy và câu trả lời cho câu hỏi: ai nói vào lúc nào?
Hugging Face giới thiệu hai package Swift cho các tác vụ này: AnySpeechRecognizer và AnyDecisionModel. Trong đó, AnySpeechRecognizer bám theo API SpeechAnalyzer của Apple nhưng cho phép thay engine nhận dạng bằng NVIDIA Parakeet hoặc Alibaba Qwen3-ASR chạy cục bộ qua Core ML. Package cũng bổ sung SpeakerDiarizer để phân tách người nói trên transcript.
Với lập trình viên Apple, điểm đáng chú ý là có thể giữ mô hình xử lý audio quen thuộc — gồm cài asset, đưa file hoặc audio buffer vào analyzer và đọc kết quả bất đồng bộ — trong khi đổi model theo nhu cầu.
API tương tự SpeechAnalyzer, nhưng có thêm lựa chọn engine
Apple giới thiệu SpeechAnalyzer trên macOS 26 và iOS 26. API này dùng các module như SpeechTranscriber và SpeechDetector; ứng dụng đưa vào file hoặc luồng audio buffer, rồi đọc kết quả qua async sequence. AssetInventory giúp ứng dụng chủ động quyết định thời điểm tải model.
AnySpeechRecognizer mô phỏng các thành phần chính:
SpeechAnalyzer
SpeechTranscriber
DictationTranscriber
SpeechDetector
AssetInventory
Apple Speech vẫn là engine mặc định. Với mã đã dùng API chung, thay đổi ban đầu có thể chỉ là đổi import:
swift
import Speech
+ import AnySpeechRecognizer
Khi dùng một transcriber khác, các bước cài asset, tạo analyzer và đọc kết quả vẫn theo cùng luồng.
Dùng Parakeet cho transcript file và thời gian thực
Để dùng Parakeet v3, phần khởi tạo transcriber có thể như sau:
swift
let transcriber = SpeechTranscriber(
model: ParakeetSpeechModel(variant: .v3),
transcriptionOptions: [],
reportingOptions: [.volatileResults],
attributeOptions: [.audioTimeRange]
)
volatileResults là kết quả tạm thời khi audio vẫn đang được xử lý, phù hợp với giao diện transcript cập nhật liên tục. audioTimeRange bổ sung khoảng thời gian audio tương ứng với kết quả.
Package hỗ trợ ba biến thể Parakeet:
Parakeet v3: nhận dạng 25 ngôn ngữ châu Âu và tự phát hiện ngôn ngữ.
Parakeet Ultra: phiên bản post-trained từ Parakeet v3 của Moondream; theo phép đo của nhóm phát triển, có độ chính xác cao hơn v3 trong phần lớn trường hợp họ thử nghiệm.
Parakeet Unified: biến thể chỉ hỗ trợ tiếng Anh.
Các model Parakeet chạy trên Core ML runtime của package và hỗ trợ input từ file lẫn input trực tiếp, kết quả tạm thời, mốc thời gian theo từ và điểm confidence theo từ.
Các bản chuyển đổi Core ML được nêu trong bài gồm:
mattt/parakeet-tdt-0.6b-v3-coreml
mattt/parakeet-ultra-coreml
mattt/parakeet-unified-en-0.6b-coreml
Hai model đầu dùng giấy phép CC BY 4.0; Parakeet Unified dùng NVIDIA Open Model License. Khi triển khai sản phẩm, cần kiểm tra giấy phép của checkpoint cụ thể đang sử dụng.
Khi nào Qwen3-ASR phù hợp hơn?
Qwen3-ASR có hai kích thước 0.6B và 1.7B. Theo bài giới thiệu, model hỗ trợ 30 ngôn ngữ và 22 phương ngữ tiếng Trung, bao gồm Mandarin, Cantonese, tiếng Nhật và tiếng Hàn — các phạm vi mà Parakeet nêu trên không bao phủ.
Có thể để model tự nhận diện ngôn ngữ hoặc chỉ định trước, ví dụ Cantonese:
swift
let transcriber = SpeechTranscriber(
model: QwenSpeechModel(
variant: .large,
language: Locale.Language(identifier: "yue")
),
transcriptionOptions: [],
reportingOptions: [],
attributeOptions: []
)
Khác với Parakeet, Qwen3-ASR trả về một kết quả cuối cho từng segment tối đa 40 giây. Model không cung cấp kết quả tạm thời, word timing hoặc confidence. Nó chạy trên GPU, chậm hơn Parakeet và được tác giả đánh giá phù hợp hơn với việc chép lời từ file thay vì input trực tiếp.
| Nhu cầu | Lựa chọn đáng cân nhắc |
|---|---|
| Transcript cập nhật liên tục | Parakeet |
| Cần timing và confidence theo từ | Parakeet |
| Audio tiếng Nhật, Hàn hoặc Cantonese | Qwen3-ASR |
| Xử lý transcript từ file | Qwen3-ASR có thể phù hợp |
| Chỉ phục vụ tiếng Anh | Parakeet Unified |
Hai repository Core ML của Qwen3-ASR là mattt/qwen3-asr-0.6b-coreml và mattt/qwen3-asr-1.7b-coreml; chúng dùng giấy phép Apache 2.0.
Thêm diarization để phân tách người nói
Speaker diarization là tác vụ xác định các người nói khác nhau trên timeline. Nó không nhằm xác minh danh tính người nói, mà gắn các đoạn hoặc từ trong transcript với từng speaker.
AnySpeechRecognizer bổ sung SpeakerDiarizer, chạy NVIDIA Streaming Sortformer trên Core ML cạnh transcriber Apple hoặc Parakeet:
swift
let diarizer = SpeakerDiarizer(
model: SortformerDiarizationModel()
)
if let request = try await AssetInventory.assetInstallationRequest(
supporting: [transcriber, diarizer]
) {
try await request.downloadAndInstall()
}
let analyzer = SpeechAnalyzer(modules: [transcriber, diarizer])
SpeakerTimeline thu thập kết quả diarization và gán từng từ có mốc thời gian vào speaker tương ứng. Điều này có thể hữu ích khi hiển thị transcript theo lượt nói hoặc tạo biên bản cuộc họp.
Sortformer theo dõi tối đa bốn người nói, kể cả khi có chồng tiếng. Package dùng Sortformer v2 theo mặc định; cũng có thể chọn v2.1. Theo tác giả, v2.1 được NVIDIA huấn luyện với thêm dữ liệu họp và cho kết quả tốt hơn trên các phép đo cuộc họp của họ.
Dung lượng model và benchmark cần được đặt đúng bối cảnh
Asset chỉ được tải khi ứng dụng yêu cầu. Kích thước được công bố gồm:
Mỗi model Parakeet: khoảng 600 MB.
Live encoder của Parakeet: thêm khoảng 590 MB.
Qwen3-ASR: khoảng 0,9–2,4 GB.
Sortformer: khoảng 250 MB.
Với ứng dụng Mac ngoài sandbox, các file có thể nằm trong Hugging Face cache tiêu chuẩn và được chia sẻ với Python hoặc công cụ Hugging Face khác trên cùng máy.
Nhóm phát triển đo hiệu năng bằng công cụ hear trên Mac Studio M4 Max chạy macOS 27.0.1, với các file LibriSpeech dài 3–8 phút. Trong thiết lập đó, Parakeet chép lời một giờ audio từ file trong khoảng 20–40 giây; chế độ live mất khoảng 1,5–2,5 phút. Sau khi Core ML biên dịch model, mức dùng bộ nhớ được báo cáo là khoảng 100 MB.
Tuy nhiên, đây không phải cam kết hiệu năng cho mọi ứng dụng. Trên bản ghi AMI có tiếng nói chồng lấn, mọi engine được thử đều có word error rate trên 23%. Qwen3-ASR được mô tả là chậm hơn và cần vài GB bộ nhớ.
Bài viết cũng nêu rằng các thử nghiệm mới thực hiện trên macOS 27, chưa thử trên iPhone. Vì vậy, ứng dụng nhắm tới iOS nên đo trực tiếp trên thiết bị mục tiêu, đặc biệt với các model có dung lượng tải lớn.
AnyDecisionModel: thay text tự do bằng câu trả lời có kiểu
Package thứ hai, AnyDecisionModel, dành cho các câu hỏi yes/no, multiple-choice và rating scale. Thay vì yêu cầu mô hình ngôn ngữ sinh text rồi tự parse kết quả như “urgent” hay “not urgent”, package lấy đáp án từ xác suất model gán cho các lựa chọn.
AnyDecisionModel trả về kết quả có kiểu cùng xác suất và có thể dùng model chạy trên thiết bị qua MLX, Core AI hoặc llama.cpp, hoặc dùng decision model từ Jev và Ollama.
Một hướng ghép nối có thể là:
> ASR → diarization → phân loại có cấu trúc
Chẳng hạn, transcript theo từng lượt nói có thể trở thành đầu vào cho một tác vụ phân loại mức độ khẩn cấp hoặc định tuyến ticket. Cách tiếp cận này giúp đầu ra ở bước quyết định rõ cấu trúc hơn so với text sinh tự do.
Điểm chốt
AnySpeechRecognizer không thay thế nhu cầu đánh giá trên audio thật, phần cứng thật và ngôn ngữ mục tiêu. Nhưng package này cung cấp một lớp API quen thuộc với lập trình viên Apple để thử Parakeet, Qwen3-ASR và speaker diarization mà không phải thiết kế lại toàn bộ pipeline xử lý audio cho từng engine.