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 1: Tổng quan hệ thống điều khiển giọng nói offline

Trong rất nhiều dự án IoT và smart home, nhu cầu “ra lệnh bằng giọng nói” luôn là một ý tưởng hấp dẫn. Chỉ cần nói “bật đèn”, “tắt quạt”, “mở cửa”, hay “xem nhiệt độ”, hệ thống có thể hiểu và thực hiện hành động tương ứng. Nhưng khi bắt tay làm thật, nhiều người mới thường gặp ngay một câu hỏi lớn: có nhất thiết phải dùng Internet và dịch vụ cloud để nhận diện giọng nói hay không?

Câu trả lời là: không nhất thiết.

Với Raspberry Pi, chúng ta hoàn toàn có thể xây dựng một Voice Assistant offline tiếng Việt chạy ngay trên thiết bị, không phụ thuộc vào kết nối mạng liên tục. Một trong những lựa chọn nổi bật cho hướng này là Vosk — thư viện nhận diện giọng nói hoạt động offline, hỗ trợ nhiều ngôn ngữ, trong đó có tiếng Việt, và có thể chạy trên các thiết bị gọn nhẹ như Raspberry Pi. Vosk cũng cho phép cấu hình nhanh lại vocabulary để tăng độ chính xác trong những bài toán lệnh giọng nói giới hạn.

Trong bài mở đầu này, chúng ta sẽ đi qua bức tranh tổng thể: bài toán thực tế là gì, vì sao nên chọn hướng offline, Vosk là gì, và tại sao việc giới hạn bộ từ vựng lại là chìa khóa giúp hệ thống chạy ổn định hơn.

Bài toán thực tế: từ “điều khiển bằng giọng nói” đến một trợ lý nhỏ chạy local

Khi nghe cụm từ “Voice Assistant”, nhiều người thường nghĩ ngay đến các hệ thống rất lớn như trợ lý ảo có thể hội thoại tự nhiên, trả lời kiến thức, mở nhạc, tra cứu thời tiết, và làm đủ thứ việc khác. Nhưng trong các dự án Raspberry Pi thực tế, mục tiêu ban đầu thường nhỏ và rõ ràng hơn nhiều.

Ví dụ:

  • nói “bật đèn phòng khách” để kích relay
  • nói “tắt quạt” để gửi lệnh tới ESP32
  • nói “trạng thái cửa” để hệ thống đọc cảm biến và phản hồi
  • nói “xem nhiệt độ” để Raspberry Pi lấy dữ liệu sensor gần nhất

Nhìn theo cách này, Voice Assistant trong giai đoạn đầu không cần “thông minh toàn năng”. Điều quan trọng hơn là nó phải:

  • nghe được âm thanh từ micro
  • nhận ra đúng một nhóm câu lệnh quen thuộc
  • chuyển câu lệnh thành action cụ thể
  • phản hồi nhanh và ổn định

Đó cũng chính là lý do vì sao hướng offline command assistant rất phù hợp cho maker, người học IoT, và cả các dự án mini trong nhà hoặc phòng lab.

Vì sao nên chọn offline thay vì phụ thuộc cloud

Làm voice bằng cloud có ưu điểm là mạnh, tiện, và thường cho độ chính xác cao trong các bài toán ngôn ngữ mở. Nhưng với một hệ thống điều khiển thiết bị, cloud không phải lúc nào cũng là lựa chọn phù hợp.

Phản hồi nhanh hơn trong các lệnh đơn giản

Khi xử lý local trên Raspberry Pi, âm thanh không cần gửi lên server rồi chờ kết quả trả về. Với những lệnh ngắn như “bật đèn” hay “tắt quạt”, mô hình offline có thể phản hồi nhanh và trực tiếp hơn. Vosk cũng được thiết kế theo hướng streaming API, phù hợp với các tác vụ cần phản ứng theo thời gian thực.

Không phụ thuộc Internet liên tục

Đây là lợi ích rất lớn. Nếu mạng chập chờn, hoặc hệ thống đang đặt ở khu vực không ổn định về Internet, một giải pháp cloud-based sẽ dễ bị gián đoạn. Trong khi đó, Vosk được xây dựng để chạy offline, kể cả trên Raspberry Pi.

Tăng quyền riêng tư

Với giải pháp local-first, âm thanh được xử lý ngay trên thiết bị thay vì phải gửi lên một dịch vụ bên ngoài. Với nhiều hệ thống trong nhà, văn phòng nhỏ, hoặc mô hình demo dạy học, đây là một điểm cộng rất đáng giá.

Chủ động kiểm soát hệ thống

Khi chạy offline, bạn làm chủ toàn bộ pipeline:

Microphone -> Raspberry Pi -> Speech Recognition -> Command Parser -> GPIO / MQTT / Relay

Điều này rất hợp với triết lý maker: hiểu rõ hệ thống, dễ debug, dễ tối ưu, và dễ mở rộng từng bước.

Vosk là gì và vì sao phù hợp với Raspberry Pi

Vosk là một thư viện nhận diện giọng nói offline, hỗ trợ hơn 20 ngôn ngữ và dialect, trong đó có tiếng Việt. Theo tài liệu chính thức, Vosk có thể hoạt động trên Raspberry Pi, Android, iOS và các nền tảng phổ biến khác. Thư viện này cài khá đơn giản qua pip3 install vosk, đồng thời có cả model nhỏ lẫn model lớn để phù hợp nhiều mức tài nguyên phần cứng khác nhau.

Vosk models ở đây: https://alphacephei.com/vosk/models

Điểm làm Vosk đặc biệt phù hợp cho mini series này là:

1. Chạy được trên thiết bị nhẹ

Vosk có các small model dành cho mobile app, desktop app và Raspberry Pi. Theo trang model chính thức, model nhỏ thường khoảng 50 MB và tiêu tốn vào khoảng 300 MB RAM khi chạy; trong khi model lớn hướng nhiều hơn tới server và có thể cần tới hàng chục GB RAM.

Điều đó có nghĩa là nếu chúng ta thiết kế đúng bài toán, Raspberry Pi hoàn toàn có thể đảm nhận phần nhận diện giọng nói mà không cần đẩy toàn bộ lên cloud.

2. Hợp với tác vụ lệnh giọng nói

Bài toán của chúng ta không phải chép lại nguyên văn một đoạn hội thoại dài, mà là nhận dạng các câu lệnh cố định hoặc gần cố định. Đây là một kiểu use case rất hợp với cách triển khai gọn nhẹ trên edge device.

3. Có thể tối ưu vocabulary

Vosk cho phép reconfigure vocabulary nhanh để tăng độ chính xác. Đây là điểm rất quan trọng trong hệ thống điều khiển bằng giọng nói. Khi ta chỉ quan tâm tới một nhóm lệnh giới hạn, mô hình sẽ có ít khả năng “đoán bừa” hơn so với việc cố hiểu mọi câu nói tự do.

Voice Assistant offline trong mini series này sẽ hoạt động như thế nào

Trong loạt bài 23.x, chúng ta sẽ không xây một trợ lý hội thoại phức tạp ngay từ đầu. Thay vào đó, hệ thống sẽ đi theo hướng thực dụng và dễ triển khai hơn.

Kiến trúc tổng thể

Luồng xử lý dự kiến sẽ như sau:

Microphone -> Audio Input -> Vosk Recognizer -> Command Parser -> Action Executor

Trong đó:

  • Microphone thu âm thanh người dùng
  • Audio Input đọc stream âm thanh từ thiết bị micro
  • Vosk Recognizer chuyển âm thanh thành văn bản gần đúng
  • Command Parser đối chiếu với danh sách lệnh đã định nghĩa
  • Action Executor thực thi hành động như bật GPIO, kích relay, hoặc gửi MQTT

Ở giai đoạn đầu, action có thể rất đơn giản, ví dụ:

  • bật LED
  • tắt LED
  • bật relay
  • publish một message MQTT

Các bài sau mới mở rộng dần sang:

  • điều khiển thiết bị qua MQTT
  • giao tiếp với ESP32
  • hiển thị trạng thái trên dashboard
  • tạo hệ thống IoT voice-controlled mini

Vì sao phải giới hạn vocabulary để tăng độ chính xác

Đây là ý quan trọng nhất của bài mở đầu.

Nếu bạn đưa cho hệ thống một nhiệm vụ quá rộng, ví dụ “nghe mọi câu tiếng Việt tự nhiên”, thì nó sẽ khó hơn rất nhiều. Nhưng nếu bạn chỉ cần nó hiểu 10–20 câu lệnh cụ thể, bài toán trở nên khả thi hơn rất nhiều trên Raspberry Pi.

Ví dụ bộ câu lệnh giới hạn

Thay vì để hệ thống hiểu mọi kiểu nói tự do, ta chỉ định nghĩa các câu như:

  • bật đèn
  • tắt đèn
  • bật quạt
  • tắt quạt
  • mở cửa
  • đóng cửa
  • xem nhiệt độ
  • xem độ ẩm

Từ đó, command parser chỉ cần map:

  • “bật đèn” -> LIGHT_ON
  • “tắt đèn” -> LIGHT_OFF
  • “bật quạt” -> FAN_ON
  • “xem nhiệt độ” -> READ_TEMP

Cách làm này có nhiều lợi ích:

Độ chính xác thực tế cao hơn

Khi số lượng khả năng ít hơn, hệ thống sẽ dễ chọn đúng hơn. Đây cũng là lý do tài liệu Vosk nhấn mạnh khả năng quick reconfiguration of vocabulary for best accuracy.

Code đơn giản hơn

Bạn không cần NLP phức tạp, không cần LLM, không cần hội thoại nhiều vòng. Chỉ cần:

  • nhận text
  • normalize text
  • match với danh sách lệnh
  • chạy action

Phù hợp với Raspberry Pi

Khi mục tiêu rõ và hẹp, phần cứng gọn nhẹ như Raspberry Pi sẽ dễ đáp ứng hơn, đặc biệt khi dùng model nhỏ của Vosk.

Hệ thống này phù hợp với những dự án nào

Voice Assistant offline tiếng Việt trên Raspberry Pi rất hợp với các bài toán như:

Smart home mini

  • bật tắt đèn
  • bật tắt quạt
  • kiểm tra trạng thái cửa
  • kích hoạt cảnh báo

Bảng điều khiển trong phòng lab hoặc lớp học STEM

  • chọn chế độ demo
  • bật còi / bật đèn / test relay
  • gọi nhanh các chức năng cài sẵn

Gateway điều khiển IoT nội bộ

Raspberry Pi có thể đóng vai trò đầu não local. Khi nghe được lệnh, nó không trực tiếp bật thiết bị mà gửi lệnh qua MQTT đến ESP32 hoặc hệ thống IoT khác. Đây là hướng rất đẹp vì tách phần “nghe và hiểu lệnh” khỏi phần “thi hành ở thiết bị đầu cuối”.

Những giới hạn cần hiểu sớm từ đầu

Để kỳ vọng đúng, chúng ta cũng nên nhìn thẳng vào các giới hạn của cách tiếp cận này.

Đây chưa phải trợ lý hội thoại toàn năng

Loạt bài này thiên về command assistant, không phải chatbot hội thoại đầy đủ. Mục tiêu là giúp hệ thống hiểu và thực hiện một tập lệnh rõ ràng.

Chất lượng micro ảnh hưởng rất nhiều

Nhận diện giọng nói phụ thuộc lớn vào:

  • micro
  • tiếng ồn môi trường
  • khoảng cách nói
  • tốc độ nói
  • cách phát âm

Vì vậy, trong các bài tới, ta sẽ ưu tiên setup dễ làm và ổn định thay vì cố tối ưu quá sớm.

Tiếng Việt thực tế có nhiều biến thể

Người dùng có thể nói:

  • “bật đèn”
  • “mở đèn”
  • “cho đèn sáng”
  • “bật cái đèn lên”

Nếu không thiết kế vocabulary và parser cẩn thận, hệ thống sẽ dễ bị hụt. Do đó, cách tiếp cận đúng là đi từ bộ lệnh nhỏ, rõ ràng, dễ kiểm thử trước.

Loạt “Voice Assistant offline tiếng Việt với Raspberry Pi” sẽ đi theo lộ trình sau:

Mini series này sẽ triển khai theo từng bước tăng dần độ hoàn thiện:

  • Bài 23.1: Tổng quan hệ thống điều khiển giọng nói offline, hiểu bài toán, chọn hướng tiếp cận và nắm kiến trúc tổng thể.
  • Bài 23.2: Cài micro, kiểm tra audio input, thu âm và test luồng âm thanh local trên Raspberry Pi.
  • Bài 23.3: Cài model Vosk, nhận diện các câu lệnh tiếng Việt với bộ từ vựng giới hạn, và map câu lệnh sang command nội bộ.
  • Bài 23.4: Điều khiển thiết bị thật bằng giọng nói: LED, relay, quạt hoặc thiết bị mô phỏng.
  • Bài 23.5: Gửi lệnh qua MQTT để điều khiển một hệ thống IoT hoàn chỉnh hơn, ví dụ ESP32 hoặc dashboard.

Kết luận

Nếu bạn đang muốn làm một hệ thống điều khiển bằng giọng nói tiếng Việt mà:

  • không muốn phụ thuộc Internet liên tục,
  • muốn phản hồi nhanh,
  • muốn dễ debug,
  • và muốn tự làm chủ toàn bộ pipeline trên Raspberry Pi,

thì hướng Voice Assistant offline với Vosk là một lựa chọn rất đáng bắt đầu. Vosk hỗ trợ chạy offline trên Raspberry Pi, có model nhỏ phù hợp với edge device, và đặc biệt cho phép tối ưu vocabulary để tăng độ chính xác trong những bài toán điều khiển bằng giọng nói có phạm vi rõ ràng.

Trong bài tiếp theo, chúng ta sẽ đi vào phần rất thực tế: cài micro, kiểm tra thiết bị audio input và test thu âm local trên Raspberry Pi.