【AWS入門】会話アプリの移植とtext2speech@AWSで遊んでみた♪

このところ、将棋AIで遊んでいたので記事がおろそかになっていたが、金曜日から土曜日まで「自前AWSハッカソン（仮）」というのに参加して、題名のことをやってAWSデビューできたので残しておこうと思う。
ほんとに参加者各位におんぶにだっこ状態の初心者でしたが、とても充実した２４時間でした。
###２４時間でやったこと
**以下が時系列的な履歴です。**
・awsに繋げる
・AIソリューションの種類を確認
・speech2textの確認
**・将棋AI学習**
・Pykakasi確認
**・Mecabインストール＠AWS**
**・QA_conversationをAWS対応に改変**
**・text2speech＠AWSにてmp3ファイルに録音**
・mp3ファイルの一括ダウンロード＠TeraTerm
**・mp3ファイルのS3への公開#confidentialファイルが邪魔でした**
**・S3公開音声ファイルの自動生成**

**以下は時間切れで出来ませんでした**
。。。
・会話進行に合わせてmp3転送＆再送
。。。
・speech2textにより音声テキスト変換
・スマホで会話
・完成

###記事にすること
・将棋AIをec2-chainer@Ubuntu16.04－GPU環境で学習
・会話アプリの移植
・pollyのtext2speechで変換音声をWebで再生
###・将棋AIをec2-chainer@Ubuntu16.04－GPU環境で学習
環境はほぼ主催者提供で、ec2上に作成されたWikiに進捗を書き込むスタイルでした。
つまり、インスタンスは各自のアプリに応じて作成します。
ということで、機械学習できるGPU環境p2.xlargeを選びました。これで機械学習用のフレームワークが一通り使えます。
ほぼ以下の参考のとおりですが、制限緩和リクエストなどは予め主催者側が設定しているので不要でした。
【参考】
[GPUでChainerを動かすならDeep Learning Base AMI(Ubuntu)を使用するのが楽。](https://qiita.com/y428_b/items/e38b456972dd7bf8e2aa)
####キーペアの作成も行えば無事インスタンスが立ち上がる
流れは、上記の記事通りですが、ちょっと補足的に記載しておきます。
このキーペアが大切で、SSH接続時に必要になるので安全な所へ格納しておく必要があります。
また、インスタンス作成時、以下の情報が設定され、ファイルがダウンロードできます。
この情報はAWSソリューションを利用してアプリ作るとき必須になるので大切に保管する必要があります。

```
aws_access_key_id                     
aws_secret_access_key
```
####Teratermで接続する
・TeraTermをインストール。
・ホストに[ec2-\*\*-\*\*-\*\*\*-\*\*.us-west-2.compute.amazonaws.com]みたいなホスト名を入力してOK。
繋がるとさらに聞いてくるのでユーザー名：ubuntuと秘密鍵ペアを入力してOKでつながりました。
・繋がったら、以下のサイトから[source activate chainer_p36]をコピペして貼り付けリターンすると、chainer_p36環境がactivateされます。
【参考】
[Chainer@aws](https://docs.aws.amazon.com/ja_jp/dlami/latest/devguide/tutorial-chainer.html)
・ファイル一式をZipにしてTeraTermの転送機能で転送、それをec2の適当なDirに展開します。

今回は将棋AIのtrain_policy_value_resnet.pyを動かしてみましたが、ローカル環境でやるのと比べると時間が凄くかかりました。一応、GPUは利用していましたが、CPUが１００％になっていたのでそのあたりと、ローカルはCuDNNを使っていますが、そこがインストールされているかを確認しなかったのが残念でした。
※今回ここはメインじゃないので追及しませんでした
※以下の参考のとおり他のフレームワークも対応しているとのことです
【参考】
[フレームワークのアクティブ化](https://docs.aws.amazon.com/ja_jp/dlami/latest/devguide/activating.html)
###会話アプリの移植
ファイルは[先日の会話アプリのnano@ubuntuバージョンを利用](https://github.com/MuAuan/something2speak/blob/master/auto_QAconversation_nano.py)します。この資材を送ります。
最も、機械学習といってもDL利用していないので、新たにubuntu18.04のt2.largeインスタンスを作成しなおして動かします。価格比較すると以下のように一桁安価です。

```
p2.xlarge	4	12	61 GiB	EBS のみ	0.9USD/時間
t2.large	2	変数	8 GiB	EBS のみ	0.0928USD/時間
```
【参考】
[Amazon EC2 料金表](https://aws.amazon.com/jp/ec2/pricing/on-demand/)
####・Mecabインストール＠AWS
移植で一番の難関はMecabインストールです。
どの環境でもてこずりますが、AWSのt2.large ubuntu18.04でもてこずりました。
基本は、[nanoのときと同様](https://qiita.com/MuAuan/items/61a9fcfe7cd2f0c82584)以下の参考のとおりです。
【参考】
[ubuntu 18.10 に mecab をインストール](https://qiita.com/ekzemplaro/items/c98c7f6698f130b55d53)
しかし今回もNo module named 'Mecab' errorがでてしましました。
原因は不明ですが、以下で再インストールして動きました。

```
sudo pip3 install --no-cache-dir mecab-python3
```
あと、辞書は上記の方法でトラブルなく入りました。
音声発生は直にしないのでpyaudioはインストールしませんが、pykakasiはインストールして確認できました。
これで、qa_conversation_nano.pyのtext2speak()関数呼び出しを消すと動きました。
###・amazon pollyのtext2speechで変換音声をWebで再生
このアプリは、最終的には音声で会話したいと思っています。
なので、speech2textとtext2speechがあればそれを使いたいと思っていましたが、AWSには日本語対応しているのはtext2speechのみなのでこれを使うこととしました。
####Pollyのtext2speechで音声変換
AWSは説明はたくさんありますが、肝心なところに行きつけるようになるのに慣れが必要なようです。ということで以下のコードを見つけました。
これを使うとTextに入力した文章を音声ファイルに変換して、ec2のサーバの指定のDirにmp３ファイルをおいてくれます。
ここでaws_access_key_id=,aws_secret_access_key=,のそれぞれの右辺には上記のインスタンス作成時に生成したとき生成されたキーを入力します。

[SynthesizeSpeech@AWS](https://docs.aws.amazon.com/ja_jp/polly/latest/dg/SynthesizeSpeechSamplePython.html)


```py
import boto3

polly_client = boto3.Session(
                aws_access_key_id=,                     
    aws_secret_access_key=,
    region_name='us-west-2').client('polly')

response = polly_client.synthesize_speech(VoiceId='Joanna',
                OutputFormat='mp3', 
                Text = 'This is a sample text to be synthesized.')

file = open('speech.mp3', 'wb')
file.write(response['AudioStream'].read())
file.close()
```
日本語対応はVoiceId='Mizuki'とし、Textに日本語を入れます。
いろいろ調整できそうですが今回は時間の都合デフォルトです。
[Amazon Polly の音声](https://docs.aws.amazon.com/ja_jp/polly/latest/dg/voicelist.html)

####ec2からs3への転送
以下のコードで実施できました。
実は、ここで問題発生しました。
つまりキーが異なるというエラーが出ました。
これは、この転送をする際に認証が発生していて、自動的にconfidentialファイルを見に行って古いキーを読み込んでいました。
そこで、今回はこのファイルを削除して正常にアップロードできました。

```py
# -*- coding: utf-8 -*-
import boto3

s3 = boto3.resource('s3') #S3オブジェクトを取得

bucket = s3.Bucket('s3のbucket-name')
bucket.upload_file('ec2のmp3ファイルを指定', 's3のbucketのdir指定')
```
※今回、boto3.resourceで実施したけど参考だと以下のboto3.clientで実施しています。
【参考】
[boto3でS3のファイルを操作](https://qiita.com/hkwid/items/8e1cbbdde4742ff018bf)

```py
s3_client = boto3.client('s3')

# Upload the file to S3
s3_client.upload_file('test.txt', 'bucket-name', 'test-remote.txt')
```
####s3公開サーバーの音声を出力する
ここまでくれば通常のhtmlで音声を発生させることができます。

【参考】
[<audio>: 埋め込み音声要素](https://developer.mozilla.org/ja/docs/Web/HTML/Element/audio)

```html
<html>
<body>
<figure>
    <figcaption>Listen to the Answer:</figcaption>
    <audio
        autoplay
        controls
        src="https://******.s3-****.amazonaws.com/mp3/speech0.mp3">
            Your browser does not support the
            <code>audio</code> element.
    </audio>
</figure>
</body>
</html>
```

###まとめ
・「自前AWSハッカソン（仮）」に参加してAWSデビューできた
・会話アプリをAWS上で遊んでみた
・text2speechは目途がたった

・speech2textはAWSでは日本語対応していなかったので、対策を考える必要がある
・スマホで会話