見出し画像

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


この記事が気に入ったらサポートをしてみませんか?