AWSでAIサービスを使ってみる〜第4回Transcribe編〜

##Amazon Transcribeとは
音声をテキストに変換するサービスです。言わば文字起こしのサービスです。以前まで日本語は対応しておりませんでしたが、昨年日本語も対応しました。それでは早速使ってみましょう。


##音声ファイルをテキストに変換
テキストに変換する音声ファイルとして前回利用したwarabimochi.pyを利用します。

>また、Transcribeに入力する音声ファイルは、Transcribeからインターネット経由でアクセスできる必要があるため、Web上などにアップロードする必要があります。今回はAWSが提供するサービスの１つであるAWS S3を利用します。

今回のpythonファイルは次の手順で動作します。
①音声ファイルを実行するファイル
②Transcribeの処理の実行
③結果(JSONファイル)の取得
④結果のテキストを表示する

今回コードは長編です。

```scribe_file.py
import boto3
import json
import pprint
import uuid
import urllib

#バケット作成
##uuidでランダムな名前の作成
bucket = str(uuid.uuid4())
print('bucket:', bucket)
region = 'ap-northeast-1'
s3 = boto3.client('s3', region)
#S3バケットの作成
result = s3.create_bucket(
  Bucket=bucket,
  CreateBucketConfiguration={'LocationConstraint': region})

#音声アップロード
file = 'warabimochi.mp3'
key = 'input'
s3.upload_file(file, bucket, key)

#Transcribe作成
transcribe = boto3.client('transcribe', region)
job = str(uuid.uuid4())
uri = 'https://s3-'+region+'.amazonaws.com/'+bucket+'/'+key
#テキスト作成開始
result = transcribe.start_transcription_job(
  TranscriptionJobName=job, Media={'MediaFileUri': uri},
　#日本語コードが対応したため日本語で試してみる
  MediaFormat='mp3', LanguageCode='ja-JP')
print('job_start')
#resultを整理して出力
pprint.pprint(result)

#ジョブが完了したらループ終了
while True:
    result = transcribe.get_transcription_job(TranscriptionJobName=job)
    status = result['TranscriptionJob']['TranscriptionJobStatus']
    if status != 'IN_PROGRESS':
      break
print('job_done')
pprint.pprint(result)

#結果
uri = result['TranscriptionJob']['Transcript']['TranscriptFileUri']
#URIを開く
with urllib.request.urlopen(uri) as file_in:
　#JSONファイルをダウンロード
  transcripts = json.load(file_in)
#出力ファイルを開く
with open('scribe_file_out.json', 'w', encoding='utf-8') as file_out:
　#出力ファイルに書き込み
  json.dump(transcripts, file_out, indent=4)
  
#表示
for transcript in transcripts['results']['transcripts']:
  print(transcript['transcript'])

#ジョブ、アップロードファイル、バケットの削除
transcribe.delete_transcription_job(TranscriptionJobName=job)
s3.delete_object(Bucket=bucket, Key=key)
s3.delete_bucket(Bucket=bucket)
print('s3_delete')

```

ここでwarabimochi.pyの音声データは

>"Nさんは次のミーティングまでにSさんにわらび餅を買う予定です。"

という音声データでした。

果たして、Transcribeはどのようにこの音声データをテキストにしたのでしょうか！

scribe_file.pyを実行します。

```
python scribe_file.py
```

実行結果(こんな感じです。)

```
bucket: ~ランダムに作られたバケット名~

#ジョブ開始時の出力
start_transcription_job:
{'ResponseMetadata': {'HTTPHeaders': {'connection': 'keep-alive',
                                      'content-length': '337',
                                      'content-type': '00000000000000000000,
                                      'date': '0000000000000000000000000',
                                      'x-amzn-requestid': '000000000000000000000'},
                      'HTTPStatusCode': 200,
                      'RequestId': '0000000000000000000000000',
                      'RetryAttempts': 0},
 'TranscriptionJob': {'CreationTime': datetime.datetime(0000000000000000000000000),
                      'LanguageCode': 'ja-JP',
                      'Media': {'MediaFileUri': '~httpsで始まるURI~'},
                      'MediaFormat': 'mp3',
                      'StartTime': datetime.datetime(0000000000000000000000000),
                      'TranscriptionJobName': '000000000000000000000',
                      #進行中
                      'TranscriptionJobStatus': 'IN_PROGRESS'}}


#ジョブ終了の出力
job_done
{'ResponseMetadata': {'HTTPHeaders': {'connection': 'keep-alive',
                                      'content-length': '2131',
                                      'content-type': '0000000000000000000000000',
                                      'date': '0000000000000000000000000',
                                      'x-amzn-requestid': '0000000000000000000000000'},
                      'HTTPStatusCode': 200,
                      'RequestId': '0000000000000000000000000',
                      'RetryAttempts': 0},
 'TranscriptionJob': {'CompletionTime': datetime.datetime(0000000000000000000000000),
                      'CreationTime': datetime.datetime(0000000000000000000000000),
                      'LanguageCode': 'ja-JP',
                      'Media': {'MediaFileUri': '~httpsで始まるURI~'},
                      'MediaFormat': 'mp3',
                      'MediaSampleRateHertz': 22050,
                      'Settings': {'ChannelIdentification': False,
                                   'ShowAlternatives': False},
                      'StartTime': datetime.datetime(0000000000000000000000000),
                      'Transcript': {'TranscriptFileUri': '~10行ぐらいのURIが出力~',
                      'TranscriptionJobStatus': 'COMPLETED'}}
```

テキスト化の結果がこちらです



```
遠藤さんは次のミーティングまでに決算にわらび餅を買う予定です
```


<br>

遠藤さんって誰！？

どうやら日本語版の文字起こしの精度が完全ではないようで、TranscribeがNさんの代わりに遠藤さんを抜擢したみたいです。
最終的にSさんは決算(けっさん)という言葉で認識したみたいですね。
このテキストだと会社のお金でわらび餅を買うみたいな、社内行事になってしまいましたね、、、

Transcribeは日本語のテキスト化の精度はこれからの部分はあるかも知れませんが、笑いの精度は高いのかも知れませんwww

##まとめ
pollyでのテキストの読み上げに加え、Transcribeで音声ファイルの文字起こしを紹介させて頂きました。
次回は画像認識系に入っていきます。

##引用 参考文献

この記事は以下の情報を参考にして執筆しました

[AWSでつくるAIプログラミング入門](https://www.amazon.co.jp/AWS%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B-AI%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E6%9D%BE%E6%B5%A6-%E5%81%A5%E4%B8%80%E9%83%8E/dp/4798059056)