Alexa!スキル開発のやり方を教えて!①


4月に新卒入社しました、村上です。

私は入社前にアルバイトとして業務に携わっていたのですが、
そのアルバイト時代に「Alexaスキル」の開発を行いました。

そこで今回はその開発について振り返り、
・Alexaってそもそも何?
・Alexaスキルって何?
・どうやって開発するの?
ということを、初心者向けにご紹介したいと思います!

Alexaとは?

→Amazonが提供する「音声認識サービス」のことです。

音声認識サービスが何かというと
・「OK, Google!」
・「Hey, Siri!」
みたいなやつですね。

Alexaの場合も
「Alexa!明日の天気を教えて!」
なんて話しかけるとバッチリ答えてくれます。

ただ、スマホでこれらのサービスを利用するときは当然スマホに話しかけるわけですが、
Alexaはスマホのようなデバイスの中ではなく、クラウド上にいます。

そこで、クラウド上のAlexaとお喋りするためには
「Echoデバイス」と呼ばれる専用の機器が必要になります。

このEchoデバイスがAlexaと会話するための仲立ちをしてくれます。

という訳で、Alexaとのお喋りはこんな流れになっています(参考:Alexa公式サイト)

1. ユーザーがAlexa対応デバイス(Echoデバイス)に発話
2. デバイスはマイクで集音した音声データを、インターネット経由でAlexaサービスに送信
3. Alexaサービスは音声データをAIで解析し、AWS Lambda(※)を呼び出して解析結果を伝える
4. Lambdaは解析内容に応じた処理を実行し、その結果をAlexaサービスにレスポンスとして返す
5. Alexaサービスはレスポンスに応じた音声データを生成し、デバイスに返信
6. デバイスは音声データを再生し、ユーザーに伝える
(※)解析結果を処理するコードがLambdaに置いてあります

ユーザーからはEchoデバイスとのやりとりしか見えていませんが、
その裏ではAlexaとLambdaがあれやこれやと処理してくれているわけです。ありがたい。

Alexaスキルとは?

→「開発者によってAlexaに追加された機能」のことです。

はい、よく分かりませんね。スマホアプリで例えます。

個人でも企業でも誰でも、スマホアプリを開発してApp StoreやGoogle Playに公開できます。
そしてユーザーは好きなアプリを選んで、自分のスマホにインストールできます。

Alexaもこれと同じ要領です。

個人でも企業でも誰でも、Alexaの機能を開発してAlexaサイト上に公開できます。
そしてユーザーは好きな機能を選んで、自分のEchoデバイスに適用することができます。

このように個人や企業が開発を行い、ユーザーが使えるように公開してくれた機能のことを「スキル」と呼んでいます。

この例えが皆さんの理解を助けくれたのかどうかは分かりませんが、話を進めます。

Alexaスキルを開発しよう!

というわけで、早速開発に取りかかりましょう!

開発を行うには開発者アカウントとAWSアカウントの登録が必要ですが、
そこまで説明していると日が暮れてしまうので割愛します。
登録がまだの方はGoogle先生に聞いてくださいm(_ _)m

さて、今回開発したスキルがこちらです

はい。見たことないと思います。

この「モテトーク」はもともとリンクバルが2015年にリリースしたスマホアプリで、
「飲み会や合コンの場でちょっとした会話のネタを提供してくれる」というものです。

このモテトークの「会話のネタ振り」の部分を、Alexaに喋ってもらおう!
というのが今回の開発です。
言うなれば、モテトークのAlexa版リメイクです。

前置きが長くなりましたが、ようやく開発の話をします。
Alexaを構成する主な要素は
①音声ユーザーインターフェース
②解析結果を処理するコード
の2つです。順に説明していきます。

音声ユーザーインターフェース

その名の通り、音声を使ったユーザーインターフェースです。

ユーザーからの音声入力をどのように処理するか、
特定の指示が発話されたときにどのコードを実行するか、
といったことを定義します。

これは、Amazon開発者ポータル内の「Alexa Skills Kit」から設定を行います。
開発というよりは、ツールに沿って設定をポチポチすれば終わります。

まず、開発者ポータルから「Alexa Skills Kit」に入りましょう。
ここでは、音声ユーザーインタフェースの構築に必要なものを全て用意してくれています。

「スキルの作成」をクリック

スキル名と言語の設定

作成するスキルの名前と、対応する言語を決めましょう。

モデルの選択

「カスタム」を選びましょう。
「フラッシュブリーフィング」はニュースの読み上げ、
「スマートホーム」は家電の操作で使うモデルです。

そうするとこんな画面に来るはずです。

細かいことを考えずに、右側の「必須」の項目を全部設定すればとりあえず動きます。
細かいことを考えずに作ってみましょう。

1.呼び出し名
「名前はさっき設定したじゃん」と思ったかもしれませんが、
先ほど設定した「スキル名」は、Alexaのサイト上で公開される名前です。
それに対し、「呼び出し名」は実際にEchoデバイスに話しかける時に使う名前です。

「スキル名」=氏名
「呼び出し名」=あだ名
みたいなものだと思ってください。

「スキル名」でちゃんとした名前をつけてあげますが、
呼ぶときはあだ名で読んであげます。フレンドリーですね。

ちなみに、モテトークはスキル名も呼び出し名も「モテトーク」です。
フレンドリーさを生贄にして分かりやすさを選びました。

2.インテント、サンプル、スロット
Alexaとの実際の会話の様子をデザインするフェーズです。
ちょっと分かりにくい部分ですが、下の図を使いながら説明してみます↓

これは、ユーザーがアレクサに話しかける時の最も一般的な形です。
「天気予報スキル」で説明するので、モテトークのことは一旦忘れてください。

①ウェイクワードで端末を起動する
「アレクサ!」と呼びかけることで、まずはEchoデバイスを叩き起こします。
ウェイクワードはデフォルトで決まっているので、設定不要です。

②「呼び出し名」でスキルを指示する
起こされただけではAlexaだって何をすればいいのか分かりません。
どのスキルを使いたいのかはきちんと教えてあげましょう。

③サンプル発話でインテントを伝える
ここはちょっと詳しく説明します。

さて、ここで天気予報スキルが呼び出されているわけですが、
天気予報にもいろいろあるわけです。
天気、気温、湿度、降水確率、風の強さ、波の高さ、などなど、、、、

このように、あるスキルを呼び出した上で、
さらに具体的に「何をして欲しいのか」を要求します。

この「ユーザーがして欲しいこと」を「インテント」と呼びます。
例えば気温を知りたい場合、「TemperatureIntent」を設定しましょう。

しかし、「アレクサ、天気予報でTemperatureIntentを呼び出して!」
なんてことを言ってしまうと、会話として不自然です。
あくまでも自然な会話を作りたいです。

そのため、Alexaにインテントを伝えるための発話内容を設定します。
これが「サンプル発話」です。

これで自然な会話ができるようになります。
インテントとサンプル発話が結びついているため、
自然な会話の中でインテントを伝えることができます。
また、ユーザーの発話がこのサンプル発話と完全に同じでなくても、
ある程度一致していればAlexaはインテントを特定してくれます。賢い。

④スロットを渡す
天気予報とは言っても、
今日ではなく明日のことを知りたいかもしれません。
今は東京にいても、数時間後には埼玉にいるかもしれません。

このように「日付」や「場所」は可変なものとして扱いたいですね。
この可変部分を「スロット」と呼びます。
スロットが必要な場合はこちらも設定しましょう。
スロットタイプに適切なものがなければ、空白のままでも大丈夫です

以上のようにして、

①端末を起動する
②スキルを呼び出す
③サンプル発話でインテントを伝える
④必要であればスロットで追加情報を渡す

という会話の様子を構築するのがこのフェーズの目的でした。

3.モデルをビルド
ここまでの入力が正常に完了していればビルドできます。
失敗する場合は、エラーメッセージに従って該当箇所を修正しましょう。

4.エンドポイント
発話を処理するコードの置き場所を決めます。

Alexaはユーザーの発話を解析した後、json形式に変換します。
そのため、「jsonで受け取ってjsonで返す」
という処理を実行できるのであれば、コードの置き場所はどこでも構いません。
自分でウェブサービスを作ってもOKです。

ですが、Alexaとの連携を考えるとLambdaに置くのが一般的です。(そして楽です)
モテトークもPythonで処理を書いてLambdaに置いてあります。

というわけで、エンドポイントを設定するには、
先にAWS Lambdaで関数を作成する必要があります。

ここから先はまた次回お話させていただきます。

 

あなたも一緒に働きませんか?

リンクバルでは、エンジニアを募集しています。

・技術によって日本をよくしていきたい
・人と人との出会いを生み出していきたい
・モテトークでモテモテになりたい
そんな方はまずはこちらをご覧ください。