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 3: Nhận diện lệnh tiếng Việt bằng Vosk với bộ từ vựng giới hạn

Sau khi đã thiết lập micro và kiểm tra audio input ở bài trước, bước tiếp theo là “trái tim” của hệ thống:

👉 Biến giọng nói thành câu lệnh mà Raspberry Pi có thể hiểu được

Trong bài này, chúng ta sẽ:

  • cài đặt Vosk
  • tải model tiếng Việt
  • nhận diện giọng nói từ micro
  • giới hạn bộ từ vựng (vocabulary)
  • map câu nói thành command

1. Bạn sẽ làm được gì sau bài này

  • Nhận diện được câu nói tiếng Việt từ micro
  • Giới hạn hệ thống chỉ hiểu một tập lệnh nhỏ
  • Chuyển câu nói thành command nội bộ (ON/OFF/READ…)

2. Tổng quan luồng xử lý

Luồng hệ thống trong bài này:

Micro → Audio Stream → Vosk → Text → Command Parser

Ví dụ:

“bật đèn” → "bat den" → LIGHT_ON

Bước 1: Cài đặt Vosk

Cài thư viện:

pip install vosk sounddevice

Bước 2: Tải model tiếng Việt

Truy cập trang Vosk models và tải model tiếng Việt nhỏ (lightweight).

Sau khi tải về:

unzip vosk-model-small-vi.zip

Thư mục ví dụ:

vosk-model-small-vi/

👉 Đặt trong project:

/home/pi/voice-assistant/model/

Bước 3: Code nhận diện giọng nói cơ bản

Tạo file:

voice_recognition.py

Code mẫu:

import sounddevice as sd
import queue
import json
from vosk import Model, KaldiRecognizer

# Load model
model = Model("model")

# Queue audio
q = queue.Queue()

def callback(indata, frames, time, status):
    q.put(bytes(indata))

# Config recognizer
samplerate = 16000
recognizer = KaldiRecognizer(model, samplerate)

# Start stream
with sd.RawInputStream(samplerate=samplerate, blocksize=8000, dtype='int16',
                       channels=1, callback=callback):

    print("🎤 Đang nghe...")

    while True:
        data = q.get()

        if recognizer.AcceptWaveform(data):
            result = json.loads(recognizer.Result())
            text = result.get("text", "")
            print("Bạn nói:", text)

Chạy thử

python voice_recognition.py

👉 Nói thử:

  • “bật đèn”
  • “tắt đèn”

Kết quả:

Bạn nói: bat den
Bạn nói: tat den

💡 Lưu ý:

  • Vosk thường trả về không dấu
  • cần normalize text

Bước 4: Giới hạn vocabulary (rất quan trọng)

Nếu không giới hạn, Vosk sẽ cố hiểu mọi câu → dễ sai.

👉 Cách tốt nhất: chỉ cho phép một tập câu lệnh cụ thể

Ví dụ vocabulary

commands = [
    "bật đèn",
    "tắt đèn",
    "bật quạt",
    "tắt quạt",
    "xem nhiệt độ"
]

Áp dụng vào Vosk

recognizer = KaldiRecognizer(model, samplerate, json.dumps(commands, ensure_ascii=False))

👉 Khi đó:

  • hệ thống chỉ cố nhận các câu này
  • độ chính xác tăng rõ rệt

Bước 5: Normalize text

Do Vosk trả về không dấu:

"bat den"

👉 Ta cần normalize:

def normalize(text):
    return text.strip().lower()

Bước 6: Map command

def parse_command(text):
    if "bat 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"
    elif "nhiet do" in text:
        return "READ_TEMP"
    return None

Kết hợp hoàn 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)

Demo kết quả

Bạn nói: bat den
👉 Command: LIGHT_ON

Bạn nói: tat quat
👉 Command: FAN_OFF

3. Những lỗi thường gặp

❌ Không nhận diện được tiếng Việt

  • model sai
  • sample rate sai

👉 Fix:

  • dùng model tiếng Việt
  • samplerate = 16000

❌ Nhận sai câu

Nguyên nhân:

  • vocabulary quá rộng
  • micro kém

👉 Fix:

  • giới hạn command
  • nói rõ, chậm

❌ Không nhận gì

  • audio input sai device

👉 Fix:

  • kiểm tra lại Bài 23.2

4. Tối ưu thêm (rất nên làm)

1. Thêm nhiều cách nói

commands = [
    "bật đèn",
    "mở đèn",
    "cho đèn sáng"
]

2. Fuzzy match

Cho phép sai nhẹ:

if "den" in text and "bat" in text:

3. Logging

Lưu câu không nhận diện được → cải thiện system

Kết nối với bài tiếp theo

Hiện tại bạn đã có:

✅ Micro hoạt động
✅ Nhận diện giọng nói
✅ Map thành command

👉 Bước tiếp theo:

Điều khiển thiết bị bằng giọng nói (GPIO / Relay)

Chúng ta sẽ:

  • bật LED thật
  • điều khiển relay
  • kết nối phần “hiểu lệnh” với “hành động”