algonote

There's More Than One Way To Do It

Alexaスキル作成の勘所

個人でAlexaスキルを作ったので流れ、はまりどころをまとめてみる。

f:id:hiromichinomata:20181007132420p:plain:w200

作ったもの

ひたすらプロポーズする「プロポーズ紳士」。まあネタスキル。

ショートカットを教えてくれる「ショートカットウルフ」。Alexa Skill Awards用に作ったが選ばれなかった。

Alexaスキル作成の流れ

AlexaスキルはAWS Lambdaを使うのが標準のやり方。個人別の情報を保存したい場合にはDynamoDBを使うのがデファクトスタンダード。

Echo <=> Lambda (<=> DynamoDB)

同じユーザーからの連続したリクエストでも独立しており、Context情報が必要な場合には毎度Responseに含め、後続リクエスト時はEdge側にその情報を含めてリクエストしてもらう形式。

Webのインターフェースからスロット(同義語)の定義、スロットの組み合わせと文のパターンマッチで呼ばれるインテントを定義できる。node.jsだとAlexaのSDKが直近でv1からv2にあがっており、1インテント1ファンクションでなくても紐づけられるようになった。

Alexaは8秒応答がないと再度聞く、さらに8秒反応がないと終了となる。単純なWebサーバーと違い入力に対して応答だけでなく再応答(Reprompt)も考える必要がある。

できないこと

  • ユーザー音声の取得
    Amazon Echoに吹き込まれたユーザーの実音声をとることはできない。Lambda関数にはAmazonが処理したテキストデータのみが渡される。機械学習用に抜こうと思っても抜けない。組み込み用にAlexa Voice Serviceというのはある。

  • 会話内での広告
    会話内での広告は禁止。これはGoogle Homeも同じ。Amazonはホームカードに広告を仕込むのを明確に禁止している。

  • 長い音声ファイルの再生
    AlexaはSSMLをサポートしているが(Clovaは対応していない)音声ファイルの再生時間には制限がある(90秒)。Alexaに読み上げてもらう代わりに例えば人間が実際に読み上げた音声を流したい場合注意が必要。

  • 喋るキャラクターの表示
    Echo Spot用のAPIで画像は表示できるがgifアニメは使えない。動画は差し込めるが、喋りに同期してLip Syncなどはできない。

申請

よくリジェクトされる。以下Reject集

  • 言い回しの異なるサンプル発話が不足しているとReject
  • 組み込みのインテントは実装マスト。ヘルププロンプトはユーザーへの質問で終わっていないとReject
  • スキルが応答した後はユーザーへのプロンプトを提示しないといけない。質問せずセッションが開いたままになっているとReject
  • 対象ソフトが複数ある場合、選択できる選択肢を全てスキル詳細に書かないとReject
  • Echo Spot対応していないとReject 。ディスプレイ付き端末も出ているのでそれを考慮しないといけない。発話にSSMLを使っている場合、ディスプレイはちゃんとサニタイズしないといけない。

その他

LineのClovaの画面やGoogle Assistant用のDialogflowでも作成の流れは同じ。いい感じのラッパーはなく個別にポートするイメージ。

Node-REDというGUI上でFlowを構築する技もある。Functionの各Stepをつなげていくイメージ。

所感

インテントの定義などはファイルアップロードの仕組みはあるものの基本Webのインターフェイスで定義する前提。ローカルで開発が完結できないのはまだ成熟期だからか。

同義語の定義や会話パターンなどは大量のif文とパターンマッチといった趣。あまりテックぽくない。意味の近い語は自動でよしなにやってほしい。

Future Work

Siri Shortcuts、Cortana Skillsとか