Ở bài trước, chúng ta đã:
- nhận diện được giọng nói tiếng Việt bằng Vosk
- chuyển câu nói thành command nội bộ (LIGHT_ON, FAN_OFF…)
👉 Trong bài này, chúng ta sẽ làm bước quan trọng nhất:
Biến command thành hành động thực tế
Nói cách khác:
“bật đèn” → LIGHT_ON → GPIO → Đèn sáng 💡
1. Bạn sẽ làm được gì sau bài này
- Điều khiển LED/relay bằng giọng nói
- Kết nối command với GPIO
- Tạo một hệ thống Voice Assistant mini chạy thật
2. Tổng quan hệ thống
Luồng xử lý hoàn chỉnh:
Micro → Vosk → Text → Command → GPIO → Device
Ví dụ:
“tắt quạt” → FAN_OFF → GPIO LOW → Relay OFF
3. Chuẩn bị phần cứng
Option 1: Demo đơn giản (LED)
- Raspberry Pi
- LED
- Điện trở 220Ω
- Breadboard + dây
Option 2: Thực tế hơn (Relay)
- Module relay 1 kênh (5V)
- Thiết bị: đèn / quạt / ổ cắm
⚠️ Lưu ý:
- Raspberry Pi GPIO là 3.3V
- Không cấp trực tiếp 220V vào Pi
- Relay module cần loại có optocoupler (an toàn hơn)
4. Thực hiện
Sơ đồ kết nối
GPIO17 → Resistor → LED → GND
Bước 1: Cài thư viện GPIO
pip install RPi.GPIO
Bước 2: Code điều khiển GPIO
Tạo file:
control_device.py
Code cơ bản:
import RPi.GPIO as GPIO
LED_PIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
def turn_on_led():
GPIO.output(LED_PIN, GPIO.HIGH)
print("💡 Đèn ON")
def turn_off_led():
GPIO.output(LED_PIN, GPIO.LOW)
print("💡 Đèn OFF")
Bước 3: Kết nối với command parser
Từ bài 23.3, bạn đã có:
def parse_command(text):
if "bat den" in text:
return "LIGHT_ON"
elif "tat den" in text:
return "LIGHT_OFF"
👉 Bây giờ map sang action:
def execute_command(command):
if command == "LIGHT_ON":
turn_on_led()
elif command == "LIGHT_OFF":
turn_off_led()
Bước 4: Tích hợp vào voice recognition
Trong loop chính:
while True:
data = q.get()
if recognizer.AcceptWaveform(data):
result = json.loads(recognizer.Result())
text = normalize(result.get("text", ""))
print("Bạn nói:", text)
command = parse_command(text)
if command:
print("👉 Command:", command)
execute_command(command)
5. Demo thực tế
Khi chạy:
Bạn nói: bat den
👉 Command: LIGHT_ON
💡 Đèn ON
Bạn nói: tat den
👉 Command: LIGHT_OFF
💡 Đèn OFF
Điều khiển relay (quạt, đèn thật)
Nếu dùng relay:
RELAY_PIN = 18
GPIO.setup(RELAY_PIN, GPIO.OUT)
def fan_on():
GPIO.output(RELAY_PIN, GPIO.LOW) # tùy module
print("🌀 Quạt ON")
def fan_off():
GPIO.output(RELAY_PIN, GPIO.HIGH)
print("🌀 Quạt OFF")
👉 Lưu ý:
- Nhiều relay dùng LOW = ON
- Test kỹ trước khi dùng thật
Mở rộng command
def parse_command(text):
if "bat den" in text or "mo den" in text:
return "LIGHT_ON"
elif "tat den" in text:
return "LIGHT_OFF"
elif "bat quat" in text:
return "FAN_ON"
elif "tat quat" in text:
return "FAN_OFF"
6. Gợi ý nâng cấp
Bạn có thể:
- in log ra terminal
- phát âm thanh phản hồi
- hiển thị lên màn hình
Ví dụ:
print("Đã bật đèn")
7. Các lỗi thường gặp
❌ GPIO không hoạt động
- sai pin (BCM vs BOARD)
- chưa setmode
👉 Fix:
GPIO.setmode(GPIO.BCM)
❌ Đèn không sáng
- sai wiring
- thiếu điện trở
❌ Relay hoạt động ngược
- HIGH/LOW bị đảo
👉 Test:
GPIO.output(pin, GPIO.LOW)
❌ Nhận diện đúng nhưng không chạy
- command không match
👉 debug:
print(command)
8. Tối ưu hệ thống
1. Tách module
- voice.py
- command.py
- device.py
2. Tránh spam command
Thêm delay hoặc check trạng thái:
if current_state != new_state:
3. Log trạng thái
Lưu lại:
{
"device": "light",
"status": "on",
"ts": 1712800000
}
Kết nối với bài tiếp theo
Hiện tại bạn đã có:
✅ Nhận diện giọng nói
✅ Map command
✅ Điều khiển thiết bị thật
👉 Bước tiếp theo:
➡️ Gửi lệnh qua MQTT để điều khiển hệ thống IoT
Chúng ta sẽ:
- không chỉ bật đèn local
- mà điều khiển ESP32 / thiết bị khác qua MQTT
Kết luận
Đây là bước chuyển quan trọng nhất:
👉 từ “nghe hiểu” → “hành động thật”
Bạn đã biến Raspberry Pi thành một Voice Assistant có thể điều khiển thiết bị ngoài đời thực, hoàn toàn offline.


