Alexaで明日のゴミ日を確認するスキルを作ってみた
システム開発部の渡邉です。
今回は会社からもらったAlexaでスキルを自作したので、そのことについて書きます。
Alexaを使うのは初めてでしたが、使ってみるとなんとも便利で可愛い。
簡単なアクションは実行条件を指定して追加できますが、難しいものに関しては一般的にスキルをダウンロードして使います。
私はゴミの日が分かるスキルが欲しいと思い探してみたのですが、既存のものは設定の変更が出来なかったり、当日のゴミの日しか確認できなかったりと何かと不便だったため個人用に作ってしまうことにしました。
スキルの仕様について
収集曜日は以下をサンプルとして作っていきたいと思います。
ゴミの種類 | 曜日 |
|---|---|
家庭ごみ | 火曜・金曜 |
プラごみ | 木曜 |
缶・びん | 火曜 |
紙類 | 第1・3木曜 |
今回は簡単に「ゴミの日を教えて」と話しかけると次の日が何のゴミの日かを答えてくれるというスキルを作っていきます。
例えば今日が月曜日の場合は「明日は家庭ゴミです」という回答となります。
amazon developerに登録する
初めにamazon developerへの登録を行います。
以下のURLからamazon developerにアクセスし右上の開発者コンソールから入ります。
https://developer.amazon.com/ja

ここで注意が必要なのが、“Amazon developerアカウントを作成”というボタンがありますが今回はここから登録は行いません。
以下の赤枠に記載の通りここから作成するとUSのアカウントが作成されてしまいます。
この画面は普段ショッピングやAWSで利用している、自身の既存のamazonアカウントでログインを行います。

初めてAmazon developerを利用する場合以下の通りAmazon開発者ポータルへの登録画面が表示されます。
ここで必要な情報を入力し送信ボタンで進みましょう。

以下の画面が出れば登録完了です。
コンソールの利用を開始で進みます。

スキルの作成
開発者コンソールに入ったら今Alexa Skils Kitに入っていきます。

スキルの作成をクリックします。

続いてスキルの情報を入力します。
今回は以下の情報で進めています。

内容が問題なければCreate Skillをクリックします。
1分程待てばスキルは作成完了です。
インテントを設定する
左のメニューの対話モデルからインテントに入り、HelloWorldIntentの編集に入ります。

サンプル発話として「hello」「ハロー」「こんにちは」が登録されていますが、削除してとりあえず今回は「ゴミの日」を追加しましょう。
インデント名も分かりやすくHelloWorldIntentからCheckIntentに修正しておきます。

設定が完了したら画面上部の 「モデルを保存」をクリック保存後、「モデルをビルド」をクリック します。
コードを書いていく
上部のメニューからコードエディタへ移動します。
今回はJavaScriptで書いて行きます。
①関数名の変更
初めに先ほどインデント名を修正したので同様にindex.jsファイルの”HelloWorld”になっている箇所を”Check”に書き換えておきましょう。

②Day.jsをインポートする
今回は日付を扱うためpackage.jsonからDay.jsをインポートします。
"dependencies": {
"ask-sdk-core": "^2.7.0",
"ask-sdk-model": "^1.19.0",
"aws-sdk": "^2.326.0",
"dayjs": "^v1.11.7"
}
インポートしたらindex.jsの上部でDay.jsを読み込みます。
const Alexa = require('ask-sdk-core');
// ここからDay.jsの読み込み
const dayjs = require('dayjs');
const utc = require('dayjs/plugin/utc');
const timezone = require('dayjs/plugin/timezone');
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.tz.setDefault('Asia/Tokyo');
③呼び出された時のメッセージを変更する
スキルが呼び出された時のメッセージを変更しておきます。
LaunchRequestHandlerでspeakOutputの文言を変更します。
const LaunchRequestHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';
},
handle(handlerInput) {
const speakOutput = 'ゴミの日チェッカーを起動しました。'; // スキルが呼び出された際の応答
return handlerInput.responseBuilder
.speak(speakOutput)
.reprompt(speakOutput)
.getResponse();
}
};
④必要な変数を用意する
ここから実際のスキルの内容を記述して行きます。
コードはCheckIntentHandlerの中に書いて行きます。
今回は以下の変数を用意したいと思います。
tomorrow:明日の年月日
day:tomorrowの日付
dayOfWeek:tomorrowの曜日
weekNumber:dayOfWeekが第何回目の曜日か
曜日が第何回目かの算出にはMath.cellを使っています。
const CheckIntentHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'CheckIntent';
},
handle(handlerInput) {
const tomorrow = dayjs().add(1, 'day').tz(); // 例)明日が5月20日だった場合
const day = tomorrow.format('D'); // 20
const dayOfWeek = tomorrow.format('ddd'); // Sat
const weekNumber = Math.cell(day / 7); // 3 (※第3土曜日)
const speakOutput = 'Hello World!';
return handlerInput.responseBuilder
.speak(speakOutput)
//.reprompt('add a reprompt if you want to keep the session open for the user to respond')
.getResponse();
}
};
⑤曜日で分岐させる
必要な変数が揃えばあとは簡単です。
当初のスケジュールに沿ってspeakOutputの内容を分岐させて書き換えます。
let speakOutput = '';
switch (dayOfWeek) {
case 'Tue':
speakOutput = '明日は家庭ごみと、缶・ビンの日です。';
break;
case 'Thu':
if (weekNumber === 1 || weekNumber === 3) {
speakOutput = '明日は紙類とプラゴミの日です。';
} else {
speakOutput = '明日はプラゴミの日です。';
}
break;
case 'Fri':
speakOutput = '明日は家庭ごみの日です。';
break;
default:
speakOutput = '明日はゴミの回収はありません。';
}
これでスキルは完成です。
「保存」をクリックして保存したのち「デプロイ」をクリックします。
動作を確認する
スキルが完成したので動作を確認していきます。
画面上部のメニューからテストをクリックします。
デフォルトでスキルは無効になっているため非公開になっているプルダウンを開発中に切り替えます。

まずはスキルを呼び出します。
「ゴミの日チェッカーを開いて」と打ち込むとLaunchRequestHandlerで設定したメッセージを返しました。

続いて「ゴミの日を教えて」と聞いて、明日のゴミの日を回答すれば動作確認は完了です。

定型アクションを設定する
開発が完了すればスキルは既にAlexaで使えるようになっています。
ただ、スキルを一々起動するのは面倒なのでショートカットを設定して行きます。
スマートフォンのAlexaアプリを開き、その他タブから定型アクションを開きます。

右上の「+」マークから定型アクションの新規登録を行います。

以下の内容を入力します。
定型アクション名:ゴミの日チェッカー
実行条件:アレクサ、ゴミの日を教えて
アクション:ゴミの日チェッカーでゴミの日を教えて

これで定型アクションの作成は完了です。
実際にAlexaに「ゴミの日を教えて」と話しかけることでゴミの日を確認することができるようになりました。
まとめ
今回は初めてのスキル作成だったので比較的簡単なものを作成してみました。
コーディングができると一気に使い方の幅も広がりますね。
今後も自由研究の一環として色々面白いスキル開発をして紹介できればと考えています。
