
ESP32-S3 là một con chip đáng nể với giá vài đô la: Wi-Fi, đủ sức tính toán cho wake word, âm thanh I2S vào và ra, và một màn hình nhỏ nếu bạn muốn. Thứ nó không làm được là hiểu lời nói, suy luận về câu hỏi, nhớ người dùng hay gọi API. Vì vậy, trợ lý giọng nói trên loại phần cứng này là bài toán quyết định cái gì ở lại trên bo mạch và cái gì chuyển lên cloud.
Bài này mô tả cách chia chúng tôi dùng trên production: firmware giữ micro, loa, màn hình và cảm biến, còn cloud runtime làm nhận dạng giọng nói, mô hình ngôn ngữ, trí nhớ, kho kiến thức, công cụ và tổng hợp giọng nói. Đó là cùng runtime trả lời trên web và kênh nhắn tin, nên thiết bị là thêm một kênh của trợ lý, không phải một sản phẩm riêng.
Cách chia
| Trên ESP32-S3 | Trong cloud runtime |
|---|---|
| Wake word, thu âm, phát âm thanh | Nhận dạng giọng nói, model chat, tổng hợp giọng nói, hoặc model speech-to-speech realtime |
| Cài Wi-Fi, kết nối lại, hiển thị trạng thái | Trí nhớ, kho kiến thức, công cụ và MCP |
| Âm thanh mã hóa qua MQTT + UDP | Định tuyến phiên tới đúng trợ lý và người dùng |
| Cập nhật firmware (OTA) | Mã kích hoạt, quyền sở hữu thiết bị, danh mục firmware |
| Công cụ phần cứng do firmware khai báo (âm lượng, LED, cảm biến) | Quyết định khi nào gọi chúng, như một phần của cuộc trò chuyện |
Firmware được xây trên dự án mã nguồn mở xiaozhi-esp32 và phát hành cho bo mạch ESP32 và ESP32-S3. Vì phần nặng chạy trên cloud, thiết bị nhận mọi nâng cấp model, mọi công cụ mới và mọi thay đổi trong kho kiến thức mà không cần bản firmware mới.
Từ bo mạch trống tới cuộc trò chuyện
- Nạp firmware từ trình duyệt. Trang tài liệu nạp firmware qua Web Serial; không cần toolchain. Firmware đã trỏ sẵn tới OTA URL của nền tảng, nên bạn chỉ đổi nó khi tự build firmware riêng.
- Vào Wi-Fi. Thiết bị mở một hotspot cài đặt, bạn nhập thông tin mạng từ điện thoại.
- Đọc mã kích hoạt. Ở lần kết nối đầu, thiết bị hiện và đọc to một mã sáu chữ số.
- Đăng ký. Trong trang quản trị hoặc web app, nhập mã và chọn người sở hữu thiết bị. Từ đó thiết bị gắn với một trợ lý và một người dùng, và nói chuyện với trí nhớ của người đó cùng kho kiến thức và công cụ của trợ lý.
- Nói. Gọi wake word và hỏi. Câu trả lời phát ra loa, và cuộc trò chuyện xuất hiện trong lịch sử của người dùng như mọi cuộc khác.
Mỗi lần kết nối Wi-Fi, thiết bị gọi endpoint OTA trước. Phản hồi mang theo giờ máy chủ, mã kích hoạt nếu thiết bị chưa được liên kết, thông tin kết nối cho phiên voice, và bản cập nhật firmware khi có và chế độ tự cập nhật đang bật. Thiết bị luôn mới mà không cần nạp lại.
Vì sao MQTT + UDP, không phải WebSocket
Firmware đầu tiên của chúng tôi stream âm thanh qua WebSocket. Chuyển sang MQTT cho thông điệp điều khiển và UDP cho âm thanh đã giảm độ trễ khứ hồi trên thiết bị từ 380 ms xuống 165 ms, giảm RAM từ 45 KB xuống 12 KB, và kéo dài pin khoảng 40%, với âm thanh mã hóa AES-128 khi truyền. Số liệu đầy đủ và thiết kế giao thức nằm trong MQTT + UDP: đưa AI xuống thiết bị edge. Một gateway kết thúc các kết nối này và chuyển từng phiên cho runtime, nơi định tuyến tới đúng trợ lý.
Công cụ thiết bị: trợ lý điều khiển phần cứng
Phần thú vị của thiết bị giọng nói là cuộc trò chuyện có thể tác động lên chính thiết bị. Firmware khai báo các chức năng phần cứng thành công cụ: âm lượng, độ sáng màn hình, LED, số đọc cảm biến, hay một động cơ trên bo mạch tùy chỉnh. Trong phiên voice, những công cụ đó nằm cạnh các công cụ khác của trợ lý, và model gọi chúng khi cuộc trò chuyện cần. "Nhỏ bớt đi" trở thành một lần gọi công cụ; "trong này bao nhiêu độ" cũng vậy nếu bo mạch có cảm biến.
Công cụ thiết bị chỉ tồn tại trong phiên với thiết bị đó và do firmware khai báo, nên không cần cấu hình gì trong trang quản trị ngoài thiết lập công cụ thông thường của trợ lý. Tài nguyên tùy chỉnh, như một giao diện khác trên màn hình, có thể đẩy từ web app tới thiết bị đang online.
Realtime hay Standard trên thiết bị
Thiết bị không màn hình là nơi độ trễ quan trọng nhất, và hai chế độ voice của runtime hành xử khác nhau ở đó. Standard (nhận dạng giọng nói, model chat, tổng hợp giọng nói) phát âm thanh đầu tiên khoảng 1,8 giây sau khi người dùng ngừng nói; Realtime (một model speech-to-speech) đạt khoảng 0,7 giây và có thể bị ngắt lời tự nhiên. Đánh đổi về độ chính xác và chi phí giống như trên trình duyệt, và chúng tôi so sánh chúng trong speech-to-speech và ASR → LLM → TTS. Việc ngắt lời có hoạt động hay không phụ thuộc vào khử tiếng vọng trên bo mạch, được nói trong AEC cho trợ lý giọng nói AI.
Hôm nay nó phù hợp với gì
Stack này được xây cho loa thông minh, thiết bị đồng hành trên bàn làm việc và giao diện giọng nói cho công cụ nội bộ. Robot, đồ chơi và thiết bị trên ô tô nằm trong lộ trình: lớp thiết bị hỗ trợ chúng, nhưng chưa có sản phẩm đóng gói, và chúng tôi muốn nói rõ như vậy.
Mỗi gói cho phép một số thiết bị nhất định trên mỗi trợ lý, và phiên voice trên thiết bị dùng credit như mọi phiên voice khác. Để thử, hãy nạp firmware cho một bo mạch được hỗ trợ từ tài liệu thiết bị và đăng ký nó với một trợ lý miễn phí.