Site icon TAPIT

Điều khiển thiết bị điện bằng giọng nói sử dụng Google Assistant và ESP8266 (P5)

Để có thể làm được phần này các bạn cần hiểu và làm qua các bước cần thiết từ tạo project với Actions on Google, xây dựng hội thoại với Dialogflow, mô phỏng và liên kết để triển khai ứng dụng hội thoại với Google Assitant trên smartphone và các thiết bị Google. Những nội dung này đã được trình bày ở các phần trước: 
Xem lại phần 1: Giới thiệu Actions on Google
Xem lại phần 2: Giới thiệu nền tảng Dialogflow và tạo Action đầu tiên
Xem lại phần 3: Thiết kế hội thoại với Dialogflow
Xem lại phần 4: Mô phỏng và triển khai ứng dụng với Actions on Google Integration

Mục tiêu của chuỗi bài hướng dẫn này không chỉ là các đoạn hội thoại đơn giản mà còn hướng đến một ứng dụng Internet of Things hoàn chỉnh với trải nghiệm tương tác hai chiều bằng giọng nói thật tự nhiên; trợ lý ảo phải có khả năng linh hoạt đối đáp với người sử dụng trong nhiều ngữ cảnh khác nhau, có khả năng nhận biết và đưa ra gợi ý đối với những yêu cầu bị sai, thiếu thông tin từ người dùng và cuối cùng là phải liên kết được với hệ thống phần cứng giúp người sử dụng có thể điều khiển, giám sát hệ thống các thiết bị điện. Muốn như vậy, chúng ta phải xây dựng được ứng dụng hội thoại đầy đủ các ngữ cảnh khác nhau thông qua các intents và kết hợp thêm các tính năng nâng cao khác sẽ có trong những phần tiếp theo bao gồm: fulfillmentWebhooks, Slot filling, triển khai fullfilment lên Cloud Functions for Firebase và liên kết để lưu trữ dữ liệu với Firebase Realtime Database.

Phần 5: Xây dựng và triển khai Fulfillment

1. Chức năng exported, restored và imported

Dialogflow hỗ trợ các tính năng khác nhau dành cho agent:

Mình đã tạo sẵn một agent với đầy đủ các câu thoại và ngữ cảnh khác nhau, các bạn tải về ở đây sau đó làm theo các bước sau để import vào:

Sau khi restore xong, chọn vào phần intent các bạn sẽ thấy các intent mình đã tạo sẵn với 2 intent chính là Control_Devices (xử lý các yêu cầu điều khiển thiết bị) và Get_Status_Devices (xử lý các yêu cầu truy vấn trạng thái thiết bị) cùng các intent phụ trợ khác. Đối với entity thì bao gồm devices (đại diện cho loại thiết bị) và status (đại diện cho trạng thái thiết bị).

2. Chức năng Slot filling

Slot filling là chức năng cho phép chúng ta xây dựng luồng hội thoại yêu cầu thu thập giá trị các tham số khác nhau trong một intent, có nghĩa là action sẽ không hoàn thành cho đến khi nào người dùng cung cấp đầy đủ giá trị các tham số được yêu cầu. Chức năng này rất hữu ích khi chúng ta muốn xây dựng ứng dụng mà trợ lý có khả năng gợi ý hoặc yêu cầu người dùng cung cấp thêm thông tin cần thiết khi phát hiện yêu cầu đó thiếu thông tin.

Ví dụ khi muốn điều khiển một thiết bị luôn cần 2 tham số bắt buộc là devicestatus theo cấu trúc “turn status the device” (vd: turn on the light, turn off the fan,…). Nếu trợ lý ảo phát hiện bị thiếu 1 trong 2 thông tin sẽ đặt câu hỏi phản hồi lại để người dùng cung cấp thêm cho đến khi đầy đủ thông tin mà không làm gián đoạn hội thoại. Trong agent mẫu đã import phía trên mình đã kích hoạt sẵn chức năng slot filling cho các intent Control_Devices và Get_Status_Devices. Ở cửa sổ Action and Parameters trong intent Control_Devices, để kích hoạt chức năng Slot filling cho một tham số ta phải tick chọn vào cột REQUIRED có ý nghĩa rằng đó là một tham số bắt buộc, sau đó chúng ta có thể cài đặt một câu thoại bất kỳ ở cột PROMTS tức là lời nhắc mà trợ lý ảo sẽ nói để yêu cầu người dùng bổ sung tham số đó.

3.Xây dựng fulfillment

Cùng nhớ lại ở phần 3, để Google Assistant phản hồi nội dung về cho người dùng chúng ta đã tạo sẵn các câu thoại ở cửa sổ Response, hay còn gọi là Static text response, tuy nhiên hầu hết các ứng dụng đều sử dụng fulfillment để xử lý response bởi tính linh hoạt cao và cách này còn được gọi là Webhook response.

Fullfilment là một đoạn code được triển khai dưới dạng webhook cho phép agent có thể gọi đến thông qua một HTTP POST và gửi đến các tham số được trích xuất từ yêu cầu của người dùng dưới định dạng chuỗi JSON, sau đó thực thi các thuật toán logic thực hiện các hành động khác nhau, ví dụ như thực hiện liên kết với cơ sở dữ liệu với mục đích truy vấn hoặc lưu trữ và sau đó gửi phản hồi về agent dữ liệu dưới dạng chuỗi JSON để trả về output cho người dùng như hình trên. Chúng ta có thể xây dựng và sau đó triển khai webhook trên bất kỳ nền tảng hay cloud nào, hoặc đơn giản có thể sử dụng trình inline code editor được Dialogflow hỗ trợ giúp liên kết sẵn với Cloud Functions for Firebase.

Để cấu hình fulfillment cho agent, chọn Fulfillment từ thanh menu bên trái, Dialogflow hỗ trợ 2 phương án để triển khai webhook, đó là:

Để đơn giản chúng ta sẽ sử dụng Inline editor để lập trình và triển khai webhook. Đầu tiên, chọn ENABLE ở cửa sổ Inline Editor, giao diện Inline Editor bao gồm 2 cửa sổ:

Copy đoạn chương trình mẫu sau và dán vào cửa sổ index.js

Sau đó chọn DEPLOY ở góc phải bên dưới để triển khai fulfillment và đợi vài phút để triển khai thành công. Đoạn chương trình trên được viết bằng ngôn ngữ Node.js sử dụng thư viện Actions on Google Client Library với cấu trúc rất đơn giản bao gồm các thành phần chính sau:

Các gợi ý sẽ hiển thị dưới dạng text button

Để bắt được các intents cụ thể từ agent, sử dụng cấu trúc sau:

Với intent name là tên của intent muốn xử lý và param1, param2,là danh sách các tham số được trích xuất từ các intent, chính là tên của các entity.

Để tạo nội dung phản hồi về cho người dùng, có hai trường hợp sử dụng tương ứng với 2 cấu trúc:

Ngoài ra để chèn nội dung các tham số được trích xuất từ yêu cầu của người dùng vào nội dung phản hồi, sử dụng format: ${param}.

Trong chương trình trên, mình xử lý 2 intent mẫu là Input_Welcome và Control_devices với giá trị tham số được trích xuất là ${devices}${status}. Bây giờ chúng ta sẽ sử dụng công cụ simulator của Google Actions và Google Assistant trên điện thoại thông minh để mô phỏng kết quả ứng dụng vừa triển khai (nếu không nhớ cách sử dụng thì xem lại phần 4 nhé).

Kết quả mô phỏng trên simulator và điện thoại thông minh

Chức năng Slot Filling

Các bạn hãy thử chỉnh sửa các câu thoại response và thử viết thêm phần xử lý cho các intent khác để hiểu rõ hơn cách thức hoạt động của webhook response và cách sử dụng thư viện Actions-on-Google Client Library nhé. Trong phần tới chúng ta sẽ hoàn thiện fulfillment, tìm hiểu cách lưu trữ và truy vấn dữ liệu với Firebase Realtime Database từ fulfillment và ESP8266 để hoàn thiện dự án, cùng đón xem nhé.

Phần cuối: Kết nối Firebase Realtime Database
Xem thêm:  Tổng hợp hướng dẫn Internet of Things với NodeMCU ESP8266 và ESP32

Nhóm TAPIT IoTs