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

Thiết bị của bạn có thể có những tính năng đặc biệt không thuộc phạm vi áp dụng của bộđặc điểm hiện tại– chẳng hạn như đặc điểm "nhấp nháy đèn" của một thiết bị có khả năng 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 mình để chỉ định các lệnh được gửi đến thiết bị để kích hoạt các tính 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 thao tác tuỳ chỉnh trên thiết bị để liên kết với một cụm từ tìm kiếm được so khớp
  • Văn bản được nói lại với người dùng nếu thiết bị hỗ trợ thao tác này
  • Tên lệnh được gửi về 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 đặt thông tin này vào một gói hành động. Gói Hành động 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 thao tác tuỳ chỉnh trên thiết bị được thực hiện cục bộ; bạn không chỉ định điểm cuối để xử lý 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ị không có tính chất trò chuyện.

Tạo Gói hành động

Hãy lấy ví dụ sau đâ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 một đèn LED. Sao chép mã này từ mã mẫu mà bạn đã 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 thao tác tuỳ chỉnh trên thiết bị:

  • Mẫu để khớp với truy vấn của người dùng (nhấp nháy N lần)
  • Thao tác tuỳ 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) nhằm 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 (Nhấp nháy N lần)
  • Tên lệnh (com.example.commands.BlinkLight) được gửi trả về thiết bị, cùng với mọi thông số (một số và có thể là cả thông tin 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ể sử 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 nào trong loại tuỳ chỉnh để 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 trường hợp, chẳng hạn như có nhiều đèn hỗ trợ tốc độ nhấp nháy khác nhau.
  • Các phần của mẫu TTS yêu cầu có thể là không bắt buộc. Ví dụ: sử dụng ($Speed:speed)? trong mẫu truy vấn để khiến phần này không bắt buộc.
  • $type.raw (ví dụ: $speed.raw) trong phản hồi TTS được thay thế bằng(các) từ mà người dùng thực sự đã nói.

Để biết nội dung mô tả về nhiều trường trong số này, hãy xem tài liệu về ActionPackage.

Triển khai Gói hành động

Sau khi tạo hành động tuỳ chỉnh cho thiết bị trong một Gói Hành động, bạn có thể cho phép Trợ lý truy cập vào Gói này.

Mặc dù có thể thực hiện các bước trong phần này trên thiết bị, nhưng bạn có thể sẽ dễ dàng thực hiện các bước đó trên hệ thống phát triển hơ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 công cụ gactions.

    rm creds.data
  3. Lưu gói Hành động của bạn vào Google bằng cách sử dụng CLI gactions. Thay thế project_id bằng mã nhận dạng dự án của bạn trong Bảng điều khiển Actions.

    ./gactions update --action_package actions.json --project project_id
  4. Lần đầu tiên chạy lệnh này, bạn sẽ nhận được một URL và phải đăng nhập. Sao chép và dán URL vào một trình duyệt (bạn có thể thực hiện thao tác này trên bất kỳ hệ thống nào). Trang này sẽ yêu cầu bạn đăng nhập vào Tài khoản Google. Đăng nhập vào Tài khoản Google đã tạo dự án trong bước trước đó trong bước.

  5. Sau khi bạn phê duyệt yêu cầu cấp quyền từ API, 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 thiết bị đầu cuối:

    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ư 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 của bạn ở chế độ thử nghiệm bằng cách sử dụng CLI gactions. Bạn phải lưu Gói Hành động của mình vào Google ít nhất một lần trước khi chạy lệnh này. Chế độ thử nghiệm chỉ bật Gói Hành động trên tài khoản người dùng của bạn.

    ./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 Actions.

  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.

Sửa đổi mẫu

Hãy thực hiện các bước trong phần này trên thiết bị.

nano pushtotalk.py

Thêm trình xử lý cho thao tác tuỳ chỉnh. Xin 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 cách 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.