みなさんはプログラミングの経験はございますでしょうか。
私の仕事の一つであるプログラム開発はかなり敷居が高いものという一般的な共通認識があるようです。
しかし、いろんな仕事がある中で、プログラミング”だけ”が難しいわけではないと思うんです。

あなたが今の仕事を始める時、最初に教わったことは特別に難しかったでしょうか。
何事も入りが大事で、
きっとプログラムを書くことも同じく
どのような始まり方をするかで変わるのではないでしょうか。

さて、かなり回りくどい始まりでしたが、
実際何事も始めてみれば意外といけるんじゃない?ってことが言いたいわけです。

ということで、
私も初めて触るAlexaアプリの開発行ってみましょー!

はじめに

まず、Alexaアプリを開発するためにはAmazonの開発者アカウントを取得しなければなりません。
他のECサイト(Amazonのような買い物をするサイト)のように、ぱぱぱっと作ってみましょう。

1.Webブラウザでhttps://developer.amazon.com/jaにアクセスします。

2.下記画像の赤マルの「ログイン」をクリックします。(初めての方もログインで問題ありません)

3.ログイン画面からAlexaを使用しているアカウントでログインします。(この際新規アカウントは作成しないでください)

4.開発者アカウントの登録画面が表示されるので入力します。

5.Amazon developer Services Agreementのチェックをクリックし同意します。

6.送信ボタンをクリックします。

7.「Amazon開発者ポータルへようこそ」の画面が開くので、「コンソールの開始」をクリックします。

8.下記ページが表示されれば、アカウントの設定は完了です。

新規スキルを作ってみましょう

これで晴れてあなたは開発者となりました。
しかしまだ何も開発していません。
ここまで来ればあとは好きに遊べるので、新しいスキルを作成してみましょう。

1.先ほどのセクションで開いた開発者コンソールの画面から「Alexa Skills Kit」をクリックします。

2.下記ページが表示されますので、右上の「スキルの作成」をクリックします。

3.下記ページが表示されたら、適当にスキル名を入力します。
 今回は私の地元のゴミ出しの予定をAlexaに教えてもらうスキルを作る予定なので、下記を入力します。

 スキル名:ゴミ出し
 プライマリロケール:日本語

 入力が完了したら、「次へ」をクリックします。

4.下記ページが表示されたら、エクスペリエンス、モデル、ホスティングサービスを選択します。
 1.エクスペリエンス:その他を入力します。
 2.モデル:カスタムを選択します。
 3.ホスティングサービス:Alexa-hosted(Node.js)を選択します。
 4.ホスト地域:米国東部(バージニア北部)を選択します。
 5.「次へ」をクリックします。

5.下記ページが表示されたら、テンプレートを選択します。
 今回は簡単な機能を試しに作成するので、スクラッチを選択します。
 「次へ」をクリックします。

6.下記ページが表示されたら、内容を確認し相違なければ「スキルを作成する」をクリックします。

7.スキル作成には1分ほどかかりますので待ちます。お茶を入れてきましょう。

呼び出しを設定しよう

Alexaからスキルを起動させるための呼び出しフレーズを設定します。
ページ左部の呼び出し→スキルの呼び出し名をクリックします。

呼び出し設定画面が表示されたら、「スキルの呼び出し名」の入力部に好きなフレーズを入力します。
ここではスキル名の「ゴミ出し」を設定しました。

ページ上部にある「保存」ボタンをクリックし、呼び出しを保存し、「スキルをビルド」ボタンをクリックします。

インテントを設定しよう

スキルが一旦作成できれば、次はインテントを作成しましょう。

インテントとは、起動したAlexaアプリで処理をさせるためのフレーズとなります。
ここではインテントを設定して、スキルを始めます。

ページ左部の対話モデル→インテントをクリックします。

インテント一覧画面が開くので、HelloWorldIntentの「編集」をクリックします。

HelloWorldのインテントには最初から「hello」「ハロー」「こんにちは」が登録されていますが、
どれも今回のスキル呼び出しにはイマイチの単語なので新しく設定してみましょう。
「サンプル発話」の下にある入力ボックスから「今日のゴミ出し」と入力し、「+」をクリックします。
入力部の下に先ほどの3単語と今回追加した「ゴミ出し」が表示されると思います。
「今日のゴミ出し」以外は使用しないので、それぞれの単語の横にあるゴミ箱マークをクリックし削除してください。

続いて「今日」と言う言葉に対して、スロットと言うものを設定します。
これにより、「今日」や「明日」など、日付に関するワードを自動的に日付に
変換してプログラムに伝えてくれる設定が可能です。

ページ下部にある「インテントスロット」から日付に関するスロットを登録します。
今回は「day」と言う名前で登録します。※任意なものを設定できますが、英字でわかりやすい名前に設定しましょう。
スロットタイプを「AMAZON .DATE」に設定します。

続いて、先ほど「サンプル発話」で登録した「今日のゴミ出し」の”今日”の部分をスロットに設定します。

スロットを使用する場合は、{}で設定したスロットを囲んでください。
これで「今日」や「明日」などのワードでも反応できるようになりました。
ついでなので、話しやすい別の単語も登録してみてください。

ページ上部にある「保存」ボタンをクリックし、インテントを保存し、「スキルをビルド」ボタンをクリックします。

ビルドを開始すると、スキルに保存したインテントが反映されるので、必ずビルドを行ってください。

スキルをテストしてみましょう

ここで一度スキルをテストしてみましょう。
テストのやり方はページ上部の「テスト」タブから行います。「テスト」をクリックしてください。

下記のようなメッセージが出ている場合は、テストが無効になっているため
「非公開」から「開発中」に変更します。

シミュレータが起動したら、先ほど設定したAlexaアプリの呼び出しのフレーズを使ってAlexaに話しかけてみましょう。
マイクを使って喋る場合は入力部右側のマイクボタンを押しながらマイクに向かって喋ってくだい。
キーボードを使って同じ内容を入力することもできます。

何やら英語でAlexaが応答しました。
「Welcome, you can say Hello or Help. Which would you like to try?」
こちらの応答文は後述するプログラムで設定されているものとなります。
今は一旦気にせず、次へ進みます。
今度はインテントで設定した、「今日のゴミ出し」を試してみましょう。

今度は「Hello World」と返答がありました。

ここで一旦スキルが動作していることはわかったので、テストを終了します。
次は実際に起動した時とインテントを起動した時の動きをプログラムを見ながら確認してみましょう。

プログラムを書きましょう

ここまで来れば動くスキルはできていますが、肝心な中身は空っぽです。
先ほどテストしてきて帰ってきた応答などを元にプログラムを確認していきます。
まずはプログラムの中を確認してみましょう。

ページ上部にあるコードエディタをクリックします。

「コードエディタ」を起動すると、初めてプログラムを見る人にとってはとてもゾッとする画面が表示されます。

しかしここまで順調にやってこれた方なら全く問題ありません。
少し粒度を上げて中身を確認してみましょう。

今回のAlexaスキルはnode.js(JavaScript)と言うプログラミング言語を使って開発を行います。
以下のプログラム内で不明なことがあれば「js 〇〇」や「JavaScript 〇〇」のような検索をすれば
詳しく情報が得られると思いますので、ぜひ調べてみてください!

何やら色々細かいことが書かれていますが、一つ一つを見ていけば紐解くことができます。
まずは8行目〜20行目までの中身を確認します。

const から始まるプログラムがあり、20行目の};までが一つのプログラム(関数)です。
今回はプログラムの意味までは深く掘りませんが、
Alexaのアプリは1つの動作に対してこういうプログラムの書き方をしてるんだなーと思っておいてください。

中身を見てみます。

8行目:const LaunchRequestHandler = {

とありますが、「LaunchRequestHandler」がこの処理の名前となります。
日本語にすると、起動をリクエストする人みたいなニュアンスです。
つまりは起動した時に何かするプログラムなんだなーと思ってください。
ただし、ここの名前は任意なので、絶対この名前にしないといけないわけではないので参考までに。

そして適当に読み飛ばして・・・

13行目には何やら英語の文章が書いてあります。

const speakOutput = 'Welcome, you can say Hello or Help. Which would you like to try?';

おっと、これは・・・
先ほどテストして返ってきた単語を思い返してみてください。

「Welcome, you can say Hello or Help. Which would you like to try?」
なるほど、ここで起動して返ってくる文章を設定していたんですね。
プログラムの意味を少しだけ説明すると、
speakOutputというところに文章を設定しています。
このspeakOutputが「変数」と言い、プログラムというものはこの変数を使って色々やってます。

というわけでこのプログラムは「起動した時に設定した文章を返す」ということをやっていたということですね。

では一旦英語のままでよくわからない文章なので日本語でそれっぽいものを設定してみましょう。
先ほどのspeakOutputに「ゴミ出しアプリを起動しました。」と入力し、
ページ上部の「保存」をクリック後、「デプロイ」をクリックします。

それではもう一度テストを実行してみましょう。

ちゃんと反映されていますね!

では続いて、インテントで設定した単語を利用したプログラムも見ていきましょう。

「今日のゴミ出し」を設定したインテント名を確認しましょう。

「HelloWorldIntent」と書いてあります。
こいつを使っているプログラムはどこにあるでしょう。

25行目:&& Alexa.getIntentName(handlerInput.requestEnvelope) === ‘HelloWorldIntent’;

ありました。
どうやらここで使われているようです。
ここで先ほどテストで「今日のゴミ出し」をAlexaに問いかけた時に返ってきたワード
「Hello World!」が返ってくる処理があります。

ただし、今回は「今日のゴミ出し」を実行した時に得たい回答としては「Hello World!」ではなく、
「本日の指定のゴミは何か」が確認したいのでこの処理では足りないようです。
「本日の指定のゴミは何か」をAlexaに教えてもらう方法はいくつかあるのですが、
一番簡単な方法を考えてみましょう。

私の地元の一週間のゴミのスケジュールは下記です。
月曜日:燃えるゴミ
火曜日:粗大ゴミ
水曜日:古紙古布(第2週目)、ペットボトル(第1、3週目)、小型ゴミ(第4週目)
木曜日:燃えるゴミ
金曜日:プラスチック
土曜日と日曜日:なし

まず、今日が何曜日かを判断してそれに対応するゴミ種別をAlexaに教えてもらえる機構にするのが簡単そうですね!
となればそれをプログラムに書き込んでいきましょう。

必要な変数を用意しましょう、必要な変数は下記です。
個人的に必要な機構も入れたいので、少し多く変数を用意しています。

・speakInput:インテントで設定したスロットの値を取得するために使用します。
・dt:speakInputで取得した日付を日付データに変換するために使用します。
・today:現在日時を取得します。(私が個人的に使用するための変数なのでなくても良いです)
・hour:todayから今の時間を取得するために使用します。
・dateT:曜日を数値から日本語に変換するためのテーブルです。
・day:入力された日付の曜日を取得(0〜6)するために使用します。
・dayOfWeek:入力されたの曜日(日本語)を取得するために使用します。
・weekNumber:入力された日付が第何週目かの数値を計算するために使用します。
・speakOutput:アレクサに返す言葉を設定するために使用します。

変数の前のconstやletは変数の種類になります。
 constは値が変わることのない固定値
 letは値の中身が変わる可変値
くらいに思えておいてください。
今回のプログラムで例を挙げると、
speakInputの中身はコロコロ変わってもらうと困るのでconst
speakOutputの中身は曜日によって中身を変えたいのでlet
みたいな感じです。

それでは、インテント「ゴミ出し」を起動したときに開始するプログラムを修正します。

それぞれ追加した部分にコメントを追記していますが、詳しく気になる方は調べてみましょう。
speakInputにはhandlerInput.requestEnvelope.request.intent.slots.day.valueを入れていますが、
dayの部分が先ほどインテントのスロットで設定した値{day}が入力されます。
ここには「今日」や「明日」と言う日付に対応するキーワードが日付に変換され入力されます。
「今日のゴミ出し」と入力すれば、「2023-12-1」と言う情報としてspeakInputに入ります。
ただ、こちらの日付の形がJavaScriptでは若干扱いが面倒なので、
変数「dt」に扱いやすい形に変換し直しています。

これでそれぞれ設定した変数には欲しい情報が入っている状態です。
必要な情報は揃ったので、続いて曜日ごとの処理を追記していきましょう。

switch文と言う条件を満たした場合にそれぞれ異なった処理を行う処理を追加しています。
今回はdayOfWeekに入っている値に対して、それぞれの出力を変化させているプログラムになります。
dayOfWeekには月〜日までの曜日が入っているので、
それぞれの曜日に対応する出力(speakOutput)を設定しています。

これでプログラムの修正は完了です。
プログラムの詳しい説明はピンク文字で書かれている単語を検索して調べてみてください。

さあ、デプロイを行なってプログラムを動かしてみましょう。

動作テスト

テストからゴミ出しスキルを起動します。
対応するワードでスキルを起動してください。

以上で動作確認することができました。

まとめ

いかがでしたでしょうか。
意外と簡単にAlexaスキルを開発することができたのではないでしょうか。
今回はなるべく特殊なことはせずプログラムを作成しました。
こういう機能が欲しいだったりこれがたりないな、はあると思いますので、
ぜひ自分だけのスキルを作成してみて、さらには全世界のユーザに発信していけるといいですね!

当記事に対する質問等ありましたらコメント頂けますと幸いです。
対応できる範囲はありますが・・・・
また、当方もAlexaスキル開発に関しては初心者の域を出ない若輩者です。
今回の記事の内容に相違点などあればそちらもコメントいただければと思います。

また、この記事は2023/12/10前後に作成しておりますので、
ページレイアウトの違いや使用できるプログラムに相違があるかもしれませんので悪しからず。