ブロックチェーン・AI・システム開発の株式会社INDETAIL

Alexaスキル開発始めました【動画あり】

2018.12.08
tacck

※本記事は、INDETAIL Advent Calendar 2018の一環として投稿しています。

この記事は、INDETAIL Advent Calendar 2018の8日目の記事です。

こんにちは、tacckです。
今回のテーマは「Alexaスキル」です。

巷では、スマートスピーカーもだいぶ市民権を得てきたかと思います。
みなさまのご家庭にも、一台はあるのではないでしょうか。(私は四台持っています。)

ここ数ヶ月ですが、弊社内でもAlexaスキル開発にチャレンジしているので、今回のブログでは基本的な作成手順を解説してみたいと思います。

そもそもなぜチャレンジしているのか?

弊社では、新たな技術へのチャレンジを行なっています。
(注目を集めているBlockchainも、その一つです。)

その中の一環で、現在私の所属する部署でのチャレンジとして「Alexaスキル」の開発を始めました。
個人的にも興味があったので、日々楽しく開発を行なっています。

Alexaとは

Amazon社 (Amazon.com, Inc.) の販売する「Amazon Echo」およびそのシリーズ上で動作する対話インタフェースです。
Alexa | アレクサ| Amazon開発者ポータル

iOSやAndroidにAmazon Echoの設定アプリ(Alexaアプリ)があり、こちらで色々と設定を行ないます。
また、このアプリ自体にもAlexaが搭載されているので、Amazon Echoを持っていなくても、Alexaを体験可能です。

Alexaスキルとは

Alexaの機能を形作るためのアプリケーションのことです。
Amazon Alexaで音声サービスを開発しよう | Alexa Skills Kit | アレクサ

大きくは、

  • Amazon社が作成する基本機能
  • サードパーティによる追加機能

があると思ってください。

Amazon社が作成する基本機能は常にアップデートされており、気がつくと新しい言葉に答えてくれるようになっていたりします。

サードパーティによる追加機能は、PCやスマホにアプリをインストールするように、Echoデバイスで「スキルを有効にする」ことで、新たな機能を利用することが可能になっていきます。
ここで解説するAlexaスキルの開発手順は、後者の「サードパーティによる追加機能」の開発手順になります。

Alexaスキル開発手順

まずざっくり仕組みの理解から

仕組みを理解するために、簡単な流れを確認していきましょう。

デバイスで音声を受付

まずは、Echoデバイスに向かって「Alexa」と呼びかけます。
この時にEchoデバイスがきちんと「Alexa」という音声を理解し、その後の発話を受け付けるモードに遷移します。

この時の「Alexa」という単語を「ウェイクワード」と呼んだりします。

スキルの起動

続けてEchoデバイスに向かって「[スキル名]を起動」のような形で話しかけます。
例えば、「豆しばを開いて」と呼びかけると、「豆しばスキル」を起動します。
(最近ハマってます。)

この時、呼びかけた言葉はAmazonのサービス側(クラウド上のAlexaサービス)に送信されます。
Alexaサービスが音声を認識し、[スキル名]に該当するスキルがあって、Echoデバイスで有効になっていれば、そのスキルのバックエンドを起動することになります。

その後対話内の質問への回答を行なうようなこともありますが、すべて音声はAlexaサービス内で処理され、バックエンドは必要な情報をテキストで受け取る形になります。

スキルからの返答

バックエンドは、基本的にAWS Lambdaを使うことになります。
現在はNode.js、Java、PythonのSDKが公開されています。

Node.jsでの例が本家のページ内にも多く、実装例なども検索しやすいと思うので、特にこだわりが無いのであればNode.jsを使うことをお勧めします。
私もNode.jsで開発しています。
(この記事にも、Node.jsでのスキル例を載せています。)

バックエンド呼び出しの構造

バックエンドを呼び出す時の、大まかなイメージも説明しておきます。

上記の通り、EchoデバイスからAlexaサービスへ音声が送られ、そこでテキスト化されてバックエンドへ情報が渡ってきます。
この時、バックエンドには「どういう会話パターン(インテント)」で「どういうキーワード(スロット)」の発話だったか、という情報がきます。
そのためバックエンドでは、「このインテントでこのスロットが来たら、このように返答する」というような実装を行なうことになります。

開発ステップ0: アカウント取得

では、スキルの開発を始めましょう。

まずは、スキルを登録するために Amazon開発者アカウント が必要です。
また、バックエンドのプログラムを登録するために AWSアカウント も準備しておいてください。
(今回は、 AWSアカウント の準備は割愛させてもらいます。)

Amazon開発者ポータル

まずは、上記の Amazon開発者ポータル にアクセスします。
アクセスしたら右上の「サインイン」をクリックします。

もし、みなさんがECサイトのAmazon.co.jpのアカウントをお持ちであれば、そちらのアカウントを使ったサインインが可能です。
お持ちでない場合には、アカウントを作成しましょう。

サインインの画面に「Amazon Dveloperアカウントを作成」ボタンがあるので、こちらをクリックします。

すると、アカウント作成画面に遷移するので、流れに従って情報を入力していきます。

さらに詳細な情報を入力していきます。特につまるところは無いかと思います。

完了したら、次のような画面に遷移します。
「Alexa」の中の「Alexa Skills Kit」をクリックしましょう。

すると、 Alexa Developer Console のスキルの登録画面に遷移します。

ここまでで、開発前の準備は完了です。

開発ステップ1: 基本的な設計

では、開発するスキルをどんなものにするか決めましょう。
今回は、最低限の要件として、下記の流れを満たすものにします。

  • 呼び出し
  • スロットを含む対話 (1パターン)
  • 回答

この流れを作るために、「クリスマス」と「お正月」まで後何日かを教えてくれるスキルにしてみましょう。

開発ステップ2: スキル登録

では、まず「呼び出し名」を決めましょう。
今回は、少しだけカウントダウンをするので、「少しだけカウントダウン」としましょう。

まずは、 Alexa Developer Console から、スキルを作成します。
「スキルの作成」をクリックして、スキル登録画面に遷移しましょう。

スキル名も「少しだけカウントダウン」として、右上の「スキルを作成」をクリックしましょう。
うまくスキルを作成できると、スキルの開発画面に遷移します。

続いて「呼び出し名」を登録しましょう。予定通りに「少しだけカウントダウン」とします。

ページの上の方にある「モデルを保存」を、クリックしておきましょう。

次に、スロットを設定します。
今回のスキルの中でスロットにあたるのは「クリスマス」と「お正月」ですね。
スロットタイプの追加を選び、「EventNameSlot」を作成します。

スロットを作成したら、スロットの中に入る言葉を登録します。これによって、認識率があがります。
図のように、「クリスマス」と「お正月」を登録します。

ここでも、ページの上の方にある「モデルを保存」を、クリックしておきましょう。

最後にインテントです。
今回作成するパターンは1つだけなので、インテントも1つだけ作成します。
日数を数えるので、「HowManyDaysIntent」という名前にしましょう。

インテントの追加を選び、「HowManyDaysIntent」を作成します。

サンプル発話として、いくつか登録してみましょう。
これ以外にもいろんなパターンを登録しておくと、自然な発話ができるようになってきます。

ここでも、ページの上の方にある「モデルを保存」を、クリックします。
保存ができたら、その右側にある「モデルをビルド」をクリックします。
こちらは時間がかかるので、気にせずにそのまま次の操作に進みましょう。

最後にエンドポイントのページを表示して、「AWS LambdaのARN」を選択します。
すると、「スキルID」が表示された状態になるので、一旦このままにします。

開発ステップ3: バックエンド開発

バックエンド用のコード作成

次に、バックエンドの開発です。
AWS Lambdaで実行するための関数を作成していきます。

まず、AWS LambdaのWebコンソールで、関数を追加しましょう。
今回は「MyCountDown」としておきます。
この時に、ランタイムは Node.js 8.10 を選びます。

入力できたら「関数の作成」をクリックしましょう。

Lambdaで実行するためにAlexaスキル用のSDKを一緒にアップロードする必要があるので、一度ローカルで環境を整える必要があります。
また、上記で選んだランタイムが Node.js 8.10 なので、ローカルでもそのバージョンに合わせておきます。
合わせ方はは色々ありますが、私は nodenv を使っています。
この辺りの詳細は、今回は割愛させていただきます。

では、スキルを実行するバックエンドのプログラムを作ってみましょう。
下記の内容を index.js として保存してください。

ざっくりとコードの説明をします。

  • 7-19行目: Alexaサービスから呼び出された時の、最初の窓口になります。ここで、どういうインテント用の処理を使うか、などを定義しています。
  • 21-35行目: これは、(スロット無しで)最初に起動された時に使われるハンドラーです。スキルの説明を返して、次のユーザーの発話を促します。
  • 37-77行目: ここが今回のスキルのメイン処理となります。イベント名をスロットとして受け取り、その内容によって残りの日数を計算して返すようにしています。
  • 79-91行目: スキル内でエラーが発生した場合や、実装していないインテントを受け取った場合に、このエラー用の返答を返します。

AWS Lambdaへアップロード

では、このコードをLambdaへアップロードしましょう。
index.js とSDKを含めたものをZIPで圧縮し、Webのコンソールを使ってアップロードすることができます。

ただ、本格的に開発をしているときに、毎回ブラウザ経由でアップロードするのは手間なので、私は aws-cli を使ってアップロードしています。
下記の内容で deploy_zip.sh を作成しておき、アップロードする時に実行しています。
(aws-cli のセットアップについても、今回の記事では割愛させていただきます。)

内容は、ZIPを作成し、一旦S3へアップロードし、S3経由でLambdaに反映する、という流れです。
ブラウザ経由でアップロードする場合は、6行目までの内容だけを実行して、出来上がったZIPファイルを使えば問題無いです。

このスクリプトを実行すると、下記のような結果になります。

実行後に、Lambdaのページを再読み込みなどして、自分の作成した index.js が反映されていればアップロード完了です。

スキルとLambdaの連携

最後に、AlexaスキルとLambda関数の結びつけを行ないます。

先ほど開いていた、 Alexa Developer Console  のエンドポイントのページに戻りましょう。
ここに「スキルID」があるので、これをクリップボードにコピーします。

できたら、Lambdaのページを開き、「トリガーの追加」の中の「Alexa Skills Kit」をクリックします。
そのまま、ページを下へスクロールしテキストボックスにコピーしていた「スキルID」をペーストします。
できたら、右下の「追加」をクリックし、続けて右上の「保存」をクリックします。

保存できたら、ページを再度上へスクロースします。
Lambdaの「ARN」が表示されているので、これをコピーします。
(小文字の arn: で始まる部分です。)

コピーできたら、再度 Alexa Developer Console のエンドポイントのページに戻ります。
今度は「デフォルトの地域」のテキストボックス内に、今コピーした値をペーストします。
ペーストできたら、ページの上にある「エンドポイントを保存」をクリックしましょう。

開発ステップ4: 試してみる

これで、一通りの準備が整いました。
では、実際にスキルを試してみましょう!

まずは、 Alexa Developer Console の「テスト」タブで試してみましょう。
「テスト」タブをクリックし、テストを有効にします。

できたら、テキストボックスに「少しだけカウントダウンをスタート」と入力します。
スキルの説明を応答として返してくれるので、引き続き「クリスマスまで後何日」のように入力します。
うまくいけば、きちんと残り日数を返してくれるはずです。

ここまでできれば、あとは実機で試すだけです。
実際に試した動画を載せておきますので、みなさんも是非ご自分のEchoデバイスで試してみてください!

(2018年11月29日撮影)

開発する上での注意事項

開発のやり方は常に新しくなっているので、日々情報を追っていく必要があります。
今年に入ってSDKバージョンアップによる記述方法の変化もありましたし、直近ではAPL(Alexa Presentation Language)というのも発表されました。

「声」を使ったUIなので、なかなかそのようなUI設計をする機会の無い人が多いと思います。(私も今回が初めてです。)
Alexaと「まるで人と話しているような対話」を目指すためには、現時点ではかなり工夫が必要になります。
まず呼び出す時点で、呼び出し名を工夫したり、サンプル発話をできるだけ充実させて多くのパターンに対応したり、といったかなり地道な努力が必要です。
もちろん、答えのバリエーションを出すためには、それだけのデータを用意する必要もあります。

マネタイズに関連するところも、現時点では確立されたとは言い難いところですね。
つい先日、Amazon Payを使ったスキルをリリースできるようになったようなので、これからどういうスキルが出来上がっていくか、というところです。

Alexaスキル向けAmazon Payで収益につなげよう(日本で利用できるようになりました)
(2018/12/02 発表)

別の切り口としては、イベント・キャンペーンの入り口の一つとして専用スキルを作成する、といったこともできるかなと思います。
(このあたりは、お気軽に弊社にご相談いただければ、何がしかのご協力はできるかと思います。)

まとめ

上で色々書きましたが、まず純粋に楽しいです!
自分の手を動かした結果を得やすいので、初学者こそやってみると良いのではないかな、と思います。

また、開発方法も変わっていく、新しい機能も増えていく、という、これから大きく変化していくこと、成長していくことを一緒に体験できるのも大きな魅力です。

スマートスピーカーは、これから生活に溶け込んだ形で普及していくと考えます。
まずは自分で作ってみて、その未来を先どりしてみませんか?

tacck Takuya KIHARA

エンジニア (モバイルアプリ、フロントエンド、バックエンド、インフラ) 得意なことは、領域をまたいで考え、開発すること。 ブログでは、主にAnsible、Docker、Raspberry Piのことを書いています。 好きなフィギュアスケートの技は、スプレッド・イーグルです。

「いいね」ボタンを押すと、最新情報をすぐに確認できます。