LoginSignup
5
4

More than 5 years have passed since last update.

Lambda不要!電話を発信するAlexaスキルを作る

Last updated at Posted at 2018-07-06

はじめに

Alexaは『声』という直感的なインターフェイスを使って様々なサービスを利用することができます。
自分で『スキル』を構築することで拡張でき、オリジナルのサービスをAlexaを通して利用することができます。

Twilioは電話、SMS、FAX、LINE、チャットなどのコミュニケーション用APIを提供するサービスです。

ここではTwilioを使って電話するAlexaスキルの作り方を紹介します。Lambdaを使わないのでAWSアカウントは必要ありません。

前提

この記事では以下を前提としています。

1. 電話番号取得

電話発信するにはTwilioで電話番号を購入する必要があります。Twilioコンソールにログインします。

左のメニューから『Phone Numbers』を選択し、『番号の管理』から『番号を購入』(+ボタン)を選択します。

phone_number_menu.png

Twilioは100カ国以上の電話番号を購入できます。ここでは日本の電話番号を購入しましょう。
COUNTRYがJapanであることを確認し検索ボタンを押します。

buy-phone-number.png

購入できる電話番号のTYPEはトールフリー(いわゆるフリーダイヤル)とローカルがあります。ローカルを購入しましょう。

phone-numbers.png

2. Alexaスキルを作る

Alexaデベロッパーコンソールにサインインします。
『スキルを作成』ボタンをクリックし、スキル作成画面に遷移します。

skill_create.png

スキル名、デフォルトの言語(日本語)、スキルに追加するモデル(カスタム)を選択し、『スキルを作成』ボタンをクリックすると、新しいスキルが作成できます。

alexa-new-skill.png

スキル名に「MakingCalls」と入力して「スキルを作成」ボタンを押してください。

3. スキルの呼び出し名、インテントを設定

3-1. 呼び出し名

スキルの管理画面で左のメニューから『呼び出し名』を選択します。

skill_call_name.png

呼び出し名は、『アレクサ、〇〇で■■して』とAlexaに話しかけたときの『〇〇』にあたる部分です。
好きな名前を入力してください(今回は『かけるくん』とします)。入力したら、『モデルを保存』ボタンで入力値を保存します。

3-2. インテント

左メニューのインテントで『追加』をクリックします。

インテントは『アレクサ、〇〇で■■して』とユーザーからリクエストを受けたあと、そのリクエストに対応して行われる処理のことを指します(詳細については、ユーザーによるカスタムスキルの呼び出しをご参照ください)。

『追加』をクリックするとインテントの名前入力欄が表示されます。
インテントの名前はこの後作成するTwilio Functionのコードでも使用しますので、アルファベットの大文字、小文字、アンダースコアのみを使い、わかりやすい名前をつけてください(今回は『MakingCalls』とします)。
名前の入力後、『カスタムインテントを作成』をクリックします。

3-3. サンプル発話

カスタムインテントの作成後、そのインテントの詳細設定画面に遷移します。ここでは『サンプル発話』を入力します。
サンプル発話は『アレクサ、〇〇で■■して』の『■■して』の部分にあたります。サンプル発話に登録した内容がAlexaにリクエストされると登録されているインテントが実行されます。

ここではサンプル発話として下記を入力します。

  • 電話して
  • 電話をして
  • 電話かけて
  • 電話をかけて

登録後、『モデルを保存』ボタンで入力値を保存します。

4. Twilio Functionで電話発信

Twilioコンソールで左メニューから『Runtime』>『Functions』を選択します。
Functionsの『Configure』メニューを選び『Enable ACCOUNT_SID and AUTH_TOKEN』にチェックを入れます。

4-1. Environmental Variables

『Environmental Variables』に+をクリックしてALEXA_APP_ID_FOR_CALL、TWILIO_CALL_FROM_NUMBER、TWILIO_CALL_TO_NUMBERの3つの値を登録します。

4-1-1. ALEXA_APP_ID_FOR_CALL

AlexaのスキルIDを入力します。スキルIDはAlexaデベロッパーコンソールのAlexaスキル一覧画面で『スキルIDの表示』から取得できます。

※下記画像はサンプルです。MakingCallsのスキルIDを取得してください。

4-1-2. TWILIO_CALL_FROM_NUMBER

手順1で取得したTwilioの発信用電話番号を入力します。
なお、このとき電話番号は+81からはじまるE.164形式で入力します。E.164形式の電話番号は、Twilioコンソールで『Phone Numbers』>『番号の管理』で該当番号をクリックし、表示される詳細画面の『電話番号』で確認できます。

4-1-3. TWILIO_CALL_TO_NUMBER

発信先の電話番号です。同じくE.164形式で入力します。例えば080-1234-5678なら+818012345678と入力します。
自分の電話番号を登録してみましょう。

4-2. Dependencies

DependenciesはFunctionのnpmです。Nameに『alexa-sdk』、バージョンに『1.0.25』と入力します。
バージョンはコマンドラインからnpm view alexa-sdk versionで調べることができます。

$ npm view alexa-sdk version
1.0.25

入力が終わったら『Save』ボタンをクリックして入力値を保存します。

4-3. 電話するコード

Functionコンソールで『+』ボタンをクリックしFunctionを作成します。タイプは『Blank』を選び『Create』をクリックします。

『FUNCTION NAME』に「MakingCalls」、『PATH』に「/MakingCalls」を入力します。

function-name-and-path.png

『ACCESS CONTROL』と『EVENT』は特に入力する必要はありません。
『CODE』の部分には以下のコードを貼り付けます。

const Alexa = require('alexa-sdk');

const HELP_MESSAGE = '電話を発信できます。かけるくんで電話してと言ってみてください';
const HELP_REPROMPT = '何ができますか?';
const MESSAGE_BODY = 'こんにちは! Alexaから電話です';
const SENT_MESSAGE = '電話しました。';
const STOP_MESSAGE = 'さようなら';

const handlers = {
    'LaunchRequest': function() {
        this.emit(':ask', HELP_MESSAGE, HELP_MESSAGE);
    },
    'MakingCalls': function() {
        // 電話発信
        // https://jp.twilio.com/docs/voice/make-calls
        const client = this.context.getTwilioClient();
        client.calls.create({
                url: 'https://' + this.context.DOMAIN_NAME + '/MakingCalls?message=' + encodeURIComponent(MESSAGE_BODY),
                from: this.context.TWILIO_CALL_FROM_NUMBER,
                to: this.context.TWILIO_CALL_TO_NUMBER
            })
            .then(call => {
                this.response.speak(SENT_MESSAGE);
                this.emit(':responseReady');
            })
    },
    'AMAZON.HelpIntent': function() {
        const speechOutput = HELP_MESSAGE;
        const reprompt = HELP_REPROMPT;

        this.response.speak(speechOutput).listen(reprompt);
        this.emit(':responseReady');
    },
    'AMAZON.CancelIntent': function() {
        this.response.speak(STOP_MESSAGE);
        this.emit(':responseReady');
    },
    'AMAZON.StopIntent': function() {
        this.response.speak(STOP_MESSAGE);
        this.emit(':responseReady');
    },
    'Unhandled': function() {
        this.response.speak(HELP_MESSAGE);
        this.emit(':responseReady');
    },
};

exports.handler = function(context, event, callback) {
    if (event.message) {
        // event.messageをTwilioが発声
        // https://jp.twilio.com/docs/voice/twiml/say
        let sayParams = {};
        sayParams.language = 'ja-JP';
        sayParams.voice = 'alice';

        const twiml = new Twilio.twiml.VoiceResponse();
        twiml.say(sayParams, event.message);
        callback(null, twiml);
    } else {
        const alexa = Alexa.handler(event, context, callback);
        alexa.appId = context.ALEXA_APP_ID_FOR_CALL;
        alexa.registerHandlers(handlers);
        alexa.execute();
    }
};

コード内の'MakingCalls'が手順3で作成したインテントに対応する処理です。

終わったら『Save』ボタンをクリックしてFunctionを保存します。デプロイ開始メッセージの数秒後にデプロイ完了メッセージが表示されます。保存してもすぐに反映されないことにご注意ください。

『PATH』のURLをコピーしてメモしておきます。このURLは手順5で使用します。

5. AlexaスキルとTwilio Functionをつなぐ

Alexaデベロッパーコンソールで左メニューの『エンドポイント』を選択します。

『サービスのエンドポイントの種類』から『HTTPS』を選択し、『デフォルトの地域』に手順4で作成したFunctionのURLを入力します。
証明書は『開発用のエンドポイントは、証明機関が発行したワイルドカード証明書を持つドメインのサブドメインです』を選択します。

入力が終わったら『エンドポイントを保存』ボタンで入力値を保存します。

6. テスト

Alexaデベロッパーコンソールの上部メニューで『ビルド』を選択し『モデルをビルド』をクリックします。

ビルド完了までには数分かかり、完了したらメッセージが表示されます。
ビルドが完了したら『テスト』を選択します。もしスキルのテストが無効になっていた場合は有効化します。
入力欄に『アレクサ、{呼び出し名}で{サンプル発話}』と入力します。例えば、『呼び出し名』に『かけるくん』、『サンプル発話』に『電話して』と入力していたら、『アレクサ、かけるくんで電話をして』と入力します。

電話が掛かってきましたか?

これで電話するAlexaスキルの作成は完了です。

おわりに

Alexaスキル開発にTwilioを利用し、さまざまなコミュニケーション機能を是非組み込んでみてください。

ほかにもいくつかの例を用意しました。参考になれば幸いです。

AlexaにTwilioを使用してコミュニケーション機能を組み込む

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4