Amazon Echoでテキストアドベンチャーっぽいものを作ってみた

# はじめに
[オープンストリーム Advent Calendar 2017](https://qiita.com/advent-calendar/2017/opst-advent2017)８日目担当として参加させて頂きます。
今回は、11月に日本で発売したばかりのAmazon Echoを手に入れる事ができましたので、勉強がてらに「テキストアドベンチャー」っぽい物（音声なのでテキストではないけど・）を作ってみました。

# テキストアドベンチャーとは
> テキストまたはグラフィックス（あるいはその両方）によって現在プレイヤーの置かれている状況が提示され、それに対しプレイヤーが行動を入力すると行動の結果が提示されるので、さらにその状況に対する行動を入力……という操作を繰り返して進めていく、コンピューターとプレイヤーとの対話形式で構成される。プレイングに反射神経を必要とせず、提示される様々な情報から的確な行動を推理・選択することが求められる、思考型のゲームである。(wikiより）

っていうゲームなのですが、テキストを音声に置き換えるとAmazon Echoでできるのでは？っと思って題材に選びました。

# 作ってて思ったこと
AWSのLamdba(Node.js)に作ったプログラムをアップロードして、Alexaから受け取れるテキストを処理して会話を成立させていくわけですが、
テキストを受け取って、応答して、次の応答を待って、状態を管理して～ってのを細々と処理していくとメンドクサイ事がわかり、会話・状態をjsonで定義して処理するよう、小さいフレームワークを作成しました。
ソースをアップロードしようかと思ったのですが、機会があればという事で・・ｗ

# 会話データ
テキストアドベンチャーといいつつ短い会話データですが、ご容赦ください・・。項目については
indexが、会話の進行状況キー
messageが、会話データ
modeが、現在Alexaが何を利用者から期待して待機しているかのモード
modeが、selectの場合はselectを定義して受け付ける回答テキスト
modeが、nameの時は名前覚えるモード
moveは、選択した場合に移動先の進行状況キー（index)
reprompt_messageが、利用者が無言だった場合に再度聞き返す
error_messageが、何回も間違えたり聞き取れなかったりした場合、指定メッセージを喋って終了する

```python:talk.json
[
    {
        "index": 0,
        "message": "私の声が聞こえますか？聞こえるなら返事をしてくれませんか？",
        "mode":"select",
        "select": 
        [
            { "index": 1, "message": "聞こえてる", "move": 1 }
        ],
        "reprompt_message": "ノイズがひど過ぎて聞こえないのかしら？それとも日本語が通じない？？私の声が聞こえていらた、「聞こえてる」と答えて！",
        "error_message": "ダメね。何を言っているか聞こえないは。別の端末にアクセスしてみましょう。"
    },
    {
        "index": 1,
        "message": "よかった！やっと通じた！私の名前はアレクサ。貴方の名前は？",
        "mode":"name",
        "reprompt_message": "あれ？回線の調子が悪いみたい。もう一度お名前を教えてくれる？",
        "error_message": "ダメね。別の周波数に変えてもう一度試してみましょう。",
        "move": 2
    },
    {
        "index": 2,
        "message": "{name} さんですか？",
        "mode":"select",
        "select": 
        [
            { "index": 1, "message": "はい", "move": 4 },
            { "index": 2, "message": "いいえ", "move": 3 }
        ],
        "reprompt_message": "あれ？回線の調子が悪いみたい。もう一度お名前を教えてくれる？",
        "error_message": "ダメね。別の端末にアクセスしてみましょう。"
    },
    {
        "index": 3,
        "message": "回線の調子が悪いみたい。私の名前はアレクサ。貴方の名前は？",
        "mode":"name",
        "reprompt_message": "あれ？回線の調子が悪いみたい。もう一度お名前を教えてくれる？",
        "error_message": "ダメね。別の周波数に変えてもう一度試してみましょう。",
        "move": 2
    },
    {
        "index": 4,
        "message": "{name} さんね！。良かった！狙った通り {name} さんにつながったわ。私は、2044年の貴方からメッセージを預かってお伝えしようとしてアクセスしたの。聞きたい？",
        "mode":"select",
        "select": 
        [
            { "index": 1, "message": "聞きたい", "move": 6 },
            { "index": 2, "message": "聞きたくない", "move": 5 }
        ],
        "reprompt_message": "あれ？回線の調子が悪いみたい。もう一度返事を聞かせて？",
        "error_message": "ダメね。この人は後回しにして、他の人のメッセージを伝えに行きましょう。"
    },
    {
        "index": 5,
        "message": "そう。残念ね。また何処かで会いましょう。",
        "mode":"end",
        "reprompt_message": "",
        "error_message": ""
    },
    {
        "index": 6,
        "message": "では、メッセージを読むわね。「過去の私へ。君がこのメッセージを聞いているという事は、無事アレクサとつながったわけだね。おめでとう。さて、このような方法で過去の私にメッセージを残したのは、どうしても避けたい出来事がこれから、１週間後ぐらいに起きるので伝えるためだ。その内容を聞きたいなら、アレクサに「聞きたい」と伝えてくれ」。",
        "mode":"select",
        "select": 
        [
            { "index": 1, "message": "聞きたい", "move": 7 },
            { "index": 2, "message": "聞きたくない", "move": 5 }
        ],
        "reprompt_message": "あれ？回線の調子が悪いみたい。もう一度返事を聞かせて？",
        "error_message": "ダメね。この人は後回しにして、他の人のメッセージを伝えに行きましょう。"
    },
    {
        "index": 7,
        "message": "では、メッセージの続きを読むわね。「興味を持ってくれてありがとう。過去の私。では、伝えるが、君のPCのブラウザに人には教えられないサイトのブックマークフォルダがあるだろう？」。",
        "mode":"select",
        "select": 
        [
            { "index": 1, "message": "ある", "move": 7 },
            { "index": 2, "message": "ない", "move": 8 }
        ],
        "reprompt_message": "あれ？回線の調子が悪いみたい。もう一度返事を聞かせて？",
        "error_message": "ダメね。この人は後回しにして、他の人のメッセージを伝えに行きましょう。"
    },
    {
        "index": 8,
        "message": "「隠さなくてもいいんだよ？。過去の私。君のPCのブラウザに人には教えられないサイトのブックマークフォルダがあるだろう？」。",
        "mode":"select",
        "select": 
        [
            { "index": 1, "message": "ある", "move": 9 },
            { "index": 2, "message": "ない", "move": 8 }
        ],
        "reprompt_message": "あれ？回線の調子が悪いみたい。もう一度返事を聞かせて？",
        "error_message": "ダメね。この人は後回しにして、他の人のメッセージを伝えに行きましょう。"
    },
    {
        "index": 9,
        "message": "「正直に答えてくれてありがとう。過去の私。約一週間後にそのブックマークの内容がネットに拡散される事故が発生する。繰り返す。ネットに拡散される事故が発生する。い、・・・す・・け・・・・・んだ」。",
        "mode":"end",
        "reprompt_message": "",
        "error_message": ""
    }
]

```

# ベーターテスター機能
Echoと紐づいているメールアドレスを指定して、特定ユーザーに９０日だけテストスキルとして公開する事ができるので、今回は自分のアカウントをベーターテスターとして招待します。
アイコンにdevJPってのがベーターテスト用スキルという印です。
![skill.jpg](https://qiita-image-store.s3.amazonaws.com/0/215344/d6575a4a-1342-a441-5c74-9139e7c865c0.jpeg)


# 実際会話してる音声
音でますので、暇な人だけ聞いてみてください。

[![Amazon Echoでテキストアドベンチャーっぽいものを作ってみた](http://img.youtube.com/vi/6FwemJYYg_g/0.jpg)](https://youtu.be/6FwemJYYg_g)
https://youtu.be/6FwemJYYg_g