Alexaハンズオン初級に参加してきました!

Alexaハンズオン 初級に参加してきました!

先日、Alexaハンズオン初級に参加してきました!Skillは作ったことがあったものの、Storylineでしか作っていないので(作りかけて開発環境云々でストップ)、一回きちんと作りたい!と思っていた私は即参加をクリック。

事前に送られてきたメールに書いてあるリンクから、ソースコード、Skillのアイコン等々が入ったzipファイル、今回のテキストのPDFファイルをダウンロードし、準備完了!

一人で参加するハンズオンって緊張するなぁと思いながら歩いていると、梅田駅周辺で迷子に。なんで会場の最寄りで降りずに梅田から歩いて行こうと思ったんやろうか…などと思いながら、なんとか開始ギリギリに会場であるアマゾンジャパン大阪支社に到着。Google先生曰く、徒歩15分のところを30分かかりました。

会場入り口では、綺麗なお姉さんとイケメンなお兄さんが受け付けをしていらっしゃる…ついに来てしまった、アマゾン大阪…!となりながら、会場入り…した瞬間にお知り合いの方がいらっしゃって、こんにちは〜とご挨拶。お会いした事のある方がいらっしゃると、やはり安心しますよね…笑

平日だからか、比較的余裕のある会場内。お隣が空いてるな、一人かな。となっていると始まる直前に女性の方が来られました。

14時、ついにスタート!

自己紹介から始まる平和な空間

まずは、自己紹介。周りの方々と4人グループを組み、名前、どこからきたか。なんで参加したかを紹介していきました。

その後は、Alexa Skillの説明です。Skill storeを開き、有効にしているスキルを確認すると、開発しているSkillがある人はdev skillが表示されます。

次はAlexa Skillの仕組みの解説。クラウドベースの音声サービスには機械学習、自動音声認識(ASR)、自然言語理解(NLU)、音声合成(TTS)などがあります。(あと1つ何かが抜けているのですが、メモ漏れしました…)

Alexaはセキュリティ面を考慮し、聞いた音声をテキストに変換するため、音声データは飛んでこないので、年齢や感情、性別は判断できないとのことでした。この辺りも踏まえて、Skill開発をした方がいいとのことでした。

説明が終わり、いよいよ作っていきます!

Skill作成開始

まずはAlexaコンソールを開き、コンソールからスキルを作成を選択します。

次に呼び出し名の設定をします。今回はコーヒーを注文する、コーヒーショップというスキルを作るそうなので、そちらを入力。スキル名の中は名詞を二つつけないと設定できないようになっています。一つにしているとwikipediaに飛んでしまうそう。(その前に審査で引っかかってリジェクトされますが…)

そして、カスタムインテントを追加していきます。少なくとも1個以上追加しないといけません。カスタムインテントの中にサンプル発話を入れていきます。少しでも違うと認識しないので、増やせば増やすほどSkilの動きは確実になっていきます。サンプル発話に関西弁を入れると関西弁をAlexaが学習していくらしい…サンプル発話がたくさんある方は一括編集が便利だそうです!

サンプル発話を作成する際の注意点

サンプル発話には、感嘆符(!や?など)をつけたらエラーが出ます。また、英語単語のはカタカナで入力しなければなりません。その後、モデルをビルドします。私は”?”を入れたので一度ビルドが失敗しました…直したらきちんとビルドできました!

続いてエンドポイントについてのお話です。エンドポイントでそのスキルが何でするかが決まります。skill IDをコピーしたら、Lambdaを開きます!

Lambdaでの作業

Lambdaのページの”一から作成”を選択し、テンプレートから新しいロールを作成。その後、ポリシーテンプレートを選択します。今回は大きなデータ(S3など)を使わないのでシンプルなマイクロサービスのアクセス権限で大丈夫だそうです!そして、関数を作成します。

Lambdaはどこから呼び出す?ということで、トリガーを設定します。今回はAlexa Skills Kitを選択します。そして、トリガーの設定で先ほどコピーしたskillのIDを貼り付けます。

何を出したかということでログを出してきたい際は、Amazon Cloud Watch logsを設定しておくと便利だそうです。

関数を作るとLambdaの住所の役割であるarnができます。これが”エンドポイント”になります。arnをコピーすることをお忘れなく!

再びalexa developコンソールに戻ります。

ついにSkill完成

エンドポイントのところにarnを貼り付け、カスタムに戻って四つチェックがついていたら、skill完成しました!

いざテスト!一回声でテストしてみましょう!タイプでもテストが出来ますが、絶対一度は音声でテストをしてみて欲しいとのことでした。

テスト画面では入力/出力のJSONを見ることができます。

ユーザーのリクエストが増えた時は addRequestHandlers( のなかに増えたリクエストハンドラーを足していきます。

詳しくは下記の公式ドキュメントをご覧ください!

Alexaの返答を作る

Requestの種類は3つあります。

LaunchRequest:呼び出し名だけで発話がなかった場合。

IntentRequest:スキルの呼び出し名の後の発話にマッチするインテントがあった場合。

SessionEndedRequest:コードによるセッションの終了以外の理由(ユーザーがalexaやめてと言った時など)で、セッションが終了した場合

LauchRequestは、そのSkillがどのようなものかをガイドをして応答待ちします。

また標準ビルトインインテントはキャンセル、ヘルプ、ストップインテントの三種類があります。

スキルビルダーで入力したものは上から順にチェックされます。

Alexaの発話の中にrepromptを入れていると、Alexaが話し、応答があるまで8秒待ち、もう一度言ったあと、8秒待ちます。そのまま、何も応答がなければskill終了します。stopの時は聞き返す必要がないので、repromptを入れないようにしましょう。

スロットを使ってみる

続いて、スロットを使ってみましょう。今回はコーヒーの数を聞くようにスロットを使いました。

取得コードはJSONのまま。Lambdaでvar amountを追加し、ユーザーの発話にamountを入ってるか、入ってないかをif elseで変更します。

Skillテストを文字で打つ際はスロットの前後は半角スペースを必ず入れます。また、数字は漢数字で行わないと反応されません。

1回目のテストでは、amountがamaountになっていたためエラーが出たので、修正するとテストがうまくいきました。

次はコーヒーのメニューも選べるようにしてみようということで、スキルビルダーの方で{menu}のスロットを追加し、カスタムスロットタイプを設定します。

Lambdaでvar menuを追加します。

テストをしてみると、{menu}のスロット内に入れられてないものでも反応してしまいました。

NO matchのは弾くようにしたい。そこで、ワンショットではなくマルチターンスキルにします。

より会話らしいものにするために

ワンショット:何かをいって何かを返して終わり

マルチターン:より会話のもの

マルチターンスキルということで、コーヒーを聞いて、さらにお砂糖の有無を聞きます。より会話らしくなりますよね。

一度他のことをユーザーが発話すると、前に行った個数を忘れてしまうので、セッションアトリビュートにコーヒーの値を格納します。

オーダーインテントが来た時にセッションアトリビュートに貯めておき、yesの時にamountの時に答えた個数を取り出します。

handle(handlerInput)のところで、アトリビュートからとってこいという指示出しをします。

スキルが一度終了するとアトリビュートは消えてしまうので、聞き直す必要があります。

最後までギリギリクリアできませんでした…

ハンズオンがおわり、その後審査の際に気をつけなければならないことを解説していただきました。

14時から18時のハンズオンということで少し長丁場でしたが、いって本当によかったです。よりskillに対する納得が深まりました。また、きちんと逃げずにLambdaを使ってSkill開発がしたくなりました。どのようなSkillを作ろうか、またネタを探していきたいと思います。

また、なかなか東京に行く機会がないので、大阪でも中級のハンズオンをしていただけたら嬉しいな…と思います。笑

読んでいただきありがとうございました!また次の記事でお会いしましょう!!