Đăng ký Hành động tùy chỉnh trên thiết bị

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 mã này 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/grpc/
cp ~/assistant-sdk-python/google-assistant-sdk/actions.json .
Ví dụ
{
    "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.

  1. Tải công cụ dòng lệnh gactions xuống.

  2. 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
  3. 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
  4. 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.

  5. 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.
    
  6. 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.

  7. Để cập nhật gói Hành động, hãy dùng lệnh gactions update.

  8. (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 pushtotalk.py

Thêm một trình xử lý cho thao tác tuỳ chỉnh. Lưu ý rằng trình xử lý bên dưới đã được thêm vào mã mẫu cho Gói hành động mẫu ở trên.

...

device_handler = device_helpers.DeviceRequestHandler(device_id)

@device_handler.command('com.example.commands.BlinkLight')
def blink(speed, number):
    logging.info('Blinking device %s times.' % number)
    delay = 1
    if speed == "SLOWLY":
        delay = 2
    elif speed == "QUICKLY":
        delay = 0.5
    for i in range(int(number)):
        logging.info('Device is blinking.')
        # GPIO.output(25, 1)
        time.sleep(delay)
        # GPIO.output(25, 0)
        time.sleep(1)

Chạy mẫu

Chạy mã nguồn.

python pushtotalk.py

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:

Nhấp nháy 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.