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

Trong phần trước, mình đã giới thiệu đến các bạn nền tảng Dialogflow và hướng dẫn cách tạo project Actions on Google để liên kết với Dialogflow Agent. Phần này chúng ta sẽ tìm hiểu thêm một vài thành phần của Dialogflow để có thể xây dựng hội thoại cho trợ lý ảo Google Assistant.
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

Phần 3: Thiết kế hội thoại với Dialogflow

Giao diện Dialogflow Console sau khi tạo Agents như sau:

Các bạn có thể thấy ở thanh menu bên trái chính là những thành phần của agent đã tạo như Intents, Entities, Fulfillment, Intergrations… sẽ được sử dụng trong project của chúng ta.

1. Intent là gì?

Như mình đã giới thiệu ở phần trước, agent là một module NLU (Natural Language Understanding), có khả năng xử lý yêu cầu từ người dùng (input), chuyển đổi input đó thành dữ liệu cần thiết để xử lý và cuối cùng phản hồi output tương ứng về cho người dùng. Ví dụ, khi người dùng yêu cầu truy vấn trạng thái: “What is the state of light?”. Agent sẽ tiếp nhận yêu cầu từ Google Assistant, xử lý và phản hồi về cho người dùng thông tin tương ứng của đèn là “Light is on” hoặc “Light is off”.

Một agent về nhà thông minh có thể xử lý nhiều loại yêu cầu với nhiều mục đích khác nhau của người dùng như yêu cầu điều khiển thiết bị, yêu cầu truy vấn trạng thái thiết bị hay các yêu cầu khác và mỗi yêu cầu sẽ có một phản hồi tương ứng khác nhau. Để agent có thể ánh xạ chính xác yêu cầu cụ thể của người dùng đến phản hồi tương ứng, chúng ta cần tạo các intents bên trong agent đó. Có thể hiểu Agent đại diện tổng quát cho project, còn intent đại diện cho một mục đích, một ý định hay yêu cầu cụ thể nào đó bên trong agent. Một agent sau khi được tạo sẽ mặc định tự tạo sẵn 2 intent là Default Fallback Intent (để phản hồi đối với các yêu cầu không không khớp với intent nào) và Default Welcome Intent (để phản hồi đối với các lời chào) như hình phía trên.

                       Ví dụ về cách Dialogflow ánh xạ giữa yêu cầu của người dùng với một intent

Một intent về cơ bản sẽ bao gồm 4 thành phần chính sau:

  • Intent name: Tên của intent, dùng để phân biệt các intent khác nhau và giúp fulfillment có thể nhận dạng để xử lý yêu cầu (fulfillment sẽ có ở phần sau).
  • Training phrases: Những câu thoại người dùng có thể nói được lên sẵn để kích hoạt intent đó. Chúng ta có thể thiết lập sẵn những câu thoại tùy ý sao cho dễ nhớ nhất.
  • Action and parameters: Đây là danh sách các tham số được dùng để trích xuất thông tin cần thiết từ lời yêu cầu của người dùng để xử lý ở fulfillment hoặc cũng có thể dùng để phản hồi về cho người dùng dưới dạng tham biến.
  • Responses: Các câu thoại được soạn sẵn để Google Assistant phản hồi về cho người dùng.

Click chọn vào Default Welcome Intent, ở phần Training phrases chính là những câu thoại đã được soạn sẵn, người dùng chỉ cần yêu cầu 1 trong các câu có trong danh sách này sẽ nhận được phản hồi là một trong các câu thoại ngẫu nhiên đã được soạn sẵn ở phần Responses.

Để chạy thử ví dụ, ở phía bên phải giao diện console, các bạn gõ một câu thoại Training phrases bất kỳ vào cửa sổ Try it now, sẽ nhận được kết quả là một câu thoại ở phần Responses:

Các bạn có thể thêm hoặc xóa các câu thoại tùy ý để chạy thử nhé (nhớ bấm SAVE để lưu thay đổi trước khi thực thi).

Bây giờ chúng ta sẽ tạo Intent mới cho agent NodeMcuLed, chọn dấu + bên phải Intents từ thanh menu bên trái, đặt tên là Control_Devices sau đó thêm vào một vài câu Training phrases (chọn ADD TRAINING PHRASES) và Responses (chọn ADD RESPONSE).

Một vài câu thoại mẫu để điều khiển light và fan:

Sau đó chọn SAVE để lưu thay đổi và chạy thử ở cửa sổ Try it now:

Các bạn có thể nhận thấy một điều là agent đã ánh xạ yêu cầu của chúng ta đến đúng INTENT tên là Control_Devices và trả về một response chúng ta đã tạo phải không nào. Nhưng khoan đã, hình như có gì đó không ổn ở đây…. Lúc này dù đã ánh xạ đúng intent nhưng kết quả trả về được lấy từ phần Responses vẫn chỉ là một câu thoại ngẫu nhiên, chưa có quy luật logic hay nguyên tắc gì để agent trích xuất được thông tin cụ thể là “light”, “fan” hay “on”, “off” để có thể trả về chính xác vì thế có lúc ta nhập là “turn on the light” nhưng lại nhận được kết quả là fan is off. Vậy làm thế nào giải quyết vấn đề này? Đừng lo, giải pháp của chúng ta sẽ là Entity.

2. Entity là gì?

Entity là một cơ chế của Dialogflow giúp xác định và trích xuất các dữ liệu cần thiết từ đầu vào là yêu cầu của người dùng. Trong khi intent giúp agent có thể hiểu mục đích, ý định chung của người dùng thì entity có thể giúp agent trích xuất ra những thông tin chi tiết và cụ thể nhất của câu thoại. Ví dụ trong một câu thoại yêu cầu về dự báo thời tiết, entity có thể trích xuất ra được các thông tin cụ thể về địa điểm, thời gian hay trong một câu thoại yêu cầu điều khiển thiết bị thì entity có thể trích xuất ra được thông tin về loại thiết bị, trạng thái thiết bị, màu sắc,… Với ứng dụng giám sát và điều khiển thiết bị này, trong mỗi yêu cầu đầu vào chúng ta cần trích xuất 2 loại thông tin là loại thiết bị và trạng thái thiết bị. Vì thế mình sẽ tạo 2 entity có tên là devices status.

Để tạo Entity, chọn dấu + ở bên phải Entities từ thanh menu bên trái. Điền Entity name là devices, ở các hàng bên dưới là các entry tức là các giá trị cụ thể có thể có của entity đó và mỗi loại giá trị có thể tạo thêm các giá trị đồng nghĩa synonym (giúp agent có thể hiểu được nếu người dùng sử dụng những từ gần đúng hoặc đồng nghĩa) sau đó bấm SAVE để lưu thay đổi.

Tương tự ta tạo thêm một entity là status với 2 trạng thái on và off như sau:

Okay, như vậy chúng ta đã tạo xong 2 entity rồi, bây giờ chúng ta gán entity này vào các Training Phrases và Responses ở intent Control_Devices đã tạo trước đó. Quay trở lại intent Control_Devices, ở mỗi câu thoại ta đã soạn ở Training phrases với mục đích là điều khiển đèn và quạt đều chứa 2 tham số cần lấy là loại thiết bị (light, fan) và trạng thái (on, off).

Kick đúp vào các chữ “light”, “fan” ở mỗi câu sẽ hiện ra danh sách các entity đã có để chúng ta chọn, ngoài 2 entity là @devices và @status chúng ta đã tạo thì còn có các entity có tên bắt đầu bởi cụm @sys, đây là các entity hệ thống được Dialogflow cung cấp sẵn mô tả các dữ liệu quen thuộc như number, age, time,… để nhà phát triển có thể sử dụng ngay mà không cần tạo. Ở ứng dụng này chúng ta sẽ gán @devices cho thiết bị “light”“fan” (Lưu ý: nếu khi kick đúp vào thiết bị nhưng không thấy hiện entity đã tạo thì các bạn gõ @device sẽ thấy xuất hiện nhé).

Làm lần lượt cho các câu thoại khác và các trạng thái on, off các bạn gán cho entity là @status và sau đó chọn SAVE để lưu lại nhé. Lúc này các tham số chúng ta gắn với entity sẽ được highlight có màu sắc như thế này:

Lúc này nhìn xuống bên dưới sẽ là phần Action and parameters, các bạn chọn MANAGE PARAMETERS AND ACTION, các bạn sẽ thấy những tham số các bạn vừa gắn phía trên sẽ xuất hiện ở bảng này.

Điều này có nghĩa rằng các giá trị này sẽ hoạt động như một tham số trong quá trình thực thi agent, và ở phần Responses chúng ta có thể sử dụng chính giá trị được trích xuất từ những tham số này với cú pháp là $parameters, vì vậy chúng ta sẽ thay đổi nội dung response thành 1 câu duy nhất như sau: Okay, $devices is $status sau đó SAVE và chạy thử ở cửa sổ Try it now sẽ thấy kết quả trả về không còn bị nhầm lẫn giữa light-fan hay on-off nữa phải không nào.

Những nội dung được điền trong cửa sổ Responses ở trên được gọi là Static text response. Ở những phần tới chúng ta còn bắt gặp một loại response nữa là Webhook response với nội dung trả về sẽ linh động hơn và giúp dễ dàng tương tác với hệ thống phần cứng.

Từ phần 1 đến giờ chúng ta đã tìm hiểu về các khái niệm và cách xây dựng được các câu thoại mẫu về kịch bản điều khiển light và fan rồi nhưng vẫn chưa thấy bóng dáng của Google Assistant đâu cả phải không nào. Hẹn gặp các bạn ở phần kế tiếp mình sẽ hướng dẫn cách liên kết ứng dụng Dialogflow với trợ lý ảo Google và đợi xem Webhook response có gì thú vị nhé.

Xem tiếp phần 4: Mô phỏng và triển khai ứng dụng với Actions on Google Integration
Xem thêm:  Tổng hợp hướng dẫn Internet of Things với NodeMCU ESP8266 và ESP32

Nhóm TAPIT IoTs