- Mô hình PersonaPlex 7B được triển khai bằng Swift/MLX trên Apple Silicon hỗ trợ hội thoại giọng nói song công thời gian thực
- Tích hợp pipeline giọng nói 3 bước truyền thống ASR→LLM→TTS vào một mô hình duy nhất, xử lý trực tiếp âm thanh đầu vào và đầu ra mà không cần chuyển đổi sang văn bản
- Lượng tử hóa 4 bit (quantization) giúp giảm kích thước mô hình từ 16,7GB xuống 5,3GB, đồng thời đạt 68ms/bước (RTF 0,87), tức tốc độ xử lý nhanh hơn thời gian thực
- Sử dụng codec âm thanh Mimi và kiến trúc Depformer để triển khai streaming hiệu quả mà không làm giảm chất lượng giọng nói
- Hoạt động trực tiếp trong môi trường Swift native mà không cần máy chủ, là công nghệ nền tảng quan trọng cho trợ lý giọng nói và tác tử hội thoại
Tích hợp qwen3-asr-swift và PersonaPlex 7B
- Thư viện qwen3-asr-swift đã tích hợp NVIDIA PersonaPlex 7B trên Apple Silicon để hỗ trợ hội thoại giọng nói song công (full-duplex speech-to-speech)
- Xử lý âm thanh đầu vào theo thời gian thực đồng thời tạo ra âm thanh phản hồi
- Được mở rộng thành thư viện xử lý giọng nói hợp nhất bao gồm ASR, TTS và tổng hợp đa ngôn ngữ
- Mô hình được cung cấp dưới dạng bản 5,3GB đã lượng tử hóa 4 bit trên Hugging Face tại
aufklarer/PersonaPlex-7B-MLX-4bit
Hợp nhất pipeline giọng nói truyền thống
- Trợ lý giọng nói truyền thống dùng kiến trúc 3 bước ASR → LLM → TTS, trong đó mỗi bước đều phát sinh độ trễ (latency) và mất sắc thái cảm xúc
- PersonaPlex hợp nhất chúng thành một mô hình duy nhất, xử lý trực tiếp audio tokens
- Chuyển đổi âm thanh theo thời gian thực qua 17 luồng song song (12,5Hz)
- Dựa trên kiến trúc Moshi của Kyutai, hỗ trợ 18 preset giọng nói và system prompt theo vai trò
Kiến trúc mô hình và chuyển đổi
- Checkpoint PyTorch 16,7GB gốc được chuyển đổi sang safetensors tối ưu cho MLX
- Script chuyển đổi (
convert_personaplex.py) tự động xử lý phân loại trọng số, lượng tử hóa 4 bit, trích xuất preset và tải lên Hugging Face
- Cả Temporal Transformer (7B tham số) và Depformer đều được nén xuống 4 bit
- Depformer sử dụng cấu trúc chuyển đổi trọng số theo từng bước (MultiLinear) để giảm từ 2,4GB xuống 650MB
- Giảm dung lượng 3,7 lần mà không làm suy giảm chất lượng
Pipeline xử lý giọng nói
- Thông qua Mimi Encoder/Decoder, âm thanh 24kHz được chuyển thành 16 token codebook
- Temporal Transformer xử lý hợp nhất luồng âm thanh của người dùng và tác tử
- Depformer tạo token âm thanh của tác tử qua 16 bước
- Mimi Decoder khôi phục chúng trở lại thành âm thanh 24kHz
- Các thành phần của mô hình TTS hiện có như codec Mimi, KV cache, RoPE, SwiGLU, RMSNorm được tái sử dụng nguyên trạng
System prompt và điều khiển hội thoại
- PersonaPlex điều khiển phong cách hội thoại bằng system prompt dựa trên văn bản
- Nếu không có prompt, mô hình có thể đi chệch chủ đề hoặc phản hồi dài dòng
- Có thể chọn preset như assistant, customer service, teacher từ CLI hoặc API
- Ngay cả với cùng một câu hỏi, chất lượng phản hồi thay đổi đáng kể tùy theo có prompt hay không
Hiệu năng và xử lý thời gian thực
- Trên M2 Max (64GB), mô hình đạt 68ms/bước, RTF 0,87, tức tốc độ xử lý nhanh hơn thời gian thực
- Hoạt động ổn định trong ngân sách khung hình 80ms (12,5Hz)
- Có thể kiểm thử tích hợp ASR, TTS, Speech-to-Speech trong cùng một thư viện
- Xác minh E2E kiểm tra tính nhất quán theo chủ đề bằng cách dùng ASR để chuyển âm thanh phản hồi ngược lại thành văn bản
Streaming và tối ưu hóa
- API
respondStream() tạo các đoạn âm thanh theo đơn vị 2 giây theo thời gian thực
- Có thể phát ngay dưới dạng AsyncThrowingStream<AudioChunk>
- Bốn tối ưu hóa chính:
- Tích hợp eval() để giảm đồng bộ GPU
- Bulk audio extraction để tăng hiệu quả giải mã
- Prefill batching để xử lý song song ở giai đoạn đầu
- Biên dịch temporal transformer để tối ưu hơn 450 lần gọi kernel Metal
- Có thể kích hoạt kernel fusion bằng cờ
--compile hoặc model.warmUp()
Chạy và triển khai
- Kho GitHub: ivan-digital/qwen3-asr-swift
- Sau khi build bằng
swift build -c release, có thể chạy ASR, TTS, Speech-to-Speech bằng lệnh CLI
- Lần chạy đầu tiên cần tải về mô hình khoảng 5,3GB
- Dựa trên framework MLX, hệ thống hoạt động hoàn chỉnh trong môi trường Swift native không cần Python hay máy chủ
Ý nghĩa kỹ thuật
- Chứng minh khả năng chạy on-device mô hình giọng nói hiệu năng cao bằng cách tận dụng kiến trúc bộ nhớ hợp nhất của Apple Silicon và tăng tốc Metal
- Việc hiện thực hóa hội thoại giọng nói thời gian thực dựa trên một mô hình duy nhất mở ra nhiều ứng dụng như trợ lý AI, tổng đài, giao diện giọng nói cho giáo dục
- Được đánh giá là thành quả tích hợp của nhiều hệ sinh thái mã nguồn mở như NVIDIA, Kyutai, Alibaba Qwen, FunAudioLLM, Apple MLX
1 bình luận
Ý kiến trên Hacker News
Mình rất thích dự án này. Trước đây từng thử chạy PersonaPlex trên thiết bị Blackwell nhưng thất bại, lần này dự định sẽ thử trên Mac
Với góc nhìn của người đã làm việc với voice agent khá lâu, có vài điểm cần lưu ý. Ngay cả pipeline VAD→ASR→LLM→TTS cũng vẫn cho cảm giác thời gian thực nếu RTT dưới 1 giây. Có thể tham khảo các ví dụ như dự án ova của mình, cùng với voice-agent và parakeet.cpp
Sau khi trao đổi với cộng đồng PersonaPlex, mình thấy kiến trúc full-duplex hoàn chỉnh hiện vẫn còn khó về cả độ chính xác lẫn hiệu năng, và việc huấn luyện cũng phức tạp. Trong khi đó, cấu trúc ASR→LLM→TTS có tính mô-đun nên linh hoạt hơn nhiều, có thể tự do phối hợp LLM nhỏ và lớn, cục bộ và endpoint dựa trên API
Kiến trúc STT→LLM→TTS hiện có tương thích rất tốt với tool calling, quản lý ngữ cảnh nâng cao, RAG, v.v. Cách tách agent đối thoại trực tiếp với con người khỏi các sub-agent nội bộ hoạt động rất hiệu quả trong việc giảm độ trễ và gánh nặng ngữ cảnh
Kiến trúc full-duplex cho cảm giác năng động hơn, nhưng mình vẫn chưa hình dung rõ cách tích hợp nó vào voice agent trong thực tế. Muốn trao đổi thêm trên Discord
Vì qwen3-asr-swift đã gói ASR, TTS và PersonaPlex vào trong một gói Swift duy nhất, nên mọi thành phần cần thiết thực ra đều đã có sẵn. PersonaPlex phụ trách backchanneling độ trễ thấp và turn-taking tự nhiên, còn một LLM riêng đảm nhiệm tool calling
Vấn đề là orchestration giữa hai bên. Khi nào “bộ não” nên ghi đè “cái miệng”, làm sao để PersonaPlex không tự tin nói ra câu trả lời chưa được kiểm chứng, và xử lý thế nào khi kết quả từ tool xung đột với phát ngôn hiện tại — tất cả vẫn là bài toán chưa có lời giải
Dự án này khá thú vị, nhưng cá nhân mình vẫn muốn mô hình local 7B có khả năng tool calling. Phiên bản hiện tại mới chỉ ở mức proof of concept nhận đầu vào là file wav
Phong cách viết của bài quá giống LLM nên khiến mình nghi ngờ chất lượng dự án
Mình đã chạy demo trên MacBook M1 Max, nhưng phản hồi mất hơn 10 giây và nội dung cũng khá lạc đề
Dĩ nhiên trong một số trường hợp cụ thể thì vẫn có thể hữu ích, nhưng phần đó mình muốn tìm hiểu thêm
Công nghệ này có vẻ khá nguy hiểm. Bài liên quan: The Guardian đưa tin
Sesame là demo full-duplex tốt nhất mình từng thấy trước đây. Giờ không biết nó ra sao rồi (link)
Mình là fan của whisperKit. Gần đây nó có thêm tính năng TTS nên càng tốt hơn. Nó cũng hỗ trợ speaker diarization và từ điển tùy chỉnh
Còn có cả bài test tải chạy đồng thời 4 mô hình theo thời gian thực trên cùng một thiết bị:
Video thử nghiệm
Mình muốn tạo một hệ thống để điện thoại tự động chuyển tiếp các cuộc gọi spam sang mô hình này, rồi từ từ tung ra thông tin cá nhân giả xen lẫn chuyện thời tiết hay thể thao
Mình đang thử fine-tune PersonaPlex cho các cuộc gọi outbound. Mình áp dụng cách LoRA của Kyutai/moshi-finetune, nhưng phải tăng hệ số scaling lên 5 thì mới chạy được và lại làm hỏng các phần khác
Trong lúc review code, GPT-5.3 Codex bảo rằng speaker A/B bị đảo ngược, nên giờ mình đang tạo lại dataset.
Trên GitHub của mình (runvnc) có cả phiên bản moshi-finetune và personaplex, cùng ứng dụng Gradio để tạo dữ liệu và huấn luyện. Nhưng hiện vẫn chưa ra kết quả thực sự dùng được
Mình hay dùng MacWhisper, nhưng model Whisper Large v3 Turbo tuy ổn vẫn bị tích lũy độ trễ. Nếu hậu xử lý bằng LLM online thì chất lượng tốt hơn nhưng tốc độ chậm
Link model, FluidAudio GitHub
Cộng đồng Discord cũng rất sôi động, với nhiều thảo luận về các tính năng mới như VAD, TTS, EOU