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”


