Alexa でユーザー発話全文を取得する最善の方法は?
(English version of this article is here)
cheerio-the-bear.hatenablog.com
Google Home 用に作成した下記アプリケーションを Amazon Echo に移植するために、Alexa に対するユーザーの発話の全文を取得する方法を幾つか試してみていました。
ちなみに、この Google Home 用アプリケーションの説明はこちら。
cheerio-the-bear.hatenablog.com
今回試してみたのは、これらの三種類の方法です。
方法 1. AMAZON.SearchQuery を使う
この記事を書いている時点では、フレーズを対象とするスロットタイプは AMAZON.SearchQuery だけです。きっとこれを使ってユーザーの発話を全て取得できるものと思ったのですが、その利用条件が今回のユースケースに合いませんでした。下のスクリーンショットのエラーメッセージをご覧ください。
ユーザーの発話内容の全文を取得したいので、発話サンプルには "{スロット名}" だけを設定したいのですが、そのような使い方は許容されません。"{スロット名} と言ってください" みたいなケースでは、しっかり仕事をしてくれると思われます。
方法 2. AMAZON.Color を使う
AMAZON.Color に関する話題が書かれている、下記のページを見つけました。予め登録されている「赤」や「緑」といった色の名前だけではなく、ユーザーが自由に発話した内容もそのまま入ってくるようです。使ってみると確かにその通りで、事実、つい先日までこの AMAZON.Color を使う方法を選択していました。
しかし、「ユーザーの発話内容が何らかの色の名前に近い場合に、その色名に寄せて認識されることがあるかもしれない」という疑念が浮かんだため、別の方法に置き換えることにしました。実際にそうなるかどうか試したわけではないので、もしかするとそのままでも良かったのかもしれません。
方法 3. カスタムスロットタイプを使う
あれこれ試しましたが、最終的にはカスタムスロットタイプを作って適用することにしました。このカスタムスロットタイプ 'Utterance' には、特に意味のない発話サンプル 'a' ひとつと、これまた特に意味のない同義語 'a a' ひとつを登録してあります。この同義語 'a a' の真ん中にスペースが入っているのが味噌です。
最初からこの同義語 'a a' が必要だと考えていたわけではありません。例えば、ユーザーの発話が 'book' のように単語ひとつから成るものであれば、そんな同義語がなくても何も問題はありません。このカスタムスロットタイプを適用したスロット 'utterance' に、それがしっかり入ってきます。
しかし、ユーザーの発話が複数の単語で構成されている場合にはうまくいきません。例えば 'red book' のように二つの単語から成るフレーズを発話すると、カスタムスロットタイプに合致せずに AMAZON.FallbackIntent が発動してしまいます。
複数の単語(?)から成るフレーズ 'a a' を同義語として追加することで、この問題が解決されます。これにより、システムは複数の単語で構成されるユーザー発話も対象にして良いと認識するようです。下記のスクリーンショットのように、このカスタムスロットタイプを適用したスロット 'utterance' に、ユーザーが発話した全文が入ってくれます。
完全な方法だとは言えませんが、これが現在選択し得る最善の方法なのではないでしょうか。