Amazon EchoにNEMの残高をしゃべらせてみた

Amazon Echoが届いたので冬休みの工作がてら、暗号通貨XEM(NEM)の特定のアドレスの残高をしゃべらせるスキル「NEMチェッカー」を作ってみました。

## デモ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Amazon echoに特定のアドレスのXEMの残高をしゃべらせてみた。 <a href="https://twitter.com/hashtag/NEM?src=hash&amp;ref_src=twsrc%5Etfw">#NEM</a> <a href="https://t.co/KVnX3VA24b">pic.twitter.com/KVnX3VA24b</a></p>&mdash; Daoka@OpenApostille (@DaokaTrade) <a href="https://twitter.com/DaokaTrade/status/948121661085069312?ref_src=twsrc%5Etfw">2018年1月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 概要

![xemchecker.png](https://qiita-image-store.s3.amazonaws.com/0/9315/e8abddd4-0b97-0eb4-2fe4-3622b3a14314.png)

Amazon Echoに「アレクサ、NEMチェッカーで残高教えて」と言うと、Amazon EchoからLambdaで作成したNEMチェッカー用のプログラムが呼ばれます。
NEMチェッカーのプログラムでは、NEMのアカウント情報を取得するAPIをコールして、指定したNEMの残高を取得します。
残高の取得ができたら、Amazon Echoに「アドレス"NAxxxxx"の残高は○○xemです。」としゃべってもらうようにセリフを渡し、セリフを受け取ったAmazon Echoがそのセリフを読み上げることでアドレスの残高を回答します。

## ソースコード

今回のプログラムは[alexa/skill-sample-nodejs-fact](https://github.com/alexa/skill-sample-nodejs-fact/blob/ja-JP/lambda/custom/index.js)をカスタマイズして作っています。
実験用のため、アドレスと接続先のノードは固定にしています。

```javascript

'use strict';
var Alexa = require('alexa-sdk');
let request = require('request-promise');

//Replace with your app ID (OPTIONAL).  You can find this value at the top of your skill's page on http://developer.amazon.com.
//Make sure to enclose your value in quotes, like this: var APP_ID = "amzn1.ask.skill.bb4045e6-b3e8-4133-b650-72923c5980f1";
var APP_ID = undefined;

var SKILL_NAME = "NEMチェッカー";
var GET_FACT_MESSAGE_PREFIX = "アドレス、「"
var GET_FACT_MESSAG_MID = "」 の残高は、";
var GET_FACT_MESSAGE_SUFFIX = " XEMです。"
var HELP_MESSAGE = "残高を聞きたい時は「残高教えて」と、終わりたい時は「おしまい」と言ってください。どうしますか？";
var HELP_REPROMPT = "どうしますか？";
var STOP_MESSAGE = "さようなら";

var ADDRESS = "NAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var NIS_API = "http://alice2.nem.ninja:7890/account/get?address=";
const END_POINT = NIS_API + ADDRESS;

exports.handler = function(event, context, callback) {
    var alexa = Alexa.handler(event, context);
    alexa.APP_ID = APP_ID;
    alexa.registerHandlers(handlers);
    alexa.execute();
};

var handlers = {
    'LaunchRequest': function () {
        this.emit('GetNewFactIntent');
    },
    'GetNewFactIntent': function () {
        var balance = 0;
        var options = {
          method: 'GET',
          uri: END_POINT,
          json: true
        }

        request(options).then((response) => {
          console.log(response['account']['balance']/1000000);
          balance = response['account']['balance']/1000000;
          var speechOutput = GET_FACT_MESSAGE_PREFIX + ADDRESS + GET_FACT_MESSAG_MID + balance + GET_FACT_MESSAGE_SUFFIX;
          this.emit(':tellWithCard', speechOutput, SKILL_NAME, speechOutput);
        }, (error) => {
          console.log(error);
          var speechOutput = "残高の取得に失敗しました。"
          this.emit(':tellWithCard', speechOutput, SKILL_NAME, speechOutput);
        });
    },
    'AMAZON.HelpIntent': function () {
        var speechOutput = HELP_MESSAGE;
        var reprompt = HELP_REPROMPT;
        this.emit(':ask', speechOutput, reprompt);
    },
    'AMAZON.CancelIntent': function () {
        this.emit(':tell', STOP_MESSAGE);
    },
    'AMAZON.StopIntent': function () {
        this.emit(':tell', STOP_MESSAGE);
    }
};
```

## まとめ

Amazon EchoのスキルをLambdaで気軽に作ることができるのと、APIでNEMのブロックチェーンにアクセスできるおかげで、比較的簡単にAmazon Echoに特定のアドレスの残高をしゃべらせることができました。
可能性としては、Amazon Echoから送金させることもできるとは思いますが、送金するには以下の課題があります。

* Amazon Echoで使用するデータはクラウド上に保存する必要があるため、秘密鍵をセキュアに保持する方法を考慮する必要がある。
* 音声のインターフェースしか持たないため、送金先、送金金額、メッセージの指定を以下に正確にやりやすくするか考慮する必要がある。

今回、Amazon Echoを使ったサンプルアプリを作ってみた思いとして、NEMの普及活動をしている松本さんが[NEMのウォレットを視覚障害者に試してもらった](http://nemchans.com/nemwallet2/) というきっかけがあり、視覚障害者はお金の扱いにかなり不自由を強いられていることを知り、そのきっかけになればと思い作ってみました。
課題はありますが、こうやってAIスピーカーのアプリ開発もWebアプリを作る並に敷居が低くなると視覚障害者もお金の扱いが自由になる時がくるのではないかと期待できます。