【AWS入門】PollyとTranscribeで男女音声で遊んでみた♪

[前回のtranscribe](https://qiita.com/MuAuan/items/f67bb978a77dbddb018d)[前々回polly](https://qiita.com/MuAuan/items/ca17a467256a1ad3332c)で、それぞれをちょっと弄って遊んだが、今回は自由に使い倒す目的で簡単に利用できるように変更した。
###やったこと
・会話アプリ想定でのシーケンス
・実現するコード
・実際の結果
###・会話アプリ想定でのシーケンス
想定は、途中に会話アプリで文字文章を変換してあたかも男性と女性が会話しているような状況を作り出すことである。
ここで会話アプリは自然言語処理であり、入力は文字文章での会話アプリである。

そのために、以下のようなシーケンスを実施した。
①適当な文章を入力
②①の文章をpollyで女性の音声に変換
③女性音声ファイルmp3を取得；発生
④女性音声ファイルをtranscribeして文字文章に変換；会話アプリ入力；返答文章
⑤返答文章（今は④の変換された文字文章）をpollyして男性の音声に変換；発生
⑥男性音声ファイルmp3を取得；発生
⑦最後に男性音声ファイルをtranscribeして文字文章に変換；会話アプリ入力；返答文章．．．

```py
text0="こんにちわ、今日は東京・横浜は曇りです。みずきが,お知らせしました"　#①
vfile = function_polly(text0,'Mizuki') #②
file0= vfile #'Mizuki.mp3' #③
text0 = fun_tran(file0) #④
vfile = function_polly(text0,'Takumi') #⑤
file0= vfile #'Takumi.mp3' #⑥
text0 = fun_tran(file0) #⑦
```
###・実現するコード
コード的には前回・前々回のものを使いやすいように関数にしただけである。
利用するLibは以下のとおりです。

```py
from __future__ import print_function
import time
import boto3
import pandas as pd
from boto3 import Session
```
両関数で使う、sessionやpolly, transicribeおよびs3での格納バケットを定義します。

```py
session = Session(profile_name="default")
polly = session.client("polly")
transcribe = boto3.client('transcribe')
s3 = boto3.resource('s3') #S3オブジェクトを取得
bucket = s3.Bucket('muauanpub') #bucket定義
```
以下がテキストを音声に変換する関数function_pollyである。
入力はテキストと女性か男性音声かのvoice0である。
関数内の処理は、
①変換
②mp3ファイルのローカルec2へ保存
③s3バケットへアップロード⇒htmlなどで公開
④s3での音声ファイル名vfileをリターン

```py
def function_polly(text0,voice0):
    response = polly.synthesize_speech(Text=text0, OutputFormat="mp3",  VoiceId=voice0) #"Mizuki"
    file = open('speech.mp3', 'wb')
    file.write(response['AudioStream'].read())
    file.close()
    vfile = '{}.mp3'.format(voice0)
    bucket.upload_file('speech.mp3', vfile,  ExtraArgs={'ACL':'public-read'})
    return vfile
```
次は、音声ファイルをテキストファイルに変換するfun_tran関数である。
ここで重要なことはjob_nameが一意で連続する変換を実施するためには、job名を時刻などの要素を入れて次から次に生成するか、または消去する必要があるということである。
今回は、消去する関数がtranscribe.delete_transcription_job(TranscriptionJobName='test_tran')で実現出来たので、こちらの手法を利用した。
また、前回も書いたが、出力先のs3バケット名を定義するのは重要である。
s3のオブジェクト取得；s3 = boto3.resource('s3')．．．等が重複している。
※どこに格納しているかが見えるのでそれぞれの関数内に置いている。

```py
def fun_tran(file0):
    job_name = "test_tran"
    job_uri = "https://muauanpub.s3.amazonaws.com/{}".format(file0)
    transcribe.start_transcription_job(
        TranscriptionJobName=job_name,
        Media={'MediaFileUri': job_uri},
        MediaFormat='mp3',
        LanguageCode='ja-JP',
        OutputBucketName='muauanpub'
    )
    while True:
        status = transcribe.get_transcription_job(TranscriptionJobName=job_name)
        if status['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED', 'FAILED']:
            break
        print("Not ready yet...")
        time.sleep(5)
    print(status)

    bucket.download_file('test_tran.json', 'test_tran.json') #ec2へダウンロード；ダウンロードファイル、ダウンロード後ファイル
    df = pd.read_json('test_tran.json') #jsonファイルをpandasで読込
    text1=df['results'][1][0]['transcript']
    print(text1) #jsonファイルから変換文字列を抽出
    transcribe.delete_transcription_job(TranscriptionJobName='test_tran')
    return text1
```
###・実際の結果
公開12時間位ですが、リクエストが多くs3リクエスト料が無料枠を超えそうなので停止しましたm(__)m
[女性・男性の音声再生]()
###まとめ
・PollyとTranscribe関数を作成して動かしてみた
・簡単に両方の関数が使えるようになり、男女音声を連続発生してみた
・同じ文章を回してみたが発生は崩れず出力文章は同一なので変換精度は高いと言える

・疑似音声会話アプリを作ろう
・LambdaでS3に置かれたら動くような作りを目指そう