Alexa で遊んでみた。

どうもです。まーやです。本当はJAWS DAYS2017よりも前に書きたかったんだけど、諸々の理由で(主に発表ラッシュで)全然手が付けられていなかったので今頃ブログにしておきます。Amazon Alexaのカスタムスキルを自分で作ってみたよ、って話です。

Amazon EchoとAlexaとSkillの関係

Amazon Echoというのを聞いたことある方も多いのではないでしょうか。2016のクリスマスプレゼントで大フィーバーしたと噂の、音声認識機器です。現在は英語とドイツ語のみ対応で、まだ日本未発売ではありますが、近々日本でも発売されるんじゃないかな・・・してくれないかな・・・と思ってる次第です。

これは、「Alexa, ask [skill名] to [命令文]」という声かけをすると、対象の処理を実行してくれるものです。デフォルトで天気や時間を答えてくれるSkill(実行処理のこと)が登録されていたり、こちらのページから自分のEchoに新しいSkillを登録して利用することもできます。このSkillと呼ばれる実行処理は自分自身で作成し、公開することができるので、多くの企業がSkillの公開に取り組んでいます。直近の90日間の間に4000以上のSkillが公開されていることからも注目度が高いことが伺えます。

このAmazon Echoの中で動いている「音声認識処理」を行っているのがAmazon Alexaです。まずはEchoとAlexa、それからAlexaの周辺ツールの関係性について見て見ましょう。
TGI3 (1)
Echoは、Alexa Voice Service(略してAVS)と呼ばれる音声収集・発話機能が搭載されています。AVSで取得した音声データは、クラウド上に存在するAlexaに送付されます。Alexaは受け取った音声を解析し、テキスト化します。テキスト化した命令文は対象のSkillに送付され、実際に行いたい処理が実行されます。このSkillの実態はAWS Lambdaです。実際はAWS Lambda上にアップロードしたSkillをAlexaと紐づけることで、処理を実行させています。Skillコードの中ではAlexa Skill Kit(略してASK)を使って、Alexaから送られた命令テキストやセッション情報を受け取り・利用します。

SkillはただのAWS Lambdaなので外部APIを呼んだり、別のAWSサービスを呼び出したりすることが可能です。また、実行した処理に対して、音声発話を返却したい場合は、ASKを通してAlexaに発話させたい文章を戻してやることで、AVSへ戻って行き、発話されます。

日本でやって見たい場合

残念ながらEchoシリーズは日本で販売されていません。が、実行して遊ぶことはできます。それがechosim.ioです。まだベータ版ではありますが、ブラウザ上でEchoと同じ処理を実行・発話してくれます。Amazon.comのサイトからSkillを登録してやれば、登録したSKillも利用することが可能です。ただし、Amazon.com(米国のアマゾンサイト)のアカウントが必要です。

実際に自作Skillを作ってechosim.ioから利用してみよう

実際にechosim.ioから自分で作ったskillを動かしてみることにします。今回のゴールは「(エアコンとスマート家電しているテイで) エアコンの温度の上げ下げをしましたメールが送付される」です。

  • 準備するもの
    • Amazon.com(米国アマゾン)のアカウント
    • Amazon.com developerのアカウント
      • Amazon.comのアカウントでdeveloper登録してください
    • AWSアカウント
      • 日本も米国も関係ないので大丈夫です。まだアカウント持ってない方は是非。
    • Node.jsの開発環境
      • 今回はNode.jsで作成することにしました(サンプルコードがいっぱいあるので)。他の言語の対応状況は調べてません。
    • マイクとスピーカーがついているPC
    • echosim.io
      • Amazon.com(米国アマゾン)のアカウントでサインインしときましょう。

Alexa設定の準備

まずはAlexaの設定の準備を行います。用意する設定は3種類です(下記リストに私が今回作成した設定にリンクさせていますので参考にしてみてください。英語の文法がおかしいかもですがとりあえず今はお気になさらず・・・。)

Utterancesは実際にどんな命令文が飛んできた場合にどの処理を実行させるのかを指定するものです。命令文例集ですね。

[IntentName] [例文]
ThermoregulationIntent {RaiseLower} {Degree} degrees

この文章は↑
①ThremoregulationIntent は対象の処理(一連の処理のことをAlexaではIntentと呼びます)の名前です。
②ThermoregulationIntentよりも後ろは全て例文です。{RaiseLower} {Degree} は変数(Alexaではslotと呼びます)です。ここに入ってきた文字列はSkillの中で利用することができます。slotの型などはこの後説明するIntentSchemaで設定します。

Utterancesに当てはまらない文章は、似たような言い回しであっても受け付けてくれませんので、例文の設計はとても重要です。表現揺れさせたい部分についてはうまくslotなどを利用して設定しておく必要があります。

IntentSchemaはJSON形式で設定するIntentの設定情報です。いくらUtterancesをきちんと登録してあっても、Intent名がIntentSchemaに登録されていなければ処理が発動しません。また、Utterancesで設定した変数もIntentSchema内でslotとして定義しておく必要があります。slotの型はintentライブラリ一覧にあるAmazonデフォルトのものはもちろん、自分で指定したリストの中の値を設定することができます。

{
    "intents": [{
        "intent": "ThermoregulationIntent",
        "slots": [{
                "name": "Degree",
                "type": "NUMBER"
            },
            {
                "name": "RaiseLower",
                "type": "RaiseLowerList"
            }
        ]
    }]
}

上記例ではThermoregulationIntentにDegreeとRaiseLowerのslotを定義しています。Degreeはもともと用意されているNUMBER型、RaiseLowerは自作リストを型に設定しています。

自作型リストは必要な場合のみ設定を行います。今回はRaiseLowerListという名前に「Raise」と「Lower」を紐づけることにします。自作リストについてはこちらに記載されているので、一度読んでおくことをオススメします。

Skillコードの作成

Skillの作成をします。 Alexa関連のコードはこちらに公式から用意されています。ASKやAVSもここで手に入ります。alexa-sample-hoge のプロジェクト全てサンプルプロジェクトなので、このあたりのサンプルコードを見ながら実装してみます。

実際に私が書いたコードはこちらです。

L184 から始まるハンドラの設定がLambdaから呼び出されます。handlerに処理を持たせるのはAWS Lambdaの決まり事です。このコードではevent変数にAlexaから送られてきた命令文解析情報が入っています。実際にAlexaから送られてくる情報については、後ほどAmazon.com developerコンソールで見ることができますので、今はとりあえず「ふーん」程度に見ていただければ。

今回はThermoregulationIntentという名前のIntentが送られてきたら、

  • メール用・発話用の文章を作成
  • AWS SNS を使ってメールをpublish
  • 発話文章をcallback

しています。AWS SNSのトピック作成と、LambdaのIAM role の作成もここで一緒にやっておきます。roleポリシー例はこちらにあります。好きにカスタマイズしてください。

ここまで完成したら、通常のAWS Lambdaへのアップロード準備と同様にnode_mduleを含む全てのSkillコードをzipします。そしてLambdaへアップロードしましょう。

AWSコンソールから米国リージョンになっていることを確認してLambdaの新規作成をします。Alexaで検索を行うと色々テンプレートが出てきますね。ここで検索しても検索結果が0件の場合は多分リージョン間違ってます。とりあえす「alexa-skills-kit-color-expert」を選択してみます(ブランク関数から作ってももちろんOK)。

スクリーンショット 2017-03-29 15.47.55

わーい。トリガーにAlexa Skills Kitが設定されたぞー。次へ。

スクリーンショット 2017-03-29 15.53.47

名前などは適宜いれてもらって、先ほど作ったzipをアップロードします。また、これまた先ほど作成したroleもここで指定をしておきます。設定内容を確認してLambda functionの作成が完了です。作成したfunctionにARNが発行されていると思うので、メモしておいてください。次のAlexaの設定時に使います。

arn:aws:lambda:us-east-1:123456789012:function:hogehoge

ここまでAWS Lambdaの作成やIAMroleのポリシー設定、AWS SNSのトピック作成など、AWS関連の作業についてすっ飛ばして説明してきました。よくわからない人はそれぞれググっていただければ幸いです。

Alexaの設定

次は今まで作ってきたものを全部Alexaに紐づけていきます。Amazon developer コンソールにログインします。ログインしたら上部メニューから「ALEXA」を選択し、メインエリアに表示された「Alexa Skills Kit」を「Get Started」します。

スクリーンショット 2017-03-29 16.03.34

「Add a new Skill」を押していざSkillの登録へ。

スクリーンショット 2017-03-29 16.06.22

skill情報の登録から開始します。Skill Typeは3種類選べますが、今回は「Custom Interaction Model」を選択してください。Smart Home Skill APIはその名の通りスマートホームに適した設定がすでに設定済みの状態からスタートできるSkillの登録処理、Flash Briefing Skill APIはニューストピック読み上げ処理を作成するときにだけ使える登録処理です。今回は説明は省きます。Invocation Nameが実際に「Alexa, ask XXX」と呼び出すときのSkill名になりますので読み上げやすい短い名前をお勧めします。登録したら「save」を押下して「next」。

スクリーンショット 2017-03-29 16.09.04

次が一番の設定どころ。alexaのモデル設定です。ここで最初に作成した設定情報であるIntentSchema / 自作slot型(Custom slot type) / を登録します。

FireShot Capture 66 - Amazon Apps & Services Developer Porta_ - https___developer.amazon.com_edw_h

最後にAWS Lambdaとの接続を行います。メモしておいたARN情報を設定しましょう。ちなみに、Lambda作成でなくても、HTTPSのAPIを実行処理として接続させることも可能です。また、外部サイトで認証処理などを行わせたい場合は下部の「Account Linking」を設定すればOKです。

スクリーンショット 2017-03-29 16.22.42

ここまでの処理をsaveして設定完了です。お疲れ様でした。まだ設定ページは続いていますが、ここから先は実際にAmazon.comへ公開するための申請フローになります。自分個人だけで遊ぶ場合はここまでの設定でOKです。

テストコンソールで遊ぶ

実際にechosim.ioで遊ぶ前にテスト稼動させてみましょう。一つ前の項のAmazon developer コンソールの左メニューのTestを選択してください。「Enabled」になっていることを確認して、
スクリーンショット 2017-03-29 16.31.59

ページ下部のService Simulatorに命令文を打って「Ask」してみてください。このとき打つ文章は、命令文のみにしてください。「Alexa, ask XX to」は除いてその後ろの文章から記載します。

askボタンを押下した後、Lambda RequestとLambda Response にJSONが帰って来れば連携完了です。Lambda Requestに表示されているJSONがSkillコード作成時に取得していたデータ(event変数の中に入っていたデータ)です。slotで取得した変数情報もRequest内で確認できると思います。Lambda Responseが正しく帰ってきていれば、JSONの右下にある「Listen」で実際の発話音声を聞くことができます。すごい発音キレイ。素敵。

Lambda ResponseにJSONが返却されない場合はCloudWatchログから処理がこけている箇所を探してみると良いでしょう。ログさえ出ていなければ、IAM周りでこけているかもしれません。

echosim.ioで遊ぶ

developerコンソールでエラーを潰したら、やっとechosim.ioで遊べます。マイクボタンを長押ししている間の音声が解析対象になります。マイクから話しかけてみましょう。

Alexa, ask [Skill名] to [命令文]

askの部分はAlexaで指定されている単語のどれを使ってもOKです。runやtellなどがあります。

終わりに

超長くなってしまいましたがこれで今回遊んでみたブログはおしまいです。いきなりカスタムSkill作成をゴリゴリやったりAWS別サービスと連携したりしてますが、最初からカスタムSkillをいじっていたわけではありません。コーディングいらずのFlush Brifing SkillなどはRSSを設定するだけで使えるようになります。まずはこの辺からいじってみると挫折なく楽しくもくもくできるのでおすすめです。あとはとにかく発話だけ返すカスタムSkill作ってみるとか。

もっとハンズオンとしてまとまった資料もありますのでチャレンジしてみてください。では、楽しいAlexaライフを〜!

JAWS DAYS 2017 ハンズオン alexa skills kit で遊ぼう【基礎編】
JAWS DAYS 2017 ハンズオン alexa skills kit で遊ぼう【応用編】

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中