IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Voice Assistant offline tiếng Việt với Raspberry Pi – Bài 4: Điều khiển đèn, quạt và thiết bị bằng giọng nói

Ở 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.