Series
Lập Trình Raspberry Pi & Ứng Dụng Thực Tế
  1. Series: Lập trình Raspberry Pi & Ứng dụng thực tế
  2. 1Voice Assistant offline tiếng Việt với Raspberry Pi – Bài 1: Tổng quan hệ thống điều khiển giọng nói offline
  3. 2Voice Assistant offline tiếng Việt với Raspberry Pi – Bài 2: Cài đặt micro và kiểm tra audio input
  4. 3Voice 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
  5. 4Voice 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
  6. 5Voice Assistant offline tiếng Việt với Raspberry Pi – Bài 5: Gửi lệnh qua MQTT để điều khiển hệ thống IoT
  7. 6Hệ thống giám sát nhà thông minh mini với Raspberry Pi – Bài 1: Tổng quan hệ thống giám sát cửa và phát hiện chuyển động
  8. 7Hệ thống giám sát nhà thông minh mini với Raspberry Pi – Bài 2: Đấu nối cảm biến cửa từ và chuyển động PIR
  9. 8Hệ thống giám sát nhà thông minh mini với Raspberry Pi – Bài 3: Đọc trạng thái cửa và phát hiện chuyển động bằng Python
  10. 9Hệ thống giám sát nhà thông minh mini với Raspberry Pi – Bài 4: Xây dựng rule cảnh báo thông minh cho cửa và chuyển động
  11. 10Hệ thống giám sát nhà thông minh mini với Raspberry Pi – Bài 5: Gửi cảnh báo và đẩy event lên MQTT, dashboard
  12. 11Edge AI trên Pi 5: TensorFlow Lite, MediaPipe, YOLO
Kiến thức

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

Th4 2026
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”