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


この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

6

Google Home + Alexa 開発こぼれ話

Google Home や Alexa などボイスアプリの開発をしています。このマガジンでは開発中に得た失敗やノウハウをみなさんと共有します。
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。