Google APIを使って音声ファイルを自動でテキストに文字起こしする

# はじめに
打ち合わせで録音した90分×4ぐらいの音声ファイルを文字起こしする機会があり、初めは2倍速ぐらいで聞いてまとめていたのですが、途中から**これ時間の無駄じゃないかな？今の時代いい感じにやってくれる自動ツールがあるはず！**と思い探してみたのがきっかけです。

[こんな方法](http://daikiojm.hatenablog.com/entry/2018/02/07/224654)を見つけたので試してみるも、アクティブ状態関係なく入力が止まってしまう状況が発生し上手くいかず。。
そこで見つけたのが**Google Cloud Speech API**。これはいける！と思いさっそく試してみました。

# **Google Cloud Platform**とは
https://cloud.google.com/?hl=ja

# **Google Cloud Speech API**とは
https://cloud.google.com/speech/?hl=ja

# 1. アカウント作る
## 1-1. Googleアカウントを作成
## 1-2. https://console.cloud.google.com/ にてアカウント作成

# 2. **Google Cloud Speech API**を使う設定をする
**Google Cloud Platformコンソール画面**のナビゲーションメニューから、「APIとサービス」>「ダッシュボード」>「APIとサービスの有効化」を押して

![スクリーンショット 2018-07-07 23.13.51.png](https://qiita-image-store.s3.amazonaws.com/0/191919/c3032e1d-975b-67d8-2e30-90e4b1efc57d.png)

speechと検索して出てきた以下の2つを有効化を行います。

![スクリーンショット 2018-07-07 23.12.09.png](https://qiita-image-store.s3.amazonaws.com/0/191919/3a0d0abf-fca5-bd69-4e84-9bfdb66d9b76.png)

APIの設定方法については、[https://support.google.com/cloud/answer/6158841?hl=ja](https://support.google.com/cloud/answer/6158841?hl=ja)とかが参考になりそうです。

# 3. **Google Cloud Shell**でAPI認証するための設定をする
右上のコンソールボタン（四角いやつ）を押して、`Shell`を起動します。

（ちなみに[gitやphpなどは](https://cloud.google.com/shell/docs/features#tools)プリインストールされているみたいです）

ここで念のため、APIをアップデートしておきました。

```
$ sudo pip install --upgrade google-cloud-speech
```

## 3-1. 認証情報を作成する
<img width="1421" alt="スクリーンショット 2018-07-07 23.36.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/191919/332d6034-bdcf-20bf-c3d4-a17b0d024065.png">

具体的には、**サービスアカウントキー**を作成します。

- キータイプは **json**
- 役割は **「Project」>「オーナー」** を選択

<img width="821" alt="スクリーンショット 2018-07-07 23.50.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/191919/4d23e317-fea6-77c9-3d02-fb110e8ed747.png">

ダウンロードした`jsonのファイル名`をよしなに変更してから、
**Google Cloud Shell**にて、ダウンロードした認証用のJSONファイルをアップロードする

```
$ export GOOGLE_APPLICATION_CREDENTIALS=[jsonのファイル名].json
```

# 4. 音声ファイルを準備
[使っていたレコーダーアプリ](https://itunes.apple.com/jp/app/%E3%83%9C%E3%82%A4%E3%82%B9%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%80%E3%83%BC-%E9%AB%98%E9%9F%B3%E8%B3%AA%E3%83%9C%E3%82%A4%E3%82%B9%E3%83%A1%E3%83%A2-%E9%8C%B2%E9%9F%B3/id779128258?mt=8)が`.wav`形式だったので、今回はこれをそのまま利用する。

# 5. **Google Cloud Strage**の作成
説明 : https://cloud.google.com/storage/?hl=ja

ナビゲーションメニューから、「Storage」>「ブラウザ」を押して

<img width="647" alt="スクリーンショット 2018-07-08 2.57.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/191919/2cdc8717-0d7c-cc23-9b65-24ab965bc9d8.png">

「パケットを作成」を選択

![スクリーンショット 2018-07-08 0.03.15.png](https://qiita-image-store.s3.amazonaws.com/0/191919/adae4419-a1b3-059c-bbc8-ef794fcad879.png)

以下のような任意の設定で作成します。
※ 「課金を有効にする」設定を行わないとファイルをアップロードできないようなので、注意

![スクリーンショット 2018-07-08 0.05.18.png](https://qiita-image-store.s3.amazonaws.com/0/191919/b5e87a4f-0a3c-639b-3ce6-1b358bed5118.png)

※ 詳しくは、[https://cloud.google.com/storage/docs/quickstart-console?hl=ja](https://cloud.google.com/storage/docs/quickstart-console?hl=ja)を参考

# 6. 音声ファイルを**Google Cloud Storage**にアップする
GUI上で、先ほど作成した**Google Cloud Storage**のパケット内にアップロードします。

# 7. 文字起こしをする準備

下記Pythonファイルを任意の場所に新規作成します。

```transcribe.py
# !/usr/bin/env python
# coding: utf-8
import argparse
import io
import sys
import codecs
import datetime
import locale

def transcribe_gcs(gcs_uri):
    from google.cloud import speech
    from google.cloud.speech import enums
    from google.cloud.speech import types
    client = speech.SpeechClient()

    audio = types.RecognitionAudio(uri=gcs_uri)
    config = types.RecognitionConfig(
        encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16, # wavの設定
        sample_rate_hertz=16000, # ヘルツは音声ファイルに合わせる
        language_code='ja-JP') # 日本語音声の場合

    operation = client.long_running_recognize(config, audio)

    print('Waiting for operation to complete...')
    operationResult = operation.result()

    d = datetime.datetime.today()
    today = d.strftime("%Y%m%d-%H%M%S")
    fout = codecs.open('output{}.txt'.format(today), 'a', 'utf-8')

    for result in operationResult.results:
      for alternative in result.alternatives:
          fout.write(u'{}\n'.format(alternative.transcript))
    fout.close()

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument(
        'path', help='GCS path for audio file to be recognized')
    args = parser.parse_args()
    transcribe_gcs(args.path)
```

# 9. 実際に文字起こしをする

```
$ python transcribe.py gs://[パケット名]/[音声データ名].wav
```

## 9-1. ヘルツが設定したものと合っていない時に出るエラー

```
google.api_core.exceptions.InvalidArgument: 400 Invalid recognition 'config': bad sample rate hertz.
```
Pythonのヘルツ設定部分を音声ファイルのものと合わせれば解決します。

## 9-2. 参照エラー

```
google.api_core.exceptions.PermissionDenied: 403 Cloud Speech API has not been used in project・・・
```
新規にサービスアカウントを取り直すことで解決することがあるらしいです。

# 10. 結果の見方
文字起こしの結果は、`output****.txt`というファイルでカレントディレクトリに作成されます。
jsonファイルをアップした時同様、shellのメニューからローカルにダウンロードすることで確認ができます。

※今回、約60分のwavァイルの書き出しにつき30分ぐらいかかりました。

# 11. 感想
複数人での打ち合わせで、かつ、人によって声の大きさや特徴も違う(録音音声データ自体が良いものではない)ため、正直そんなには期待をしていませんでした。
結論的には、句読点や改行がないため読みづらいものの、内容を知っている人間であれば読み解くことは可能ぐらいの精度結果となりました。
一目で何を言っているか分かる！ほどではないですが、実際、**初めから録音データを聴き直さなくても一目である程度の文脈が分かる**わけで結構役にたったりしました！

AWSやMSにも同じようなサービスがあると思うので、今後機会があればそちらも試してみたいと思います。

# 参考
https://qiita.com/kokky/items/659bde4cdc8ce5c78e29
https://qiita.com/hanlio/items/875b91e0d4931a57e86b