Chạy một tác nhân giọng nói ngay trên thiết bị
một pipeline, ba ngân sách bộ nhớ.
Một tác nhân giọng nói cục bộ không phải một mô hình — nó là pipeline gồm bốn: phát hiện hoạt động giọng nói, chuyển giọng nói thành văn bản, một mô hình ngôn ngữ và tổng hợp giọng nói, nối với nhau bằng một máy trạng thái quản lý lượt nói. Pipeline giống nhau trên điện thoại và laptop. Điều thay đổi là mô hình nào đặt vào mỗi ô, và điều đó do hai con số quyết định: bạn có bao nhiêu bộ nhớ, và bạn đang nuôi bộ tăng tốc nào.
Con số cần nhớ là cả vòng lặp, không phải một mô hình: tri giác giọng nói (STT) + sinh câu trả lời (LLM) + tổng hợp giọng nói (TTS) đều nằm gọn bên trong — ~1,2 GB trên iPhone, ~1,5 GB trên Galaxy S23, và dưới ~4 GB trên Mac với một bộ não trò chuyện thực thụ.
Pipeline mới là phần khả chuyển.
Phần điều phối nằm trong speech-core dưới dạng một máy trạng thái C++ thuần, không phụ thuộc mô hình: bốn giai đoạn đều là interface để bạn cắm bất kỳ backend nào — ONNX, LiteRT, CoreML/MLX trên thiết bị, hoặc thậm chí một API đám mây — nên cùng một pipeline chạy bộ gọi công cụ 270M trên điện thoại và bộ não Gemma 4 trên Mac.
Một vòng lặp, bốn giai đoạn. Từ đánh thức, AEC và tăng cường là các bước tùy chọn trước VAD; chính các lệnh gọi công cụ của LLM mới khiến nó hành động, chứ không chỉ trả lời.
Bộ điều phối là VoicePipeline trong speech-core. Nó lo phát hiện lượt nói, ngắt lời, lịch sử hội thoại, vòng lặp gọi công cụ và hàng đợi giọng nói — nhưng không có mô hình nào của riêng nó. Mỗi giai đoạn có thể thay thế sau một interface (VADInterface, STTInterface, LLMInterface, TTSInterface) mà bạn hiện thực bằng ONNX Runtime, LiteRT, CoreML/MLX (qua thư viện chị em speech-swift), hoặc thậm chí một API đám mây. Còn có các chế độ nhẹ hơn — Echo (VAD → STT → TTS) và TranscribeOnly (VAD → STT → văn bản).
NPU trước, và cả vòng lặp gói trong ~1,5 GB.
Trên điện thoại, ràng buộc là bộ nhớ, pin và nhiệt — không phải sức tính toán thô. Mục tiêu đúng là đơn vị xử lý thần kinh (NPU): Neural Engine của Apple trên iOS, NNAPI / Hexagon trên Android. Nó chạy các transformer đã lượng tử hóa với một phần nhỏ năng lượng của CPU hay GPU và để CPU rảnh cho âm thanh và giao diện.
Vì sao là NPU chứ không phải CPU hay GPU? NPU là một cỗ máy luồng dữ liệu chức năng cố định, dựng cho một việc — phép nhân-cộng độ chính xác thấp làm nên mạng nơ-ron. Nó giữ trọng số trong SRAM trên chip ngay cạnh các đơn vị tính toán và bỏ qua việc nạp/giải mã lệnh cùng các đường dữ liệu tổng quát rộng vốn ngốn phần lớn năng lượng của CPU hay GPU. Di chuyển dữ liệu tốn hơn nhiều so với tính toán, nên giữ cả hai cục bộ chính là cái lợi: cùng những phép nhân ma trận chạy với một phần nhỏ số watt — không giảm xung vì nhiệt, không hao pin, và CPU rảnh cho mọi thứ khác.
Nên pipeline di động là các mô hình nhỏ, đã lượng tử hóa, thân thiện NPU: Silero VAD, Parakeet-EOU 120M (STT phát trực tuyến nhẹ, tích hợp phát hiện kết thúc lời nói), FunctionGemma 270M (bộ não gọi công cụ), và Kokoro-82M hoặc Supertonic-3 cho giọng. Đo trên thiết bị:
| Giai đoạn · mô hình | iPhone 16 Pro (CoreML / ANE) | Galaxy S23 (LiteRT / ONNX, CPU) |
|---|---|---|
| STT · Parakeet-EOU 120M | 0.04 RTF · 297 MB | 0.21 RTF · 232 MB |
| STT · Omnilingual 300M | 0.28 RTF · 495 MB | 0.15 RTF · 831 MB |
| TTS · Kokoro-82M | 0.08 RTF · 676 MB | 0.53 RTF · 640 MB |
| TTS · Supertonic-3 99M | 0.15 RTF · 956 MB | 0.34 RTF · 832 MB |
| LLM · FunctionGemma 270M | 128 tok/s · 236 MB | 118 tok/s · 611 MB |
RTF = thời gian thực ÷ số giây âm thanh (thấp hơn = nhanh hơn; <1,0 là nhanh hơn thời gian thực). Bộ nhớ đỉnh tính riêng từng mô hình.
Mọi giai đoạn đều vượt thời gian thực. Nạp cùng nhau cho một tác nhân trực tiếp, tập làm việc thường trú là ~1,2 GB trên iPhone và ~1,5 GB trên Galaxy S23 — khoảng cách gần như hoàn toàn là LLM: FunctionGemma tốn 236 MB trên ANE so với 611 MB trên CPU của S23. iOS đã chạy trên NPU (nên STT 0,04 RTF và LLM 128 tok/s); Android hôm nay chạy thời gian thực trên CPU, còn delegate NNAPI/Hexagon là lợi thế thêm, chứ không phải điều kiện tiên quyết.
Thử ngay: Examples/iOSEchoDemo chạy Parakeet + Silero + Kokoro thành một vòng lặp echo đầy đủ trên iPhone; phía Android nằm trong speech-android, bọc cùng một pipeline. (Examples/iOSBenchmark là công cụ đứng sau các con số iPhone ở trên.)
Một LLM thực thụ điều khiển máy — vẫn dưới 4 GB.
Trên Mac, ràng buộc nới ra: bộ nhớ hợp nhất chia sẻ giữa CPU và GPU Metal. Vẫn bốn giai đoạn, mô hình lớn hơn, và quan trọng là một bộ não trò chuyện thực thụ thay cho bộ gọi công cụ 270M — và cả vòng lặp vẫn gói trong ~4 GB.
LLM là bộ não, và đây là nơi kích thước mô hình thôi còn tùy chọn. Sau khi thử, hai mô hình giành được chỗ: FunctionGemma 270M trên di động (đủ để phát một lệnh gọi công cụ, tất cả những gì một tác nhân phía điện thoại cần) và Gemma 4 E2B/E4B (4-bit MLX) trên máy để bàn (hội thoại nhiều lượt và suy luận thực thụ trụ được, mà vẫn nhẹ). Lựa chọn ở giữa đầy cám dỗ — một đầu chat gọn dưới 1B — nhìn có vẻ miễn phí về dung lượng nhưng lung lay trong hội thoại nhiều lượt thực tế, nên bị loại. Bước nhảy đáng kể không phải 0,27B → 0,8B; mà là từ lệnh gọi công cụ của FunctionGemma đến hội thoại của Gemma 4.
Phần còn lại của stack cũng nâng cấp: máy để bàn đổi Parakeet-EOU nhẹ lấy Parakeet-TDT (đa ngôn ngữ đầy đủ), và TTS ở đâu cũng là Supertonic-3 — nhanh, 44,1 kHz, ổn định. Chúng tôi cố ý bỏ qua các mô hình TTS nhân bản zero-shot nặng hơn; nhân bản chưa đủ ổn định để nằm trong một tác nhân luôn bật.
| Giai đoạn | Di động | Máy để bàn (Mac / MLX) |
|---|---|---|
| VAD | Silero v6.2.1 | Silero v6.2.1 |
| STT | Parakeet-EOU (streaming) | Parakeet-TDT (multilingual) |
| LLM | FunctionGemma 270M | Gemma 4 E2B/E4B |
| TTS | Kokoro-82M / Supertonic-3 | Supertonic-3 |
| Resident set | iPhone ~1.2 GB · S23 ~1.5 GB | ~4 GB |
Con đường máy để bàn đó chính là những gì Runner Agent giao — một ứng dụng macOS đã công chứng, chạy Mic → VAD → Parakeet-TDT → Gemma 4 → Supertonic TTS hoàn toàn cục bộ, một DMG 47 MB với cả vòng lặp quanh ~4 GB trên Apple Silicon. Và vì bộ não phát lệnh gọi công cụ, Runner không chỉ đáp lời — nó điều khiển máy bằng giọng nói: mở trình duyệt và chạy thao tác DOM, mở Telegram hay WhatsApp để đọc tin nhắn đến và gõ trả lời, khởi chạy và điều khiển ứng dụng — tất cả từ lệnh nói, tất cả cục bộ. Đó là lý do thật sự khiến máy để bàn cần Gemma 4 chứ không phải bộ gọi công cụ 270M: hành động lên máy đòi hỏi suy luận thật, không chỉ điền ô.
Một pipeline, khớp với ngân sách.
VAD → STT → LLM → TTS giống nhau ở mọi nơi. Điều thú vị là khớp mỗi giai đoạn với bộ tăng tốc và bộ nhớ của thiết bị.
Pin và nhiệt chọn mô hình. ANE khiến iOS gần như miễn phí về CPU; Android hôm nay chạy thời gian thực trên CPU, với dư địa NPU sắp tới.
Cả vòng lặp gói trong ~4 GB, và ngân sách đó mua được suy luận Gemma 4 điều khiển máy bằng giọng nói, cùng Parakeet-TDT đa ngôn ngữ.
Âm thanh và trạng thái hội thoại không bao giờ rời thiết bị — tri giác, suy luận và tổng hợp đều chạy trên phần cứng trước mặt bạn.
