【AWS入門】音声-テキスト変換して遊んでみた♪

同じように見えるがこちらは、資料がほとんど無い。
参考のものを見てどうにか出来た。
[昨夜の音声](https://qiita.com/MuAuan/items/ca17a467256a1ad3332c)を貼っておく。今夜はこれをテキスト変換した。
[音声発生](https://muauanmp3.s3.amazonaws.com/index.html)

【参考】
①[Getting Started (AWS SDK for Python (Boto))](https://docs.aws.amazon.com/transcribe/latest/dg/getting-started-python.html)
②[Amazon Transcribeで音声の文字起こしを行う。](https://qiita.com/kooohei/items/2580addd6c1bbc8f1c34)
③[S3 → Lambda → Transcribe → S3 で文字起こしパイプラインを作成する](https://qiita.com/leomaro7/items/ad9726391d547ea3bcfd)

参考①より、以下のようなコードが出来る。
ほぼ参考①と同じように見えるが、一か所参考③を見て、出力先をOutputBucketName='バケット名'として指定している。
これが無いと、ほぼどこに出力されたのかが分からなかった。
※特に指定して存在している場合も~~ファイルは隠しファイルになっているようである~~
　⇒最後にもう一度見たらファイルが見えました

```py
from __future__ import print_function
import time
import boto3
transcribe = boto3.client('transcribe')
job_name = "test_tran3"
job_uri = "https://バケット名.s3.amazonaws.com/speech.mp3"
transcribe.start_transcription_job(
    TranscriptionJobName=job_name,
    Media={'MediaFileUri': job_uri},
    MediaFormat='mp3',  #wav, mp4, mp3
    LanguageCode='ja-JP', #'en-US'
    OutputBucketName='muauanmp3'
)
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)
```
上記コードで以下のような出力が得られる。Not ready yetは5秒に一回出力されるが、6回以上出力しているから30秒程度はかかっているようだ。
そして、一応結果のjsonを吐くがあまり意味は分からない。

```
$ python3 boto_transcribe.py
Not ready yet...
．．．
Not ready yet...
{'TranscriptionJob': {'TranscriptionJobName':..., 'content-length': '506', 'connection': 'keep-alive'}, 'RetryAttempts': 0}}
```
そこで、参考②がやっているように、s3のバケットのファイルを確認する。
音声ファイルspeech.mp3と共に出力されたtest_tran3.jsonなどのファイルが見える。

```
$ aws s3 ls s3://バケット名
2020-06-19 04:52:36          2 .write_access_check_file.temp
．．．
2020-06-18 23:44:17      35467 speech.mp3
．．．
2020-06-19 04:45:47       1472 test_tran2.json
2020-06-19 04:54:09       1663 test_tran3.json
```
次に、s3://バケット名/test_tran3.json をec2サーバーにコピーする。

```
$ aws s3 cp s3://バケット名/test_tran3.json ./
download: s3://バケット名/test_tran3.json to ./test_tran3.json
```
最後に、jsonの中身を以下のコマンドで出力する。
ちゃんと言語があっていると、以下のように正しく出力されたが、同じ音声ファイルを英語の指定でtranscribeした結果は、下のようにアルファベットになっているが、どうも変！
とはいえ、これで一応の音声-テキスト変換が出来た。

```
$ cat test_tran3.json |jq .results[][0].transcript
"こんにちは 東京 横浜 も 少し 曇り です 声 は 水木 さん です"

$ cat test_tran2.json |jq .results[][0].transcript
"Tokyo, Yokohama, Moscow See Commodities, Cueva Mitic Sundays."
```
しかし、実際に使う場合は、やはり手打ちではなくpythonコードでやりたい。
というわけで、いろいろ調査した結果、以下の参考のようなことが出来ることが分かった。

【参考】
④[boto3を使ってS3にファイルのアップ＆ダウンロード](https://qiita.com/yuni/items/e68c14a63e3a2eaaae71)
⑤[pandasでJSON文字列・ファイルを読み込み（read_json）](https://note.nkmk.me/python-pandas-read-json/)
⑥[JSONで配列の入れ子構造や値の取得方法などをPythonを使って説明！](https://www.sejuku.net/blog/79079)
これらのやり方をコードに落とすと以下のようになる。
つまり、
① jsonファイルをダウンロード
② pandasで読み込む
③ 必要な部分を出力する
という方法である。

```py
import pandas as pd
s3 = boto3.resource('s3') #S3オブジェクトを取得

bucket = s3.Bucket('バケット名') #bucket定義
bucket.download_file('test_tran3.json', 'test_tran3.json') #ec2へダウンロード；ダウンロードファイル、ダウンロード後ファイル
df = pd.read_json('test_tran3.json') #jsonファイルをpandasで読込

print(df['results'][1][0]['transcript']) #jsonファイルから変換文字列を抽出
```
こうして一連の作業の結果無事に以下のセンテンスが得られました。
※結果はよく見ると分かち書きされているのが分かります

```
こんにちは 東京 横浜 も 少し 曇り です 声 は 水木 さん です
```
###・バリエーション
####アプリ応用
単品で、議事録や翻訳などは普通に使えそうです。
さらに、昨晩のテキスト-音声と合わせると、以下のようなシークエンスが構成出来ることが分かります。

```
テキスト-音声-．．．-音声-テキスト
```
ということで、．．．の部分の処理はいろいろ考えられます。
パーポや資料の読み上げと質問のシークエンスをテキストで記録する。
つまり、最初のテキストや音声と処理後の音声やテキストは異なると思われます。
また、他のシーケンスも考えられます。
会話アプリの場合だと、上記の配置は逆転して

```
音声-テキスト－会話アプリ－テキスト-音声
```
というのが考えられます。
これは、アレクサなんかのシークエンスですね。
この場合は、テキストベースの変換なので、普通に翻訳が出来そうです

####音声QA
アレクサみたいな音声－QAアプリも作れそうです。
質問をスマホなどの音声で受け付けて、その裏で上記のアプリを動かせばリアルタイムな音声QAも出来そうです。
####Twitter補助
Twitterに限らないけど、要は、入力は音声で出力も音声でやることもできそうです。
。。。ただし、これらのアプリにするにはもうひと頑張り必要ですね。
###まとめ
・音声―テキスト変換で遊んでみた
・pythonで一連の動作を作成できた

・jsonファイルが存在すると二度できないので、毎回同じジョブでやるには一連のシーケンスで削除が必要
・何かアプリ作ろう．．．
・テキスト翻訳もやろう