kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

AlexaからAmazon Connectで電話をかける

f:id:kun432:20190710004445j:plain

今日は、@gaomar さん主催の「大阪がおまる塾」でAmazon Connect+LINE Botのハンズオンに行ってきました。

相変わらず技術てんこ盛りな感じだったんですが、LINE BOTとかAmazon Connectはそんなに触ったことがないので、非常に有益な内容でしたでした。電話みたいなアナログなものを絡めるとほんとに面白いです。

帰ってきてから、Alexaで呼び出してみようということで、ここを参考に、というかほぼそのままですね。

単にかけるところだけ動かしてみたかったのでかなりシンプルにしてますが、上の例のほうが実用的です。真ん中のAmazon Connectのパラメータは問い合わせフローを作成すると取得できるようになります。

const Alexa = require('ask-sdk-core');
const aws = require('aws-sdk');

const LaunchRequestHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
    },
    handle(handlerInput) {
        const speechText = 'コネクトのテストです。電話をかけますか?';
        return handlerInput.responseBuilder
            .speak(speechText)
            .reprompt(speechText)
            .getResponse();
    }
};
const callIntentHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest'
            && handlerInput.requestEnvelope.request.intent.name === 'callIntent';
    },
    handle(handlerInput) {
        console.log("callIntent called");

        const connect = new aws.Connect({region:'ap-northeast-1'});
        var params = {
            ContactFlowId: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            DestinationPhoneNumber: "+81XXXXXXXXXX" // かけたい電話番号など(発信先)
            InstanceId: "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            SourcePhoneNumber: "+81XXXXXXXXXX", // Amazon Connectで取得した番号(発信元)
            Attributes: {
                Transfer : '1'
            }
        };
        connect.startOutboundVoiceContact(params, function(err, data) {
            if (err) {
                console.log(err, err.stack);
            } else {
                console.log(data);
            }
        });

        const speechText = '今からあなたに電話しますよ。';
        return handlerInput.responseBuilder
            .speak(speechText)
            .getResponse();
    }
};

・・・

exports.handler = Alexa.SkillBuilders.custom()
    .addRequestHandlers(
        LaunchRequestHandler,
        callIntentHandler,
        HelpIntentHandler,
        CancelAndStopIntentHandler,
        SessionEndedRequestHandler,
        IntentReflectorHandler) // make sure IntentReflectorHandler is last so it doesn't override your custom intent handlers
    .addErrorHandlers(
        ErrorHandler)
    .lambda();

Amazon Connect側のフローも単にしゃべるだけのシンプルなものにしてます。

f:id:kun432:20190710005334p:plain

試してみると

f:id:kun432:20190710005119p:plain

こんな感じで、電話がかかってきます!楽しい!(写真じゃ全く伝わらない)

f:id:kun432:20190710010244p:plain

注意点としては、最初はAlexa-hostedでやろうとしたんですが、どのLambda関数から呼び出されるかをConnect側で選択する必要があるので、残念ながらhostedではできないようです(hostedは選べないというか出てこない、まあ当たり前)

ちなみに、Twilioでも同じことは多分できるはずですし、あっちもGUIのフローエディタもあるので、おわせておすすめです。