[Media-JAWS][ハンズオン]AWSの方に学ぶ「Amazon Comprehend, Amazon Transcribe」


先日、以下に行ってきたので自分がハマったことも含めて残しておく。

https://media-jaws.doorkeeper.jp/events/102726

# 今回のハンズオン内ででてくるサービスのざっくり概要
+ Amazon Translate
  + https://aws.amazon.com/jp/translate/
  + 機械翻訳サービス
+ Amazon Polly
  + https://aws.amazon.com/jp/polly/
  + Text to Spearch
  + 文字をMP3にしてくれる
+ Amazon Transcribe
  + https://aws.amazon.com/jp/transcribe/
  + Speech To Text
+ Comprehend(コンプリヘンド)
  + https://aws.amazon.com/jp/comprehend/
  + 自然言語処理
  + 文章の構造解析
    + その文章の感情や主語/主題などを解析してくれる
    + ポジティブ/ネガティブに部類分けなんかもできる
+ Amazon Elasticsearch Service
  + https://aws.amazon.com/jp/elasticsearch-service/
  + 今回のハンズオンの内容とは直接は関係ないが、Comprehendの結果を可視化するために利用するとのこと。

# 各サービスについてもうちょっと
## Amazon Translate
+ Translastion Memory（翻訳用辞書）をアップロードして、独自の翻訳をすることも可能
  + 例：「EC2」という単語を登録しておくことで、翻訳しないでこのまま出力するといったようなこと

## Amazon Polly
+ 音声は女性/男性が選べる
  + Mizukiは水樹奈々から来ているかもしれないとのこと
  + SSMで補正することができる。細かいカスタマイズが可能
  + ※個人的所感：雰囲気的にはAlexaの中身と同じような仕組みを使っているんだろうなという気がする。

## Amazon Transcribe
+ 直接データを格納する領域をもたないため、S3などに格納しそこのデータを参照する必要がある
+ そのため、今回のハンズオンでは、Pollyで出力したMP3をS3へ格納し、IAMで権限設定した上でアクセスすることになる
+ 文字おこしのモードは２種類ある
  + MP3から文字おこし
  + ストリーミングから文字おこし（こちらは日本語未対応）

## Amazon Comprehend
+ 出力されるのはキーワードのみ。全部ではない
+ センチメント分析ができる
  + ニュースなどで殺人事件がでてきても、ニュートラルな結果になるとのこと。
    + ニュースは文体がニュートラルなのでわかるらしい
+ 同じサービスからの派生で医療情報向けの「Amazon Comprehend Medical」がある

# AWSの考え方
+ AWSは機械学習とAIを明確にわけている
  + プロセスやアルゴリズムの部分については「機械学習」
  + それで出てきた付加価値の提供を「AIサービス」と呼んでいる
+ これをわけているのはそれぞれでお金の流れが別の考え方になると考えているため
  + 機械学習：投資フェーズ
  + AI：回収フェーズ
+ それ以外にも機械学習とAIはもろもろが違うと考えている
  + 機械学習：データサイエンティスト
  + AI：フロントエンドエンジニア
+ 自社でしかもっていないデータをどうこうしたいのであれば、機械学習が必要だし、一般的に公開されているのであればAIサービスといった考え方も。
+ 個人的所感：この辺については見せていただいたスライドが参照できるとわかりやすいと思う。

# ハンズオン開始
## GithubからDL
+ https://github.com/harunobukameda
  + Amazon-Translate---Amazon-Polly---Amazon-Transcribe---Amazon-Comprehend---Amazon-Elasticsearch

## やってみた
+ 英語の文章を探す
  + https://www.pff.com/news/draft-2020-nfl-draft-pff-top-100-big-board-update

```
With the Senior Bowl now in the books, PFF Lead Draft Analyst Mike Renner has updated his Top 100 Big Board for the 2020 NFL Draft. The evaluation process will continue this week in Mobile, but this is where Renner sees the 2020 class right now.
```

+ Amazon Translate

```
"PFFリードドラフトアナリストのマイク・レナーは、シニアボウルが本に掲載され、2020年のNFLドラフトのトップ100ビッグボードを更新しました。 今週はモバイルで評価プロセスを継続しますが、レナーは2020年クラスを今見ています。"
```

+ Amazon Polly
  + MP3化された

+ Transcribe
  + 文字起こしされた

```
フィード ドラフト アナリスト の マイク レナ は シニア ボール が 本 に 掲載 さ れ 二 千 二 十 年 の ドラフト の トップ 百 ビック ボード を 更新 し まし た 今週 は モバイル で 評価 プロセス を 継続 し ます が レナー は 二 千 二 十 年 クラス を 今 見 て い ます
```

当たり前のことなんだろうけど、翻訳された文章→音声→文章になっている。

+ Amazon Comprehend

```
"sentiment": "NEUTRAL"
```

まあもともとの文章からしてポジでもネガでもないのでニュートラルと。。

+ 一連の処理を連携させる
    + Cloud9の設定にて
        + 「パブリックサブネットを持つVPCとパブリックサブネット」を選択する際にちょい悩む。
        + 解決：VPCはアカウントに対してデフォルトで一つ作成されているのでそれで問題なければそれを使う。法人アカウントなどでそれが使えない場合などは改めて作ろうという意味っぽい。
    + Cloud9の環境作成にて
        + pythonは3系で作成されるのに、pipはなぜか2系の方を向いているので変更する必要があるとのこと。
        + 不具合に近いなと思うのだが、これぐらいのサービスを使う人なら簡単に直せるから後回しなのだろうか？

+ ひとしきり設定し、実行

```
Starting transcription job...
Traceback (most recent call last):
  File "/home/ec2-user/environment/call-center.py", line 53, in <module>
    'MaxSpeakerLabels': 2 # assumes two people on a phone call
  File "/usr/local/lib/python3.6/site-packages/botocore/client.py", line 272, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/usr/local/lib/python3.6/site-packages/botocore/client.py", line 576, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.errorfactory.BadRequestException: An error occurred (BadRequestException) when calling the StartTranscriptionJob operation: The S3 URI that you provided points to the incorrect region. Make sure that the bucket is in the us-east-2 region and try your request again.
```

Cloud9とS3のリージョンがあっていないとこうなる。
→コードを変えればどうにかはできるとのことだが、S3のバケットを同じリージョンに作る方が手間がかからないとのこと。
もう少し補足しておくと
Cloud9上からS3のバケットを作成したのだが、その際に以下のように実行

```
aws s3 mb s3://<バケット名> --region us-west-2
```

ただ、これ以外についてはデフォルトのリージョン（オハイオ）で実行していたので、us-west-2（オレゴン）のS3にアクセスできなかったということみたい。
別リージョンにアクセスできないということはないが、コードをそれなりに変更しないといけないので、この手のことをする際には一式リージョンは合わせておこうという教訓。
※ちなみに本件は今回のハンズオンでそこかしこで聞こえてきてて、「みんなハンズオンテキスト通りにやらないなー」となってた。。。

ということで、

```
aws s3 mb s3://<バケット名> --region us-east-2   
```
であたらしいバケットを作成し、再実行。
※バケット名は世界にユニークである必要があるので、さきほどのとは別名にする。

```
Detecting key phrases...
Detecting sentiment...
Indexing document...
<Response [403]>
{'message': "Credential should be scoped to a valid region, not 'us-west-2'. "}
```

elasticsearchのリージョン指定が間違っていたからだと思われる。

```
es_region = 'us-east-2'
```
に変更し、再実行。

```
<Response [400]>
Traceback (most recent call last):
  File "/home/ec2-user/environment/call-center.py", line 122, in <module>
    print(response.json())
  File "/usr/local/lib/python3.6/site-packages/requests/models.py", line 897, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/lib64/python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "/usr/lib64/python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib64/python3.6/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
```
例外としてはJsonパースのところででているが、そもそも400が返ってきているのがダメな気がする。
権限系は誤りはなかったのでログを出しつつ悩んだが、
結論としてはelasticsearchのエンドポイントURLの指定の仕方が誤っていた。（末尾に/がついていた）

ということで、これでAllOK

## ハンズオン中のこぼれ話
+ Pollyの事例
  + ラジオにて災害時などで活躍
    + アナウンサーが出社しなくても、テキストを作成し処理にかければある程度の代替にはなるとのこと
  + 朝日新聞：アルキキ
+ transcribeの事例
  + ネット系メディアは使っているらしい
+ 今回の最後のCloud9まで使う場合のユースケース
  + Transcribeには何人で話しているかを認識する機能もあり、それを使用することでコールセンターなどで使える。
  + そのデータを収集することで分析することが可能　といったようなケースを想定
+ 会議の文字お越しにtranscribeを使ってみたい
  + 電話会議などの音声を録音するとよい
  + 会議卓の中央に置くだけだと音声がクリアにならないので難しいかもしれない

※ほかにももうちょいあったが、書いていいのかよくわからないので割愛


# 個人的まとめ
サクサク実施するため、人を選ぶとは思いますが、個人的には非常にためになるハンズオンでした。
今回紹介されたAIサービスだけではなく、今まで使ったことなかったCloud9やElasticsearchも触れたし、
クーポンまでもらえたし。