Robot điều khiển bằng giọng nói - 3 cách làm từ dễ đến khó với ESP32

Ba kiến trúc cho robot nghe lệnh tiếng Việt - app điện thoại nhận giọng gửi Bluetooth, Google Assistant qua MQTT, module nhận giọng offline - kèm code mẫu. Trong bài viết này, chúng ta sẽ cùng tìm hiểu chi tiết và ứng dụng thực tế trong robot.
"Robot ơi, tiến lên!" - và ba con đường đến đó
Robot nghe lệnh giọng nói là dự án khiến mọi khán giả trầm trồ, nhưng cụm từ "điều khiển bằng giọng nói" che giấu một quyết định kiến trúc quan trọng: việc nhận diện giọng nói chạy ở đâu? ESP32 không đủ sức tự nghe hiểu tiếng người (trừ vài từ khóa cứng) — nên mọi giải pháp thực tế đều mượn sức một thiết bị khác. Ba con đường, xếp theo độ khó:
| Con đường | Nhận diện chạy ở | Tiếng Việt | Offline | Độ khó | Chi phí thêm |
|---|---|---|---|---|---|
| 1. App điện thoại → Bluetooth | Điện thoại (Google) | Có, rất tốt | Không | Dễ | 0 đ |
| 2. Trợ lý ảo → MQTT | Cloud Google/Alexa | Có | Không | Trung bình | 0 đ |
| 3. Module nhận giọng offline | Module chuyên dụng | Hạn chế | Có | Trung bình | 150.000-300.000 đ |
Con đường 1 - App điện thoại nhận giọng, gửi lệnh Bluetooth (khuyến nghị bắt đầu)
Kiến trúc: micro + engine nhận giọng của chính điện thoại (Google Speech, hỗ trợ tiếng Việt xuất sắc) → app chuyển chuỗi văn bản qua Bluetooth → ESP32 chỉ việc so khớp chuỗi và chạy motor. Robot không cần micro, không cần thư viện AI — mọi phần khó đã có sẵn trong túi quần bạn.
Phía app - không cần viết code mobile
Hai lựa chọn:
- App có sẵn: "BT Voice Control for Arduino" (Android) — nói là gửi chuỗi văn bản qua Bluetooth Classic, dùng ngay
- MIT App Inventor (30 phút): khối SpeechRecognizer + BluetoothClient — nói xong
resultgửi thẳng qua Bluetooth; tự làm được app tiếng Việt riêng với giao diện của mình (nền tảng từ bài Làm app điều khiển robot ở mục Kiến thức)
Phía ESP32 - so khớp từ khóa
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
unsigned long lastCmd = 0;
void setup() {
Serial.begin(115200);
setupMotors(); // drive() như các bài xe robot
SerialBT.begin("RobotGiongNoi");
}
String normalize(String s) {
s.trim();
s.toLowerCase();
return s;
}
void loop() {
if (SerialBT.available()) {
String said = normalize(SerialBT.readStringUntil('\n'));
Serial.println("Nghe thay: " + said);
lastCmd = millis();
// so khớp CHỨA từ khóa - bền hơn so sánh bằng tuyệt đối
if (said.indexOf("tien") >= 0 || said.indexOf("tiến") >= 0) drive(180, 180);
else if (said.indexOf("lui") >= 0 || said.indexOf("lùi") >= 0) drive(-160, -160);
else if (said.indexOf("trai") >= 0 || said.indexOf("trái") >= 0) drive(-140, 140);
else if (said.indexOf("phai") >= 0 || said.indexOf("phải") >= 0) drive(140, -140);
else if (said.indexOf("dung") >= 0 || said.indexOf("dừng") >= 0) drive(0, 0);
else if (said.indexOf("xoay") >= 0) { drive(150, -150); delay(1200); drive(0, 0); }
}
// giọng nói là lệnh RỜI RẠC: tự dừng sau 2 giây nếu không có lệnh mới
if (millis() - lastCmd > 2000 && lastCmd != 0) {
drive(0, 0);
lastCmd = 0;
}
}Ba kinh nghiệm quyết định trải nghiệm:
- So khớp `indexOf` thay vì so bằng: người dùng nói "cho xe tiến lên nào" — miễn chứa "tiến" là chạy; app có thể gửi kèm dấu hoặc không dấu nên bắt cả hai biến thể
- Tự dừng sau 2 giây: khác tay cầm giữ-để-chạy, lệnh giọng nói là xung rời rạc — không có cơ chế tự dừng, robot "tiến" sẽ tiến đến khi húc tường; đây là failsafe phiên bản giọng nói
- Nói ngắn: huấn luyện người dùng hô "tiến", "dừng" thay vì cả câu — nhận diện nhanh hơn 2-3 lần, trễ từ lúc nói đến lúc xe chạy còn ~1 giây
Con đường 2 - "Ok Google, bảo robot tuần tra" qua MQTT
Muốn ra lệnh khi không cầm điện thoại mở app — qua loa thông minh, hoặc từ xa hẳn qua Internet? Kiến trúc: trợ lý ảo nhận giọng → dịch vụ cầu nối kích hoạt webhook → publish lệnh lên MQTT broker → robot subscribe và thi hành (nền tảng bài MQTT nhập môn ở mục Kiến thức).
Đường lắp phổ biến không cần server riêng: Google Assistant + IFTTT (câu lệnh tùy chỉnh → webhook) → dịch vụ chuyển webhook-sang-MQTT, hoặc gọn hơn nếu nhà đã chạy Home Assistant: khai robot như một thiết bị MQTT, mọi trợ lý giọng nói tích hợp sẵn đều sai khiến được.
Đặc tính cần biết trước: độ trễ 2-5 giây (đường vòng qua cloud) — hợp lệnh chế độ ("tuần tra đi", "về chỗ sạc", "bật đèn") chứ không lái xe thời gian thực. Và phụ thuộc Internet hoàn toàn.
Con đường 3 - Module nhận giọng offline
Không Internet, không điện thoại — robot tự nghe bằng module chuyên dụng:
- Voice Recognition Module V3 (~200.000 đ): huấn luyện ~7 lệnh bằng chính giọng bạn (thu 2 lần mỗi lệnh), giao tiếp UART về ESP32. Ưu: nói tiếng gì cũng được vì so khớp âm thanh thô — "tiến lên" tiếng Việt học ngon lành. Nhược: nhạy người nói (giọng bạn thu thì bạn nói mới ăn), kỵ nơi ồn
- DFRobot Gravity Voice Recognition / các module ASR đời mới (~250.000-350.000 đ): nhận diện độc lập người nói với bộ từ khóa cố định (chủ yếu tiếng Anh/Trung) + từ khóa tự thêm. Ổn định hơn V3 ở lớp học ồn
Phía ESP32 nhận mã lệnh qua UART — cùng khung code con đường 1, thay SerialBT bằng Serial2. Con đường này dạy một bài học hệ thống hay: đánh đổi giữa thông minh (cloud) và tự chủ (offline) — đúng trade-off mà xe tự lái, loa thông minh thật đang đối mặt.
So sánh nhanh để chốt phương án
- Buổi demo, lớp học, người mới: con đường 1 — 1 buổi xong, tiếng Việt chuẩn, chi phí 0
- Nhà thông minh, ra lệnh rảnh tay: con đường 2 — chấp nhận trễ, được cái "Ok Google" sang miệng
- Thi KHKT, nơi không mạng, thích phần cứng: con đường 3 — độc lập hoàn toàn, kể chuyện kỹ thuật hay hơn ("robot của em tự nghe, không cần Internet")
Cả ba dùng chung phần xe + hàm drive() — làm con đường 1 trước, hai con đường sau chỉ là thay "đôi tai".
Câu hỏi thường gặp
Robot nhận giọng nói tiếng Việt có tốt không?
Con đường 1 và 2: rất tốt — engine của Google đứng đầu về tiếng Việt, câu dài phương ngữ đều ổn. Con đường 3: module V3 học giọng bạn nên tiếng Việt chạy được nhưng chỉ vài lệnh và kén người nói. Điểm yếu thực tế của mọi phương án là môi trường ồn — demo nơi đông người nên có phương án dự phòng bằng nút bấm trên app.
ESP32 tự nhận giọng nói không cần gì thêm được không?
Được ở mức từ khóa đơn giản: ESP32-S3 + micro I2S chạy được mô hình wake-word TinyML (ESP-SR của Espressif, hoặc Edge Impulse tự huấn luyện "robot ơi"). Đây là đất dự án nâng cao rất hay cho học sinh chuyên — nhưng là hành trình vài tuần, không phải buổi chiều; bắt đầu bằng con đường 1 để có sản phẩm chạy trước.
Vì sao app nghe đúng chữ mà robot không chạy?
Debug theo chuỗi: Serial Monitor in ra chuỗi nhận được chưa? (chưa → lỗi Bluetooth/app); chuỗi in ra có dấu/không dấu, hoa/thường thế nào so với từ khóa đang so? (hàm normalize + bắt cả hai biến thể như code mẫu); có ký tự xuống dòng thừa không? (readStringUntil('\n') + trim() xử lý). 90% ca rơi vào khâu so khớp chuỗi.
Điều khiển giọng nói có an toàn không?
Thêm hai lớp: từ đánh thức trong câu lệnh (chỉ nhận câu chứa tên robot — "Bin ơi tiến" thay vì "tiến" trần, tránh robot chạy khi mọi người nói chuyện) và giới hạn tốc độ ở chế độ giọng nói thấp hơn chế độ tay cầm — phản xạ hô "dừng" chậm hơn buông nút nhiều.
Tài nguyên tải về
Tải bản PDF của bài viết để in giáo án hoặc gửi trước cho học viên.



