Thiết bị của bạn có thể có các tính năng đặc biệt không thuộc bộ đặc điểm -- chẳng hạn như "nhấp nháy đèn" đặc điểm của thiết bị có thể nhấp nháy đèn. Bạn có thể xác định các thao tác tuỳ chỉnh cho thiết bị của bạn để chỉ định các lệnh được gửi đến thiết bị của bạn để kích hoạt các khả năng đặc biệt.
Để xác định một thao tác tuỳ chỉnh trên thiết bị, bạn cần có:
- Mẫu để khớp với truy vấn của người dùng
- Một hành động tuỳ chỉnh trên thiết bị để liên kết với một truy vấn được so khớp
- Văn bản được đọc lại cho người dùng nếu thiết bị hỗ trợ thao tác này
- Tên lệnh được gửi trở lại thiết bị của bạn, cùng với mọi tham số
Bạn tạo thao tác tuỳ chỉnh trên thiết bị bằng cách đưa thông tin này vào một gói hành động. Các gói hành động sẽ xác định định dạng cho các phản hồi của Trợ lý. Không giống như SDK Hành động, các hành động tuỳ chỉnh trên thiết bị được thực hiện trên thiết bị; bạn không chỉ định điểm cuối để xử lý các yêu cầu và cung cấp phản hồi. Các thao tác tuỳ chỉnh trên thiết bị là không mang tính trò chuyện.
Tạo Gói hành động
Lấy ví dụ như sau, hãy tạo một tệp (chẳng hạn như actions.json
)
xác định một lệnh kiểm thử: nhấp nháy đèn LED.
Sao chép tệp từ mã mẫu mà bạn
được tải xuống ở bước trước:
cd assistant-sdk-python/google-assistant-sdk/googlesamples/assistant/library/
cp ~/assistant-sdk-python/google-assistant-sdk/actions.json .
{
"manifest": {
"displayName": "Blinky light",
"invocationName": "Blinky light",
"category": "PRODUCTIVITY"
},
"actions": [
{
"name": "com.example.actions.BlinkLight",
"availability": {
"deviceClasses": [
{
"assistantSdkDevice": {}
}
]
},
"intent": {
"name": "com.example.intents.BlinkLight",
"parameters": [
{
"name": "number",
"type": "SchemaOrg_Number"
},
{
"name": "speed",
"type": "Speed"
}
],
"trigger": {
"queryPatterns": [
"blink ($Speed:speed)? $SchemaOrg_Number:number times",
"blink $SchemaOrg_Number:number times ($Speed:speed)?"
]
}
},
"fulfillment": {
"staticFulfillment": {
"templatedResponse": {
"items": [
{
"simpleResponse": {
"textToSpeech": "Blinking $number times"
}
},
{
"deviceExecution": {
"command": "com.example.commands.BlinkLight",
"params": {
"speed": "$speed",
"number": "$number"
}
}
}
]
}
}
}
}
],
"types": [
{
"name": "$Speed",
"entities": [
{
"key": "SLOWLY",
"synonyms": [
"slowly",
"slow"
]
},
{
"key": "NORMALLY",
"synonyms": [
"normally",
"regular"
]
},
{
"key": "QUICKLY",
"synonyms": [
"quickly",
"fast",
"quick"
]
}
]
}
]
}
Ví dụ trước sử dụng thông tin sau để xác định thiết bị tuỳ chỉnh hành động:
- Mẫu để khớp với truy vấn của người dùng (nhấp nháy N lần)
- Hành động tùy chỉnh trên thiết bị để liên kết với một truy vấn phù hợp (
com.example.actions.BlinkLight
) cho mục đích tổ chức - Văn bản được đọc lại cho người dùng nếu thiết bị hỗ trợ thao tác này (Nhấp nháy N lần)
- Tên lệnh (
com.example.commands.BlinkLight
) được gửi lại về thiết bị, cùng với bất kỳ thông số nào (một số và có thể là nội dung mô tả về tốc độ)
Để xác định mẫu truy vấn, hãy lưu ý những điều sau:
- Bạn có thể dùng các loại do schema.org xác định trong mẫu truy vấn.
- Mảng
types [...]
xác định danh sách các loại tuỳ chỉnh (ví dụ:$Speed
). - Bạn có thể sử dụng loại tuỳ chỉnh trong mẫu truy vấn. Người dùng có thể nói bất kỳ từ đồng nghĩa trong loại tùy chỉnh của bạn cho phù hợp với mẫu truy vấn.
- Khi một từ đồng nghĩa khớp, thực thể loại (
speed
) sẽ trả về khoá chuẩn hoá (SLOWLY
). Có thể có nhiều thực thể trong ví dụ: có nhiều đèn khác nhau hỗ trợ các tốc độ khác nhau nhấp nháy. - Các phần của mẫu TTS của yêu cầu có thể là không bắt buộc. Ví dụ: hãy sử dụng
($Speed:speed)?
trong mẫu truy vấn để biến phần này thành không bắt buộc. $type.raw
(ví dụ:$speed.raw
) trong TTS phản hồi được thay thế bằng(các) từ mà người dùng thực sự nói.
Để biết mô tả về nhiều trường trong số này, hãy xem ActionPackage tài liệu.
Triển khai Gói hành động
Sau khi tạo hành động tuỳ chỉnh theo thiết bị trong một gói Hành động, bạn có thể thực hiện Gói hành động mà Trợ lý có thể truy cập.
Mặc dù bạn có thể thực hiện các bước trong phần này trên thiết bị của mình nhưng sẽ dễ dàng hơn để thực hiện chúng trên hệ thống phát triển của bạn. Các lệnh sau đây không yêu cầu môi trường ảo để chạy.
Tải công cụ dòng lệnh
gactions
xuống.Xoá mọi thông tin xác thực hiện có khỏi cùng thư mục với
gactions
.rm creds.data
Lưu gói Hành động vào Google bằng cách sử dụng CLI
gactions
. Thay thếproject_id
bằng dự án Bảng điều khiển Actions Mã nhận dạng../gactions update --action_package actions.json --project project_id
Lần đầu tiên chạy lệnh này, bạn sẽ được cấp một URL và được yêu cầu đăng nhập. Sao chép URL rồi dán vào một trình duyệt (bạn có thể thực hiện việc này trên mọi hệ thống). Trang này sẽ yêu cầu bạn đăng nhập vào Tài khoản Google của mình. Ký vào Tài khoản Google mà bạn đã tạo dự án trong bước.
Sau khi bạn phê duyệt yêu cầu cấp quyền từ API, một mã sẽ xuất hiện trong trình duyệt của bạn, chẳng hạn như "4/XXXX". Sao chép và dán mã này vào ga:
Enter the authorization code:
Nếu yêu cầu uỷ quyền thành công, bạn sẽ thấy một phản hồi tương tự như như sau:
Your app for the Assistant for project my-devices-project was successfully updated with your actions.
Triển khai gói Hành động ở chế độ thử nghiệm bằng cách sử dụng CLI
gactions
. Bạn phải từng lưu gói Hành động vào Google ít nhất một lần chạy lệnh này. Chế độ thử nghiệm bật Gói Hành động trên tài khoản người dùng../gactions test --action_package actions.json --project project_id
Hiện tại, bạn không thể kiểm thử dự án bằng Trình mô phỏng hành động.
Để cập nhật gói Hành động, hãy dùng lệnh
gactions update
.(Không bắt buộc) Bạn có thể tạo gói Hành động đã bản địa hoá hỗ trợ nhiều ngôn ngữ và khu vực cùng lúc trong một dự án duy nhất.
Sửa đổi mẫu
Thực hiện các bước trong phần này trên thiết bị.
nano hotword.py
Thêm một trình xử lý cho thao tác tuỳ chỉnh. Bạn có thể sử dụng trình xử lý bên dưới nếu muốn để sử dụng Gói hành động mẫu ở trên.
import time # Add this to the imports near the top of the file ... if event.type == EventType.ON_DEVICE_ACTION: for command, params in event.actions: print('Do command', command, 'with params', str(params)) # Add the following lines after the existing line above: if command == "com.example.commands.BlinkLight": number = int( params['number'] ) for i in range(int(number)): print('Device is blinking.') # GPIO.output(25, 1) time.sleep(1) # GPIO.output(25, 0) time.sleep(1)
Chạy mẫu
Chạy mã nguồn đã sửa đổi.
python hotword.py --device-model-id my-model
Hãy thử một cụm từ tìm kiếm. Đối với ví dụ trên, hãy thử các bước sau:
Ok Google, chớp mắt 5 lần.
Lưu ý rằng truy vấn cần phải khớp với mẫu truy vấn trong Gói hành động.