はじめに
Alexaは、『声』という直感的なインターフェイスを使って様々なサービスを利用することができます。
利用するサービスは自分で『スキル』を構築することにより拡張でき、オリジナルのサービスをAlexaを通して利用することができます。
ここでは、Twilioを使ってSMSを送信するAlexaスキルの作り方を紹介します。
前提
この記事では以下を前提としています。
- Alexa 開発者アカウントを持っている(https://developer.amazon.com/ja/alexa からサインインできる)
- Twilioアカウントを持っている
- もしTwilioアカウントをもっていない場合は、https://jp.twilio.com/try-twilio/kddi-webからサインアップしてください。
目次
- SMS送信用の電話番号を取る
- Alexaスキルを作る
- スキルの呼び出し名、インテントを設定する
- Twilio FunctionsでSMS送信処理部分をつくる
- AlexaスキルとFunctionsをつなぎこむ
- テスト
1. SMS送信用の電話番号を取る
Twilioコンソールにこちらからログインします。
左のメニューから『Phone Numbers』を選択し、『番号の管理』から『番号を購入』(+ボタン)を選択します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fvigorous-crush-3355.twil.io%2Fassets%2Fphone_number_menu.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=df41b995e7ee72891f676f90e6e1df8a)
Twilioでは、SMSの送信は日本の番号からはできません。アメリカ番号(+1で始まる番号)を購入する必要があります。そのため、『COUNTRY』では『United States』を選択し、『機能』で『SMS』にチェックを入れて検索してください。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fvigorous-crush-3355.twil.io%2Fassets%2Fphone_number_search.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=2a48ef47deb56c204ea48873c30a46e5)
検索結果に表示された番号の中から好きなものを選び、『購入』ボタンをクリックして購入してください。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fvigorous-crush-3355.twil.io%2Fassets%2Fphone_number_purchase.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=b33833cafed2650b8f7ab968fda4c0b4)
2. Alexaスキルを作る
Alexaデベロッパーコンソールにこちらからサインインします。
『スキルを作成』ボタンをクリックし、スキル作成画面に遷移します。
![skill_create.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F268190%2F01e82ef3-b26f-e3c0-edfa-61cf4acf61ce.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d7716eabbf6c2e56275d18af034b547a)
スキル名、デフォルトの言語(日本語)、スキルに追加するモデル(カスタム)を選択し、『スキルを作成』ボタンをクリックすると、新しいスキルが作成できます。
![skill_create_finish.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F268190%2Fd22e1433-68ac-b5a9-e914-9cbd3644bbd1.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=2818aeb6b6e963a8deeab13e7fe25a35)
3. スキルの呼び出し名、インテントを設定する
スキルの管理画面で、左のメニューから『呼び出し名』を選択します。
![skill_call_name.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F268190%2F93a4fabf-17d1-df83-2551-454e7f6ec558.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=497014806a6e35f0cc46a389dceed5a3)
呼び出し名は、『アレクサ、〇〇で■■して』とAlexaに話しかけたときの『〇〇』にあたる部分です。
好きな名前を入力してください(今回は『おくるくん』とします)。入力したら、『モデルを保存』ボタンで入力値を保存します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fvigorous-crush-3355.twil.io%2Fassets%2Fskill_call_name_finish.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=beb164617f2d2f5d4aaf1d6631d75b1a)
次に、左メニューのインテントで『追加』をクリックします。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fvigorous-crush-3355.twil.io%2Fassets%2Fskill_intent_add.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d8620fe6a02fcae0d84b421e13644612)
インテントは、『アレクサ、〇〇で■■して』とユーザーからリクエストを受けたあと、そのリクエストに対応して行われる処理のことを指します(詳細については、こちらをご参照ください)。
『追加』をクリックすると、インテントの名前入力欄が表示されます。インテントの名前はこの後作成するTwilio Function上コードでも使用しますので、アルファベットの大文字、小文字、アンダースコアのみを使い、わかりやすい名前をつけてください(今回は『SendSms』とします)。
名前の入力後、『カスタムインテントを作成』をクリックします。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fvigorous-crush-3355.twil.io%2Fassets%2Fskill_intent_create.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=4b2ec34062aa54647a344effb6eba0cb)
カスタムインテントの作成後、そのインテントの詳細設定画面に遷移します。ここでは『サンプル発話』を入力します。
サンプル発話は、『アレクサ、〇〇で■■して』の『■■して』の部分にあたります。サンプル発話に登録した内容がAlexaにリクエストされると、サンプル発話が登録されているインテントが実行されます。
ここではサンプル発話を一つ入力します(実際にAlexaスキルを作成する場合は、表記ゆれを考慮し複数のパターンの発話を登録する必要があります)。
サンプル発話を入力したら、エンターキーで登録ができます。登録後、『モデルを保存』ボタンで入力値を保存します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fvigorous-crush-3355.twil.io%2Fassets%2Fskill_intent_create_finish.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d1e53811aec20538679ab65602e03e64)
4. FunctionsでSMS送信処理部分をつくる
Twilioの管理コンソールにログインし、スライドメニューからRuntimeのConfigureを選択します。
CredentialsのEnable ACCOUNT_SID and AUTH_TOKENのチェックを入れます。
![スクリーンショット 2018-08-07 18.26.15.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F268190%2Fdc4bdeea-12cb-66f1-ee48-19fa51eee984.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=192f18fb054cc590f83e32a4fd81d1ed)
Environmental Variablesの下にある赤い+アイコンを2回クリックして、枠を2行作ります。
今作成した2行に、以下の内容を追加します。
KEY | VALUE |
---|---|
SMS_FROM_NUMBER | 先程購入したUS番号 |
SMS_TO_NUMBER | SMSを送信したい携帯番号(E.164形式) |
Dependenciesの中の赤い+アイコンを押して、枠を一つ追加します。
NAME欄に、「ask-sdk」、VERSION欄に「2.0.7」と入力します。
![スクリーンショット 2018-08-07 17.14.14.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F268190%2Ffdb55300-401f-bc06-9f3b-0b9ec2da8d09.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=632919a26615ebcc1ea4ee168a0e259e)
画面下部にあるSaveボタンを押して、設定を保存します。
左側のメニューのFunctionsのManageを選択します。
赤い+アイコンを押すか、Create a new Functionボタンを押して新しいFunctionを作ります。
New Functionダイアログが開くので、Blankを選択してからCreateボタンを押します。
FUNCTION NAMEに「SendSmsV2」と入力し、PATH欄には、「/send-sms-v2」と入力します。
![スクリーンショット 2018-08-07 17.18.09.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F268190%2F0c921d25-02c4-ab5a-965b-4f1326b748a2.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d4fbb7e43e65c2029f7dc493df997df5)
CODE欄に予め書かれているコードをすべて削除し、以下のコードを貼り付けます。
const Alexa = require('ask-sdk');
const HELP_MESSAGE = 'エスエムエスを送信できます。おくるくん、エスエムエスを送ってと言ってみてください';
const MESSAGE_BODY = 'こんにちは! AlexaからのSMSです';
const SENT_MESSAGE = 'エスエムエスを送信しました。';
const STOP_MESSAGE = 'さようなら';
let twilioContext;
const LaunchRequestHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
},
handle(handlerInput) {
const speechText = HELP_MESSAGE;
return handlerInput.responseBuilder
.speak(speechText)
.reprompt(speechText)
.getResponse();
}
}
const SendSmsIntentHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'IntentRequest'
&& handlerInput.requestEnvelope.request.intent.name === 'SendSms';
},
handle(handlerInput) {
const client = twilioContext.getTwilioClient();
return client.messages
.create({
body: MESSAGE_BODY,
from: twilioContext.SMS_FROM_NUMBER,
to: twilioContext.SMS_TO_NUMBER
})
.then(message => {
const speechText = SENT_MESSAGE;
return handlerInput.responseBuilder
.speak(speechText)
.getResponse();
})
}
};
const HelpIntentHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'IntentRequest'
&& handlerInput.requestEnvelope.request.intent.name === 'AMAZON.HelpIntent';
},
handle(handlerInput) {
const speechText = HELP_MESSAGE;
return handlerInput.responseBuilder
.speak(speechText)
.reprompt(speechText)
.getResponse();
}
};
const CancelAndStopIntentHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'IntentRequest'
&& (handlerInput.requestEnvelope.request.intent.name === 'AMAZON.CancelIntent'
|| handlerInput.requestEnvelope.request.intent.name === 'AMAZON.StopIntent');
},
handle(handlerInput) {
const speechText = STOP_MESSAGE;
return handlerInput.responseBuilder
.speak(speechText)
.getResponse();
}
};
const SessionEndedRequestHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'SessionEndedRequest';
},
handle(handlerInput) {
return handlerInput.responseBuilder.getResponse();
}
};
const ErrorHandler = {
canHandle(handlerInput) {
return true;
},
handle(handlerInput) {
return handlerInput.responseBuilder.speak('正常に処理できませんでした。')
.getResponse();
}
};
let skill;
exports.handler = function (context, event, callback) {
console.log(`REQUEST++++${JSON.stringify(event)}`);
twilioContext = context; // Twilioの環境変数参照用
if (!skill) {
skill = Alexa.SkillBuilders.custom()
.addRequestHandlers(
LaunchRequestHandler,
SendSmsIntentHandler,
HelpIntentHandler,
CancelAndStopIntentHandler,
SessionEndedRequestHandler,
)
.addErrorHandlers(ErrorHandler)
.create();
}
return skill.invoke(event,context)
.then((res) => {
callback(null, res);
})
.catch((error) => {
callback(error);
});
};
Saveボタンを押して、デプロイが完了するまでしばらく待ちます。
PATH欄の右側にあるコピーアイコンをクリックし、FunctionsのURLをクリップボードにコピーしておきます。
5. AlexaスキルとFunctionsをつなぎこむ
Alexaデベロッパーコンソールで左メニューの『エンドポイント』を選択します。
『サービスのエンドポイントの種類』で『HTTPS』を選択し、『デフォルトの地域』に手順4で作成したFunctionsのURLを入力します。
証明書については、『開発用のエンドポイントは、証明機関が発行したワイルドカード証明書をもつドメインのサブドメインです』を選択します。
入力が終わったら『エンドポイントを保存』ボタンで入力値を保存します。
6. テスト
Alexaデベロッパーコンソールの上部メニューで『ビルド』を選択し、『モデルをビルド』をクリックします。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fvigorous-crush-3355.twil.io%2Fassets%2Falexa_skill_build.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=02d5c3121a24d073f2521d5260078896)
ビルド完了までには数分かかり、完了したらそのメッセージが表示されます。
ビルドが完了したら『テスト』を選択します。もしスキルのテストが無効になっていた場合は有効化します。
入力欄に『アレクサ、{呼び出し名}で{サンプル発話}』と入力します。例えば、『呼び出し名』に『おくるくん』、『サンプル発話』に『エスエムエスを送って』と入力していたら、『アレクサ、おくるくんでエスエムエスを送って』と入力します。
すると処理が実行され、SMSが送信されてきます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fvigorous-crush-3355.twil.io%2Fassets%2Falexa_test.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=41e394cd480c3642cb71a56e124cabd5)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fvigorous-crush-3355.twil.io%2Fassets%2Fsms.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=accb5d97bd68c56f97c14544708a3471)
これでSMSを送信するAlexaスキルの作成は完了です。
Twilio SDKについて
今回のように、Twilio Functionsを利用することで、Lambdaを利用せずにスキルの開発可能になりました。
TwilioSDKでは、SMS以外にも『電話をかける』『LINEやFacebook Messangerにメッセージを送る』『プッシュ通知』『Faxを送る』など様々な機能を簡単に利用することができます。
Alexaスキル開発にTwilioを利用し、様々なコミュニケーション機能を組み込んでみてください。