![見出し画像](https://assets.st-note.com/production/uploads/images/5454606/rectangle_large_163bc9f4be7ccf02fb7f8c2d29885ff5.jpg?width=1200)
Alexaで自由テキストをつかむ方法 ー おうむ返しくんの場合 ー
ども、2017年中に10本のGoogle Home / Alexaアプリをリリースするぞ!と意気込んでいましたが、審査中のものを入れて現在8本。のこり6日で2本は 流石に無理そうです。。(こちらで公開中です)
さて、表題の件ですが、最近いろいろな人に聞かれるのでエントリーにしておきたいと思います。
Alexaにおける自由テキストの考え方
まず、Alexaにおける自由テキストの立ち位置ですが、これは、あまり推奨されていないといって良いと思われます。
もともとAlexaはGoogle Homeと違い、音声の段階からインテント分類機にかけてしまいます。その結果、アウトプットはインテントIDとスロット値となります。ユーザーが発話した文章を、ママ自由テキストとしてとってくることは、難しいといいますか、基本設計として考えられていないと思います。
ちなみにGoogle Homeは、まずユーザーの発話をGoogle内のSpeech-to-text処理にかけ、「オリジナルのテキスト」として出します。それをDialogFlowの分類機にかけ、インテント化するという工程です。オリジナルテキストが存在するため、自由な発話を料理するのは断然Google Homeがやりやすいですね。
Alexaの場合その代わり、インテントにきちんと発話例を乗せてしまえば、認識率はGoolge Homeの比ではないです。
たとえば、Google Homeで「1番」と認識させたいとき、「市場」「千葉」を別認識してしまうため、揺れの回収処理が必要ですが、Alexaなら発話例に「1番」と入れておくだけで、市場も千葉も「1番」として抽出してくれるため、決まったワードを言わせたいならAlexaに軍配があがります。
Alexa、Goole Homeの自由テキストの特性の違いをまとめますと、
・Alexa はオリジナルテキストという概念がない。発話はそのままインテントIDとスロット値に分類される。
・Google Home はまずオリジナルテキストを生成する。それをDialogFlowでインテント処理するため、オリジナルテキストを取得可能。
Alexaでの自由テキストの取得方法
Alexaの公式ドキュメントを見ても、自由テキストに関する記述は見当たりません。取得できないのかと、いろいろググってみますと、英語版では「Amazon.Literal」というスロットがあるのを発見しました。
これはリテラル値、つまり生テキストをそのまま値にするタイプのスロットですが、残念ながら日本語版には未搭載のようです。で、もう少し調べてみますと、こんなエントリーに当たりました。
Why a Custom Slot is the Literal Solution
どうも、アマゾンはAmazon.Literalを廃止しようとしていたようですね。それをユーザーの猛反対にあって撤回したよ、という主旨のようです。さらにカスタムスロットを使えばLiteralがなくてもフォールバックできるよ、と書いてありましたので、この方法を参考に「おうむ返しくん」を作ってみました。
カスタムスロットの設定
「おうむ返しくん」は最初にリリースしたGoogle Home & Alexa向けアプリです。ユーザーの発話を繰り返すだけの、いわばテスト用アプリです。ここで使っている方法をご紹介します。
やり方はても単純です。「カスタムスロット」を作るだけです。
「カスタムスロット」を作ると、定義されたスロット値がある場合はそれに寄せてValue化しますが、もしも寄せるべき値がない場合、Alexaは一般的なリテラル値として無理やりスロットに入れる、という動作をします。
ですので、用意するのは「なんでも受け取るカスタムスロット」です。下記のように設定します。スロット名は「any」とでもしておきます。
Valueは「ほげほげ」にしました。ここにサンプルValueがあればあるほど、それに寄ります。サンプルが少なければ、寄せるものが見つからずにリテラル値としてスロットに入ります。
インテント作成
次に、インテントを作成します。適当に「input_any」というインテントにします。
インテントと作ったらサンプル発話に、
{any}
のみ入れましょう。スロットは先ほどの「anyスロット」を選択します。
以上です。簡単ですね。
これだけで、スロット「any」にはユーザーが発話した自由テキストがすべて入ります。あとはプログラムサイドで、input_anyインテントを監視して、anyの値をいろいろ料理するだけです。
悩ましいのは、カスタムスロットが複数あるときですね。一方をサンプル値ベースのスロットに、そしてもう一方を自由テキスト用のスロットに使いたい、というシチュエーションはままあるわけですが、このとき、うまくインテントを設定しないと、うっかり自由テキストが前者に落ちてきたりします。これは厄介ですので、インテントの切り分けはうまく設定したいところです。
はたしてこれは正攻法なのか?
一抹の不安があるなら、上記ははたして正攻法なのか?という点です。
おそらく、Amazon的にはこのようなスロットの使用法を推奨しないと思われます。Amazonとしては「ユーザーが思いつく発話はすべて列挙せよ」と言いたいでしょう。公式ドキュメントもそんな方向性を示唆しています。
最近のスキルの審査では、インテント設定まで細かくチェックされる傾向にあるようです。もしかすると、上記のやり方では審査落ちまくりかもしれません。「おうむ返しくん」は運良く通っただけのような気もします。ということも念頭に、参考にしていただければ幸いです。
その他いろいろアプリリリースしています!
よろしければ、見てやってください。→ VoiceApp Lab