Google Cloud Speech API vs. Amazon Transcribe

## 文字起こしAPIガチンコバトル
<img width="904" alt="スクリーンショット 2020-01-10 23.02.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100780/ea7cde61-007d-94c7-fc53-96caf86a22ed.png">

ググってざっと見れた範囲の「文字起こしAPI比較してみた」系記事では、数行（もしくは数分）レベルの非常に短い文字起こしを行いgood/badを述べているものが多いです。もしくはニュース動画のような"クリアすぎる音源"に対して行っているものも多いです。[Amazon Transcribeについてバズっていたブログ](https://note.com/sangmin/n/nf404e9945f48)でも、英語での文字起こしで精度が高い話をしています。自然言語処理分野では英語の精度が高いのは知られているところですが日本語だとどうかというところが気になるところです。

自分が知りたいのは、
- 日本語の音源
- Podcastのように素人収録されたある程度ノイズが含まれた音源
- 1hくらいの長尺音源
- 複数人がクロストークしている音源
というような特徴を持った音声データに対してAPIだけでどこまで戦えるか（文字起こしできるか）だったので、いろいろ検証してきました。

1本目の記事ではGoogle Cloud Speech APIの使い方についてまとめ、文字起こし精度が低い仮説を立てました。
- [PythonとGoogle Cloud Speech API を使った音声の文字起こし手順](https://qiita.com/ysdyt/items/bc22eb04d90eb074cf9d)

2本目の記事ではGoogle Cloud Speech APIで文字起こし精度を高めるための前処理方法について実験をしました。
- [Google Cloud Speech API における音声前処理と文字起こし精度の関係調査](https://qiita.com/ysdyt/items/cfbfaba5e0bc5dce54ee)

〆となる今回は、前回得られたベスト精度のGoogle Speech API文字起こし結果 vs. 最近話題になったAmazon Transcribeでの文字起こしを行い、文字起こしAPIの**限界点の一例**をまとめたいと思います。

結果だけ知りたい方は最下段の「Google Cloud Speech API vs. Amazon Transcribeの結果まとめ」項目だけお読みください。

**※注: 今回得られた結論は、今回使用した音声データ、実施した前処理においての結果となります。今回の結果がAPIの性能を結論づけるものではないことをご理解ください。**

## Amazon Transcribeでの文字起こし

Amazonの自動文字起こしAPIである[Amazon Transcribe](https://aws.amazon.com/jp/transcribe/)は以前から存在したサービスですが、2019年11月末に日本語にも対応しました。

使い方はGoogle Speech APIと比較しても非常に簡単なためここでは省略します。[公式のtutorial](https://aws.amazon.com/jp/getting-started/tutorials/create-audio-transcript-transcribe/)や[Classmethodさんのブログ](https://dev.classmethod.jp/cloud/aws/amazontranscribe-japanese/)など参照してください。

文字起こしはもちろん、Japaneseを対象に行います。

Amazon Tanscribeが処理可能としているファイル形式は、mp3, mp4, wav, flac です。Google Speech APIはmp3やwavなど一般的なファイル形式が指定できなかったので嬉しいポイントです。
audio sampling rateも自動で認識されるためGoogleのように手動で指定する必要は無いようです。便利。

ちなみに、Amazon Transcribeでは必須パラメータとは別にoptionalに独自のパラメータを指定できます。
<img width="836" alt="スクリーンショット 2020-01-04 18.09.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100780/afc95050-e566-44b6-f202-d53cdeeb6dc8.png">

簡単にまとめると、

- Audio identification
  - [Channel identification](https://docs.aws.amazon.com/transcribe/latest/dg/how-channel-id.html)・・・もし音源が複数チャンネルに別れている場合これをTrueにする意味がある。チャンネルとは、例えば電話カスタマーサポートの音源において、回答者と質問者が別々の音源であったときはチャンネルは2となる。Amazon Transcribeでは、このパラメータをtrueにした場合はそれぞれのチャンネルを文字起こししたものとmergeされた音源を文字起こししたものの両方を出力してくれるらしい。
  - Speaker identification・・・音源内の話者数を任意に指定できる。最大は10人。デフォルトでは2人。（なので1人が喋ってるだけの音源ならここを1にした方が良いかも？）
- Alternative results・・・Classmethodさんの[ブログ参照](https://dev.classmethod.jp/cloud/aws/transcribe-alternatrive-results/)
- Vocabualry filtering・・・不適切単語のように、指定した単語を自動的にマスキングして文字起こししてくれる機能。Classmethodさんの[ブログ参照](https://dev.classmethod.jp/cloud/aws/amazon-transcribe-supports-vocabulary-filtering/)
- Custom vocabulary・・・特定ドメインにおける専門用語やamazon transcribeが認識できない固有名詞などのヒントを与えることで認識精度を向上するためのもの

今回用いる音源では2人の話者がいるので"Speaker identification"は2となりますが、デフォルトで2となっているらしいので特に指定せず、すべてデフォルト（全て指定なし）で実行しました。

処理時間は1hの音源で約10分でした。Google Speech APIは15分強かかったので処理時間はAmazon transcribeの方が早いです。

## 検証データセットと評価方法

[前回](https://qiita.com/ysdyt/items/cfbfaba5e0bc5dce54ee)と同じ、前処理パラメータを色々組み合わせて作成したNo1からNo8の音源（flacファイル）を用います。音源データは[こちら](https://drive.google.com/drive/folders/1e6mZH7G9Oa7zOdIMUKq9n9QUA93gXKqB?usp=sharing)においてるので使いたい方がもしいたらどうぞ。

同じファイルを対象にする、かつAmazon Transcribe側でoptionalなパラメータも指定せずデフォルトで実行するので、Google speech APIの結果と同じ土俵上で比較してもおかしくないはずです。

Amazon Transcribeの文字起こし出力結果はjsonになります。文字数や単語数のカウントも[前回](https://qiita.com/ysdyt/items/cfbfaba5e0bc5dce54ee)と同じ方法で行いました。（実際の処理コードはこちら）

横串比較のため、評価方法も[前回](https://qiita.com/ysdyt/items/cfbfaba5e0bc5dce54ee)と同じようにしました。



## 結果

### 定量結果

| No.  | ファイル名                                | ノイズ低減処理 | 音量調節 | sample rate hertz | **文字起こし文字数** | **重複有りの全単語数** | **重複有りの名詞単語数** | **重複なしの全単語数** | **重複なしの名詞単語数** |
| ---- | ----------------------------------------- | -------------- | -------- | ----------------- | -------------------- | ---------------------- | ------------------------ | ---------------------- | ------------------------ |
| 1    | 01_001_NoiRed-true_lev-true_samp16k.flac  | True           | True     | 16k               | 19320                | 10469                  | 3150                     | 1702                   | 1057                     |
| 2    | 02_001_NoiRed-true_lev-true_samp44k.flac  | True           | True     | 44k               | 19317                | 10463                  | 3152                     | 1708                   | 1060                     |
| 3    | 03_001_NoiRed-true_lev-false_samp16k.flac | True           | False    | 16k               | 19278                | 10429                  | 3166                     | 1706                   | 1059                     |
| 4    | 04_001_NoiRed-true_lev-false_samp44k.flac | True           | False    | 44k               | 19322                | 10453                  | 3170                     | 1706                   | 1058                     |
| 5    | 05_001_NiRed-false_lev-true_samp16k.flac  | False          | True     | 16k               | 19660                | 10664                  | 3209                     | 1713                   | 1054                     |
| 6    | 06_001_NiRed-false_lev-true_samp44k.flac  | False          | True     | 44k               | 19653                | 10676                  | 3211                     | 1701                   | 1052                     |
| 7    | 07_001_NiRed-false_lev-false_samp16k.flac | False          | False    | 16k               | 19639                | 10653                  | 3209                     | 1702                   | 1052                     |
| 8    | 08_001_NiRed-false_lev-false_samp44k.flac | False          | False    | 44k               | 19620                | 10638                  | 3213                     | 1702                   | 1047                     |

図にしたものが以下です。

<img width="592" alt="スクリーンショット 2020-01-10 23.07.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100780/5f08f8bd-bf41-6e8c-205e-dabca5348e93.png">
<img width="710" alt="スクリーンショット 2020-01-10 23.07.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100780/796355fc-cf5d-b083-f2b3-ad03164ac025.png">
<img width="692" alt="スクリーンショット 2020-01-10 23.07.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100780/dbf6a601-14f9-257d-7de9-657fb5616ec4.png">

サンプル間でほとんど全て同じ結果となりました。結果全体から言えそうなことは、

- Amazon Transcribeでは、Google Speech APIの結果と異なり、**音声の前処理に影響を受けない**（※ここで行った前処理とは、Audacityによるノイズ低減処理とLevelatorによる音量調節処理のことです。これら以外の条件ではまた結果が異なるかもしれません）



ここでは、「**重複なしの名詞単語数**」が（ほぼ誤差レベルですが）一番高かったNo.2の結果をAmazon transcribeでのベスト結果として代表値とします。

前処理のありなしに影響されないかもしれないということで、試しに、**収録撮って出しの生のwavファイル（No.0）**でもAmazon transcribeにかけて結果を出しました。

なんの前処理も行ってないこのwavファイルとNo.2のファイルの違いは何かと言えば、**ステレオかモノラルか**ということだけです。No.2では wavからflacファイルに変換するときに同時にステレオ→モノラル の変換を行っています。これはGoogle speech APIがモノラルファイルしか受け付けないため必要な処理でした。

| No.  | ファイル名                               | ノイズ低減処理 | 音量調節 | sample rate hertz | **文字起こし文字数** | **重複有りの全単語数** | **重複有りの名詞単語数** | **重複なしの全単語数** | **重複なしの名詞単語数** |
| ---- | ---------------------------------------- | -------------- | -------- | ----------------- | -------------------- | ---------------------- | ------------------------ | ---------------------- | ------------------------ |
| 0    | 001.wav                                  | False          | False    | 44k               | 19620                | 10637                  | 3212                     | 1701                   | 1046                     |
| 2    | 02_001_NoiRed-true_lev-true_samp44k.flac | True           | True     | 44k               | 19317                | 10463                  | 3152                     | 1708                   | 1060                     |

「重複なしの全単語数」「重複なしの名詞単語数」は厳密には、No.2のほうが高いですが、これもそれほど差がないです。前処理なし＆ステレオ⇔モノラル変換なし でもほぼ同じ精度がでるのであれば前処理の手間が不要な「生のwavファイルを突っ込む」のが一番良いですね。



Amazon TranscribeではNo.1~No.8までほぼ同じ結果でしたので、No.1~No.8間の定性結果比較はせずに、「Google Cloud Speech APIのベスト結果」と「Amazon Transcribeのベスト結果」の比較をしたいと思います。



## Google Cloud Speech API vs. Amazon Transcribe

前回確認したGoogle Cloud Speech API （ベスト結果 No.8）と、今回確認したAmazon Transcribe（ベスト結果 No.2）のそれぞれの値を比較します。Googleでの結果は[前回の結果](https://qiita.com/ysdyt/items/cfbfaba5e0bc5dce54ee)から数値をとってきています。

### 定量結果比較

#### 文字起こし文字数比較

<img width="592" alt="スクリーンショット 2020-01-10 23.13.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100780/b0c0d6d3-08c0-c5e5-de9c-4e4feb1e4a02.png">
1hの音源に対して、単純な文字起こし数ではAmazon Transcribeが多かったようです。

#### 単語数比較

<img width="649" alt="スクリーンショット 2020-01-10 23.13.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100780/3d058f99-d99c-3d08-66cf-2531c9ef831c.png">
文字起こし数が多かったためか、重複ありの全単語数や名詞数は同じくAmazon Transcribeが多い結果でした。

一方、重複を除いた全単語数や名詞数は両者ほぼ同じとなりました。図ったように同じくらい...

### 定性結果比較

テキストの内容自体はどんな感じだったのかというのを、ざっくりとですが[前回](https://qiita.com/ysdyt/items/cfbfaba5e0bc5dce54ee)と同じ要領で比較していきます。

#### 文字起こし結果

文字起こし冒頭の範囲について、見比べやすいように画像を左右に並べました。左がGoogle、右がAmazonです。
<img width="920" alt="スクリーンショット 2020-01-10 23.15.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100780/6c85c9ee-7bb0-77ab-99d9-5658857ee5e3.png">
判断難しいですが、びみょうーーーーーにGoogleの文字起こしの方がまだマシな気がします。どんぐりの背比べですが。
（※ここではGoogleの結果のみ改行が入っていますが、Google・Amazon共に本来は改行付きで文字起こしをしてくれます。精度は微妙です。なのでここでは筆者によって両者とも改行削除を後処理で行っています。）

#### 頻出名詞

Google, Amazonそれぞれで、「重複なしの名詞単語」と「そのカウント数」を見比べてみます。出現数が11回以上あった単語を試しに表示してみます。
<img width="752" alt="スクリーンショット 2020-01-10 23.16.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100780/30d79b4e-fb3f-d1f2-5427-55f77c61e47c.png">

認識できた単語数はAmazonのほうが多いようです。しかしGoogle, Amazon間で殆どの単語が重複しているので両者の文字起こし性能は大きく違わないことも表しています。Amazonの結果では"ブレインパッド"という弊社社名も抜いてこれているので上出来です。

より多くの単語を認識したいのであれば（今回の音声データにおいては）Amazonのほうが優れているようです。（意味がある単語かどうかは要確認）

#### ワードクラウド

流れで名詞ワードクラウドも。上記の可視化です。左がGoogle、右がAmazonです。
<img width="900" alt="スクリーンショット 2020-01-10 23.16.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100780/3096fc1a-7809-2c14-7b1b-76fd62fae948.png">

## Google Cloud Speech API vs. Amazon Transcribeの結果まとめ

Google Cloud Speech API vs. Amazon Transcribeの結果、

- Google, Amazonともに日本語の文字起こしは、（※今回の音声データにおいて簡単な前処理をした程度でAPIを利用しただけでは） **実用的な文字起こしは無理そう**
- 文字起こしできた**単語数で比較すると結果は概ね同じ**
- Amazon Transcribeでは前処理なしでGoogleと同精度の結果を得たため、**利便性としてはAmazon Transcribeの勝ち**
- SDKをインストールしてCLIでAPIを叩く方法ではなく、ブラウザ上でコンソールを操作してGUIで文字起こしをする場合（非エンジニアの人はほぼ全員こちらの方法のはず）、**利用難易度は比べるまでもなくAmazon Transcribeが勝ち**。というよりGoogle APIの方は非エンジニアには難しすぎる。（※ところで非エンジニアの間では最近では[Google Docの音声入力による文字起こし](https://www.cg-method.com/entry/google-document-convert-voice-to-text/)が流行っているそうです）
- **処理時間はAmazon transcribeが少し早い**。1hのファイルに対して、Googleが15min強ほどかかるのに対してAmazonでは10分ほどで完了する。

個人的には、

日本語文字起こしとしては**どちらも結局実用的なレベルとはほど遠い精度**なので、文字起こしAPIは**単語抽出程度にしか使えない**印象です。（そして単語だけ抽出できてもほとんど使いみちがない...）

そして単語抽出用途だけに使うのであれば、前処理なしで利用できる・GUIで簡単に使える・処理時間が早い という点で**Amazon Transcribeが良い**というのが個人的結論です。

「もっとガチの収録機材を使ってクリアな音声を撮れれば文字起こしも精度が上がる可能性(=inputする音声クオリティーを上げる)」を捨ててはいませんが、自分の収録環境（16000円前後ほどの外付けマイク使用）以上を用意するのは一般ユーザーにはそもそも敷居が高いので「APIを利用して低価格でサクッと日本語の高精度な文字起こし」は現状技術ではどのみち不可能だと思っています。日本語文字起こしは一朝一夕ではいけないようです。

なんだか釈然としないので「こうやったら文字起こし認識上がるよ」というTipsをご存じの方がいればぜひコメント頂きたいです！