Google Cloud Speech to Textで市議会の動画の内容を文字起こしをしてみた

地域活性化を目指して、市議会の動画から文字起こしに挑戦しています。
やっている理由は、議事録として公開されるまでに２ヶ月以上かかっていて、動画を見ないと何を話しているのかわからない事があるからです。

文字起こしを始めた当初はGoogleドキュメントの音声からの文字起こしを使っていました。
ただ他人数の会話の場合は、話す人が変わるたびに音声入力を停止・再開したりしないと、認識できなくなり、数十分くらい文字起こししないまま進んでしまう問題がありました。

ほったらかしてもいいような楽をしたい。
日本語の文字起こしができて、辞書登録みたいなのができる。
こんな条件のを探して「Google Cloud Speech to Text」を選びました。

---

### 成果物

Githubリポジトリ
~~https://github.com/acronhub/speech-to-text~~
https://github.com/acronhub/gcp-speech-to-text-responder

--- 

# Google Cloud Speech to Text について

* 60分/月 の無料枠
* $0.006/15秒(データロギングなし)
 * $1.44/1時間
* $0.004/15秒(データロギングあり)
* １分を超える音声ファイルからの文字起こしはストレージにファイルをアップロードする

※今回、自分が試している音声は議事録動画から取得しているため利用ガイド上、外部への記録を許可できないためロギングなしでおこなっています。

### データロギング

> データロギングを有効にすると、Speech-to-Text に送信された音声データを Google が記録するのを許可したことになります。このデータは、Google が音声文字変換に使用する機械学習モデルの改善のために利用されます。そのため、データロギングを有効にした場合の Speech-to-Text の料金は割安に設定されています。

# 実装方法

## 1)サービスアカウントキーの取得
Cloud Console で、[IAMと管理 > サービス アカウント] ページに移動します。
画面上部にある [サービスアカウントを作成] を選択します。
![スクリーンショット 2020-07-27 0.30.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/3fd02eb2-9d61-79da-42c6-5d7c4597704b.png)
1. [サービス アカウント名] フィールドに名前を入力します。
2. [作成] をクリックします。
3. [ロール] **ストレージ管理者** を選択してください。
4. [続行] をクリックします。
5. [完了] をクリックします。

サービスアカウント画面に戻ります。
![スクリーンショット 2020-07-27 17.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/f00c9cd0-3454-6a9e-1eae-7bb6fbcc57c0.png)
1. リスト画面の左側にある [操作] から[鍵の作成]を選択します。
2. キーが含まれている JSON ファイルがパソコンにダウンロードされます。

## 2)ストレージにバケットの作成
Cloud Console で、[Storage > ブラウザ] ページに移動します。
画面上部にある [バケットを作成] を選択します。
![スクリーンショット 2020-07-27 0.32.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/8c384b6c-f530-7a34-a69e-fd9ec7b8e7ef.png)
1. 任意のバケット名で作成します。


## 3)APIの有効化
Cloud Console で、[APIとサービス > ライブラリ] ページに移動します。
検索窓に [speech] と入力すると候補がでます。
[Cloud Speech-to-Text API]を選択します。
![スクリーンショット 2020-07-27 0.25.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/9439a2e6-fe55-da9c-950f-0bccb688617c.png)
1. [APIを有効化]をクリックします。

## 4)リポジトリのクローン

```bash
$ git clone git@github.com:acronhub/gcp-speech-to-text-responder
```

## 5)設定

```bash
$ cd gcp-speech-to-text-responder
$ vim routes.py
```

```vim:routes.py
GCS_BUCKET_NAME = '<ストレージのバケット名>'
SELECTED_PHRASES = [
　　{"phrases": ["例"], "boost": 10} <- 文字起こしのヒントになる文字
]
```
※単語で、boost値を20に近づけると、かなりの誤変換が起きました
※人名・地名など、確実な単語に利用すると良さそうです
※また漢字だと読みがわからない場合があり、利用されないことがありました

## 6)Docker-Compose起動

```bash
$ docker-compose up -d
※カレントフォルダが「speech-to-textフォルダ」になっていること
```

## 7)文字起こしするファイルを配置
```bash
gcp-speech-to-text-responder/data/input_file
このフォルダに動画・音声ファイルを配置してください
```

## 8)ブラウザでアクセス
http://localhost:5000
![スクリーンショット 2020-07-28 3.27.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/beb6d954-4d2c-db69-5482-06d5a2d62a50.png)
**音声ファイルをFLACファイルに変換**

- ローカルの音声ファイルをFLACファイルに変換します

**FLAC音声ファイルをストレージにアップロード**

- ローカルのFLAC音声ファイルをGCSにアップロードします

**音声ファイルから文字起こし**

1. ストレージのファイルを選択します
2. ヘルツ・音声チャネルを選択します

**完了**

- ローカルの出力フォルダ(デフォルト設定: data/output_text/)に音声テキストファイルができます


# 感想

文字起こしに利用する音声ファイルを今回はFLACファイルにしました。
WAVファイルなども試してみましたが、FLACファイルの方が誤変換が少ないように感じます。

また日本語の文字起こしの精度ですが１時間以上の音声ファイルを利用しました。
無料にはならず１時間だと１４４円かかります。
誤変換の割合がどれくらいだったか正確な把握はできていませんが、体感だと６割できていたらいい方だと思います。
※音声適正ブーストのチューニングと音声ファイルでかなり精度が変わってくるとは思います。

議事録は１時間から３時間と長時間の動画になるため、文字起こしのツールを利用したほうが楽なのは間違いないので、今後も利用してチューニングしていきたいと思います。

最後に、誰かのお役にたてば嬉しいです。

# 追記（8/8）

Flaskで作成していましたが、非同期ができないため大きめのファイルをアップロードしたときにブラウザが待ち状態になっていました。
再読み込みとかすると変換ファイルが無駄になってしまっていたため、非同期で動作できる「responder」に変更しました。
またファイルアップロードしなくてもいいところが多数あったため、そこも修正しました。
今は進捗経過が見れるようにするための対応を盛り込んでいます。


# 関連する記事

[Speech-to-Text ドキュメント](https://cloud.google.com/speech-to-text/docs?hl=ja)
[Speech-to-Text ベスト プラクティス](https://cloud.google.com/speech-to-text/docs/best-practices?hl=ja)