NGÂN LỘC COMPUTERGIẢI PHÁP CÔNG NGHỆ
MICRO I2S · ESP32-S3 · ESP-01

Ra lệnh bằng giọng nói
để điều khiển ESP-01

Dùng micro thu câu lệnh tiếng Việt, ESP32-S3 gửi âm thanh để nhận dạng và hệ thống chuyển lệnh đến ESP-01 đang điều khiển thiết bị. Nói “bật đèn bàn” hoặc “tắt đèn bàn” thay cho thao tác trên ứng dụng.

Xem cách đấu micro ↓Tải mã thử micro ↓
Module micro I2S có các chân SCK, WS, L/R, SD, VDD và GND do người dùng cung cấp

Micro thu tiếng, ESP-01 thực hiện lệnh

Trong phương án này, micro nối với ESP32-S3, không nối trực tiếp theo bảng chân bên dưới vào ESP-01. ESP32-S3 đóng vai trò bộ thu giọng nói; ESP-01 tiếp tục điều khiển relay theo hệ thống điều khiển từ xa.

Phạm vi bộ tải kèm: có bài hướng dẫn, sơ đồ, mã thử micro và firmware bộ thu ESP32-S3 riêng. Mã thử micro chỉ đo mức âm; tải firmware bộ thu bên dưới để dùng đường nhận dạng qua máy chủ. Bộ phần mềm mở rộng đã có trang điều khiển, API xác thực, xử lý tên thiết bị và firmware thu/gửi WAV. Micro ESP32-S3 cần bật OpenAI Audio Transcriptions trên máy chủ; firmware có cấu hình chân cho bo ESP32-S3-N16R8 hai USB-C trong ảnh bên dưới. Chưa thử trực tiếp trên phần cứng.

Cài và sử dụng phần mềm điều khiển giọng nói

Chọn một trong hai cách: micro điện thoại/máy tính qua trình duyệt, hoặc micro I2S gắn vào bộ ESP32-S3 riêng. Cả hai cùng đi qua kiểm tra tên và quyền trước khi tạo lệnh cho ESP-01.

Mở điều khiển bằng giọng nói →Tải firmware bộ thu ESP32-S3 ↓

Cách 1: Nút “Bấm để nói” trên website

  1. Đăng nhập tài khoản đã ghép ESP-01 trong trang Thiết bị của tôi; mở lại trang điều khiển giọng nói.
  2. Đặt tên gọi riêng cho mỗi mã NLC-. Ví dụ “máy tính văn phòng”. Chọn đúng loại PC nối POWER SW hoặc relay giữ ON/OFF.
  3. Bấm “Bấm để nói”, cho phép micro trên trình duyệt rồi nói “bật máy tính văn phòng”. Có thể nhập cùng câu bằng tay nếu trình duyệt không hỗ trợ nhận dạng.
  4. Trang hiển thị câu nói, tên và mã đích. Kiểm tra rồi bấm “Gửi lệnh đến thiết bị này”. Câu nói một mình chưa tác động relay.
  5. Chờ ESP-01 nhận và xác nhận. ACK là xác nhận tác động relay; kiểm tra trạng thái máy thực tế.

Trình duyệt có thể dùng dịch vụ riêng để xử lý âm thanh và cần Internet. Hỗ trợ tùy thiết bị/trình duyệt; mở HTTPS bằng Chrome hoặc nhập bằng tay khi nút nói không khả dụng.

Cách 2: Nút thu vật lý trên ESP32-S3

  1. Chủ website bật OpenAI Audio Transcriptions trên máy chủ theo hướng dẫn bên dưới.
  2. Trên trang điều khiển, tạo bộ micro, chọn các ESP-01 được phép và lưu mã NLM-/token riêng. Không dùng token ESP-01 hoặc token loa.
  3. Tải ZIP firmware, giải nén, mở .ino trong thư mục cùng tên. Sao lưu firmware đang dùng trước khi nạp ESP32-S3.
  4. Trong Arduino IDE chọn ESP32S3 Dev Module, Flash Size 16MB, PSRAM OPI PSRAM và Flash Mode DIO cho bo N16R8. Thư viện ESP_I2S có trong Arduino-ESP32 core 3.3.11. Mở Serial Monitor 115200; kết nối Wi-Fi NLC-MIC-SETUP bằng mật khẩu hiện trên Serial rồi mở http://192.168.4.1.
  5. Nhập Wi-Fi nhà, mã NLM-/token. Với bo trong ảnh: SCK 15, WS 16, SD 17 và nút thu 18; chọn kênh trái khi L/R nối GND. Nút thu một đầu nối GPIO đã chọn, đầu còn lại nối GND; chương trình dùng INPUT_PULLUP.
  6. Lưu và chờ khởi động lại, kết nối Wi-Fi và đồng bộ thời gian. Bấm nút rồi nói một câu trong 4 giây; chờ ít nhất 8 giây giữa các lượt.
Bo trong ảnh là ESP32-S3-N16R8 hai USB-C: firmware đặt sẵn SCK=15, WS=16, SD=17, nút thu=18. Trước khi lưu, xác nhận đã nối đúng và không có thiết bị khác dùng bốn GPIO này. Nếu có camera gắn ngoài hoặc dùng bo khác, đối chiếu sơ đồ rồi đổi chân trong trang cấu hình. Chương trình không khởi tạo camera hoặc phát loa. Đây là firmware riêng cho bộ thu, không tự bổ sung vào firmware loa cũ.

Gõ r trong Serial để thử thu; gõ c để mở cấu hình. Giữ nút thu rời GPIO18 khi bật nguồn cũng mở cấu hình. Sau khi thu, Serial hiện số mẫu, RMS và peak; nếu quá nhỏ, kiểm tra VDD 3V3, dây SCK/WS/SD và kênh L/R. Firmware xác thực HTTPS bằng ISRG Root X1; nếu máy chủ đổi CA phải cập nhật chứng chỉ, không bỏ kiểm tra TLS.

1. Hệ thống hoạt động như thế nào?

Nhấn nút và nói; micro I2S thu vào ESP32-S3; máy chủ nhận dạng tiếng Việt và kiểm tra quyền; ESP-01 nhận lệnh và điều khiển relay

Nhấn nút để nói → thu một câu → máy chủ kiểm tra lệnh → ESP-01 thực hiện.

  1. Bấm nút trên bộ ESP32-S3, nói một câu ngắn.
  2. ESP32-S3 thu âm và gửi qua HTTPS.
  3. Máy chủ chuyển tiếng Việt thành chữ, kiểm tra câu lệnh và thiết bị thuộc tài khoản.
  4. Lệnh hợp lệ đi vào luồng điều khiển hiện có của ESP-01.
  5. ESP-01 nhận lệnh, tác động relay và báo kết quả. Có thể bổ sung loa trả lời hoặc LED trạng thái.

Micro chỉ thu âm, không tự hiểu “bật” hay “tắt”. Cần có bộ nhận dạng giọng nói và phần đối chiếu câu lệnh. Bài này dùng nhận dạng tiếng Việt qua Internet; khi mất mạng thì không thực hiện lệnh mới.

2. Linh kiện cần chuẩn bị

Ví dụ mã thử dành cho INMP441/ADMP441 dùng Philips I2S 24 bit đã được xác nhận. Nếu mic là PDM, analog hoặc định dạng khác, phải thay cấu hình tương ứng.

Muốn có lời xác nhận, có thể bổ sung PCM5102 với loa AUX có nguồn riêng. Xem bài loa jack 3,5 mm.

3. Nối micro vào ESP32-S3

Bo ESP32-S3-N16R8 hai USB-C, chân 15, 16, 17 và 18 ở hàng bên trái

Bo trong ảnh có chữ ESP32-S3-N16R8. Không thấy đầu nối camera trên mặt trước. Nút BOOT và RST có sẵn không phải nút thu.

Bảng dưới dùng cho bo ESP32-S3-N16R8 hai USB-C người dùng cung cấp, khi GPIO 15/16/17/18 chưa nối thiết bị khác. Với bo camera hoặc màn hình, kiểm tra sơ đồ rồi đổi chân trước khi nối. Không áp dụng một bảng chân cho tất cả các bo.

Micro I2SESP32-S3-N16R8Chức năng
VDD3V3Cấp nguồn theo datasheet mic; không dùng 5 V cho mic chỉ hỗ trợ 3,3 V
GNDGNDMass chung
SCKGPIO 15Xung bit I2S từ ESP32
WSGPIO 16Xung chọn kênh
SDGPIO 17Dữ liệu âm thanh vào ESP32
L/RGNDChọn kênh trái với INMP441/ADMP441
Nút nhấn thu rờiGPIO 18 ↔ nút ↔ GNDNhấn một lần để thu 4 giây; INPUT_PULLUP
SCK của micro phải nối GPIO phát xung, không nối mass. Cách nối SCK xuống GND trên PCM5102 dùng I2S ba dây không áp dụng cho chân SCK của micro.

Nối khi đã tắt nguồn, dùng dây ngắn và không che lỗ thu của micro. Nếu bo đã phát loa qua GPIO 4/5/6, giữ riêng các chân này. Khi tích hợp cả thu/phát, phải phân bổ bộ điều khiển I2S RX/TX phù hợp với thư viện, không chép chồng hai cấu hình mặc định.

Tham khảo I2S của Arduino-ESP32 và datasheet ADMP441. Với mic khác, dùng tài liệu đúng chip.

4. Kiểm tra micro trước khi làm nhận dạng

Mã thử đọc khung stereo 32 bit ở 16 kHz, đo mức âm ở kênh trái và in RMS/peak. Mức thay đổi khi nói là bước kiểm tra dữ liệu đầu vào, chưa chứng minh chất lượng nhận dạng; tiếp theo cần thu và nghe lại WAV.

Tải mã thử micro .zip ↓Tải file .ino ↓
  1. Sao lưu firmware riêng cùng mã/token trước khi thay chương trình trên ESP32-S3. Không nạp sketch này vào ESP-01.
  2. Giải nén và mở NganLoc-Mic-I2S-Test.ino trong thư mục cùng tên.
  3. Dùng ESP32 core 3.3.11; ESP_I2S đi kèm core.
  4. Đối chiếu chân, sửa MIC_SCK/WS/SD, đặt PINS_CONFIRMED thành true sau khi xác nhận.
  5. Nạp vào ESP32-S3, mở Serial Monitor 115200 và nói cách mic khoảng 10–20 cm.
constexpr bool PINS_CONFIRMED = false; // Xác nhận chân rồi đổi true
constexpr int MIC_SCK = 15;
constexpr int MIC_WS  = 16;
constexpr int MIC_SD  = 17;
constexpr int MIC_CHANNEL = 0; // L/R nối GND: trái

microphone.setPins(MIC_SCK, MIC_WS, -1, MIC_SD);
microphone.begin(I2S_MODE_STD, 16000,
                 I2S_DATA_BIT_WIDTH_32BIT, I2S_SLOT_MODE_STEREO);

Đoạn trên chỉ là cấu hình. Tải file đầy đủ để nạp. Mã thử không gửi âm thanh lên mạng, không phát loa và không tác động relay.

5. Cấu hình API OpenAI nhận dạng tiếng Việt

Máy chủ gọi POST https://api.openai.com/v1/audio/transcriptions, gửi file WAV mono 16 bit/16 kHz/4 giây, model gpt-transcribe, ngôn ngữ vi và nhận văn bản JSON. Chữ nhận dạng được kiểm tra bằng quy tắc bật/tắt + tên thiết bị, không để mô hình tự chọn mã ESP-01.

  1. Cài các file voice-control.php, voice-api.php, voice-device-api.php và JS/CSS vào public_html.
  2. Đặt nganloc-voice-lib.php bên ngoài public_html, cùng thư mục với nganloc-iot-lib.php đang dùng. Giữ nguyên kho thiết bị và thư viện IoT hiện có.
  3. Có khóa API OpenAI với quyền nhận dạng âm thanh và tài khoản API đủ hạn mức. Khóa giữ ngoài public_html trong cấu hình riêng hoặc biến môi trường OPENAI_API_KEY.
  4. Đổi tên nganloc-voice-config.example.php thành nganloc-voice-config.php ngoài public_html, đặt enabled=true. Thư viện có thể dùng khóa của cấu hình OpenAI hiện có khi cấu hình đó đang bật; không cần chép khóa vào firmware.
  5. Máy chủ cần PHP 8 trở lên, cURL, CA hệ thống và kết nối HTTPS đi ra. Bản hiện tại tạo multipart trong bộ nhớ, không yêu cầu CURLStringFile. Trang điều khiển báo trạng thái cấu hình sẵn sàng hoặc chưa bật.
  6. Thử một câu ngắn, kiểm tra transcript và mã đích. Website không lưu đoạn ghi âm sau xử lý; đoạn thu được gửi tới OpenAI.

API được tính phí riêng; gói ChatGPT không tự cấp hạn mức cho khóa API này. Giới hạn của bộ phần mềm: 100 lượt thu/ngày cho mỗi bộ micro và 8 giây giữa các lần gửi. Chủ website chịu phí API; bộ này chưa có chức năng thu phí ví khách.

OpenAI Docs: chuyển âm thanh thành chữ · Tham số Audio Transcriptions.

Nhận dạng tiếng Việt offline chưa được cung cấp trong bộ này. Mất mạng, dịch vụ lỗi, âm thanh im lặng hoặc câu không khớp tên sẽ không tạo lệnh.

6. Chuyển câu nói thành lệnh ESP-01

Đối với tải dùng relay giữ trạng thái, bắt đầu với hai câu và một thiết bị. Đây là bộ lệnh được xử lý trong bộ phần mềm mở rộng. Sketch thử mức âm chỉ kiểm tra micro; firmware thu WAV và các API được tải riêng.

Câu nóiHành độngKết quả mong muốn
“Bật đèn bàn”Gửi ON tới đúng ESP-01Relay ở trạng thái bật
“Tắt đèn bàn”Gửi OFF tới đúng ESP-01Relay ở trạng thái tắt
“Đừng bật đèn bàn”Từ chối câu không khớpKhông đổi đầu ra
Câu lạ / âm thanh không rõKhông gửi lệnhBáo nói lại

Dùng lệnh ON/OFF tuyệt đối, không dùng đảo trạng thái TOGGLE. Lệnh bật bị gửi trùng thì vẫn bật. Mã yêu cầu phải được kiểm tra để không tác động lặp.

Firmware ESP-01 của dự án có luồng nhận lệnh và phản hồi. Bộ micro cần đi qua kiểm tra quyền và hàng đợi điều khiển của hệ thống; không gọi trực tiếp API poll của thiết bị để tạo lệnh. Máy chủ phải xác định đúng mã ESP-01 đích, bảo vệ token và ghi nhật ký.

Không ngắt nguồn ESP-01 để “tắt thiết bị”. ESP-01 cần tiếp tục được cấp điện và kết nối mạng để còn nhận lệnh bật tiếp theo. Lệnh bật/tắt tác động thiết bị hoặc tiếp điểm relay, không tắt bộ điều khiển.

7. Nếu ESP-01 đang bật/tắt máy tính

Bo nối POWER SW dùng xung nhấn rồi nhả, không giữ relay ON như đóng một bóng đèn. Không dùng cùng một cách điều khiển cho cả hai loại tải.

Hướng dẫn ESP-01 điều khiển máy tính →

8. Nối với tài khoản và ứng dụng đang dùng

  1. Trước tiên kiểm tra ESP-01 bật/tắt được bằng nút trên app. Nếu chưa được, sửa đường điều khiển này trước khi thêm micro.
  2. Chọn thiết bị đích rõ ràng, ví dụ “đèn bàn” gắn với một mã ESP-01 cụ thể. Không dùng tên trùng gây điều khiển nhầm.
  3. Cấp danh tính riêng cho bộ thu ESP32-S3 và liên kết quyền điều khiển với tài khoản; không sao chép token ESP-01 sang bộ thu như hai thiết bị cùng danh tính.
  4. Dùng voice-device-api.php cho bộ thu; voice-api.php cho phiên web. Không gửi WAV tới API loa cũ.
  5. Nếu có loa phản hồi, thu xong mới phát và tạm ngừng nghe lúc loa trả lời để tránh nhận tiếng của chính loa.

ESP-01 đang chạy đúng firmware có thể giữ nguyên nếu hỗ trợ loại lệnh cần dùng. Bộ thu ESP32-S3 và phần xử lý giọng nói dùng firmware/API riêng trong bộ tải mới. Với bo relay khác hoặc giao thức khác, kiểm tra lại firmware ESP-01.

Mã thiết bị nào dùng để điều khiển đúng ESP-01?

Trong trang điều khiển, mã bắt đầu bằng NLC- nằm dưới tên máy là mã định danh của bộ điều khiển. Đây là mã mà máy chủ dùng để chọn ESP-01 nhận lệnh. Ví dụ trong ảnh minh họa của bạn, Máy tính văn phòng có mã NLC-B723B241. Khi cấu hình, hãy chọn mã đang hiển thị trong tài khoản của chính bạn; không chép mã ví dụ cho thiết bị khác.

Thông tinDùng khi nào?
Mã thiết bị NLC-…Xác định đúng ESP-01 đích trong hệ thống
Mã kích hoạtThêm/ghép bộ điều khiển vào tài khoản, không đọc mã này khi ra lệnh
Mật khẩu Wi-Fi thiết bịKết nối mạng cấu hình của bộ điều khiển
Token/khóa thiết bịXác thực firmware với máy chủ; không đưa vào bài viết hoặc gửi cho bộ thu dùng chung danh tính

Đặt tên để nói dễ và không nhầm máy

  1. Đăng nhập tài khoản đang sở hữu ESP-01, thử nút điều khiển hiện có trước.
  2. Đặt tên riêng cho từng máy: “máy tính văn phòng”, “máy tính phòng ngủ”.
  3. Trong trang điều khiển giọng nói, chọn thiết bị từ danh sách thuộc tài khoản; máy chủ lưu tên gọi cùng mã thiết bị.
  4. Ghép bộ thu ESP32-S3 với tài khoản và chỉ cấp quyền cho các ESP-01 được chọn.
  5. Thử câu lệnh, kiểm tra nhật ký có đúng tên máy và mã đích trước khi dùng thường xuyên.
Câu nóiThiết bị đíchCách xử lý
“Bật máy tính văn phòng”NLC-B723B241 trong ví dụKiểm tra quyền và trạng thái máy, rồi tạo thao tác phù hợp với POWER SW
“Tắt máy tính phòng ngủ”Mã của máy phòng ngủ đã ghépYêu cầu tắt an toàn theo cấu hình máy đó
“Tắt máy tính” khi có nhiều máyChưa xác địnhKhông gửi lệnh; hỏi lại hoặc báo cần nói đủ tên máy
“Đừng tắt máy tính văn phòng”Không tạo lệnhKhông khớp câu cho phép, giữ nguyên trạng thái

Bạn nói tên máy, không cần đọc mã NLC-. Máy chủ đối chiếu tên với mã đã lưu, kiểm tra quyền tại thời điểm gửi, sau đó đưa lệnh vào hàng đợi riêng của thiết bị. Không tìm thiết bị theo một mã người dùng tùy ý nhập mà bỏ qua quyền sở hữu.

Nếu đổi tên, chuyển thiết bị sang tài khoản khác hoặc xóa thiết bị, cần cập nhật hoặc hủy liên kết giọng nói tương ứng. Tên trùng, câu không rõ, thiết bị không được cấp quyền hoặc ngoại tuyến phải được báo rõ; không tự chuyển lệnh sang một máy khác.

Trạng thái triển khai: bộ phần mềm mở rộng có cấu hình tên, quyền, nhận âm thanh và tạo lệnh. Cần cài trên hosting, bật API OpenAI và thử phần cứng để xác nhận hoạt động. Mã thử mức âm không gửi lệnh.

9. Tìm lỗi theo từng bước

Hiện tượngKiểm tra
Micro luôn bằng 0Nguồn, SCK/WS/SD, kênh L/R và cấu hình chip
Thu âm rè/méoDây, nguồn, định dạng I2S, chuyển mẫu 24 bit và mức gain
Không nhận tiếng Việtvi trên API / vi-VN trong trình duyệt, WAV/PCM và lỗi dịch vụ nhận dạng
Nhận chữ đúng nhưng ESP-01 không chạyQuyền, thiết bị đích, hàng đợi, trạng thái online và ACK
Máy tính nhận lệnh nhưng không tắtPhần mềm tắt máy, hành vi nút nguồn và phản hồi trạng thái
Lệnh bị lặpMã yêu cầu, chống trùng, thời hạn; không dùng TOGGLE

Khi mất mạng hoặc hết thời gian chờ, không tự đổi trạng thái và không tự gửi lại một lệnh cũ để tác động thiết bị muộn.

10. Thử nghiệm trước khi sử dụng

  1. Thu và nghe lại tiếng nói rõ, đúng kênh.
  2. App điều khiển ESP-01 hoạt động trước khi thử giọng nói.
  3. Hai câu bật/tắt điều khiển đúng LED hoặc tải điện áp thấp thử nghiệm.
  4. Câu phủ định, câu lạ và tiếng ồn không đổi đầu ra.
  5. Lệnh trùng, hết hạn, mất mạng và khởi động lại được xử lý rõ ràng.
  6. Tài khoản/bộ thu khác không điều khiển được thiết bị của bạn.

Với thiết bị điện lưới, chọn thiết bị đóng cắt có định mức/cách ly phù hợp và để người có chuyên môn lắp phần điện. Không đưa điện lưới hoặc nguồn USB vào chân POWER SW của máy tính.

Lộ trình: thử micro → nghe WAV → nhận tiếng Việt → tạo lệnh đúng thiết bị → ESP-01 thực hiện → phản hồi kết quả.

← Mạch ứng dụng