英語音声をテキスト化して翻訳する方法

英語音声ファイルを [Google Speech-to-Text](https://cloud.google.com/speech-to-text/) を使ってテキスト化し、[Google スプレッドシート](https://docs.google.com/spreadsheets/create)で翻訳する方法を聞かれたので解説してみます。色々方法はありますが、ここでは、[Google Cloud Platform (GCP)](https://cloud.google.com) の Cloud Shell から、 gcloud コマンドを使った方法を説明します。

## 全体の流れのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42406/06ec945a-dcc5-1419-5cc3-c73ec2e42e6b.png)

## 手順
### mp3 を flac に変換
2020 年 2 月 29 日現在、Google Speech-to-Text が正式に対応しているフォーマットは、flac, wav になりますので、今回は、[online-convert.com](https://audio.online-convert.com/convert-to-flac) を使って、mp3 を flac に変換します。今回使うファイル `test.mp3` は 元同僚の会社が開催した Webinar の音声です。

- `test.mp3` を [online-convert.com](https://audio.online-convert.com/convert-to-flac) にアップロード

- 下記パラーメータを指定して、`test.mp3` を `test.flac` にコンバート

| Parameter | Value |
|:--------|:--------|
| Change bit resolution| 16 bit |
| Change sampling rate| 16000Hz |
| Change audio channels| mono |


### コンバートされた flac ファイルをダウンロード
自分のパソコン等に `test.flac` をダウンロードしておきます。

### GCP の初期設定

- [Cloud Console](https://console.cloud.google.com/) で Project を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42406/9c261fed-e108-f542-06fb-86e15144e67a.png)

- Cloud Speech-to-Text API を有効に（検索窓より、`Speech-to-Text`で検索）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42406/d6ab24d6-291b-b77b-a495-a26234badb9f.png)

### Google Cloud Storage（GCS）に、flac ファイルをアップロード 

- [GCS](https://console.cloud.google.com/storage/browser) でバケットを作成（フォルダのようなもの。今回は`0228-speech` というバケットを作成しました。）バケットを作成する際にいくつか聞かれますが、バケットの名前だけいれて、後は、続行 ➡️ 続行 ➡️ 続行 ➡️ 続行 ➡️ 作成で進めてください。

- `test.flac` ファイルをアップロード

### flac ファイルをテキスト化

- Cloud Console から、[Cloud Shell を有効にする] をクリックし、Cloud Shell を起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42406/3b8067fa-0a68-3174-0ac3-7ad567973e09.png)


- gcloud コマンドにより、`test.flac` ファイルをテキスト化します。

```bash
🟢コマンド: test.flac を text 化（バケット名、ファイル名は自分のものを使ってください）
gcloud ml speech recognize-long-running \
    'gs://0228-speech/test.flac' \
    --language-code='en-US' --async

ℹ️出力結果
Check operation [operations/8912459795353051547] for status.
{
  "name": "8912459795353051547" 📣この OPERATION_ID をコピーしておいてください
}

🟢コマンド: 進行状況チェック（OPERATION_ID は上のステップでコピーしたもの）
gcloud ml speech operations describe OPERATION_ID

ℹ️出力結果
{
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata",
    "lastUpdateTime": "2020-02-28T12:05:09.348366Z",
    "progressPercent": 28, 📣進捗率 28% ということ
    "startTime": "2020-02-28T11:43:58.633950Z"
  },
  "name": "8912459795353051547"
}

🟢コマンド: 翻訳作業が終わった後に、test.json ファイルを作成するように。（OPERATION_ID は上のステップでコピーしたもの）
gcloud ml speech operations wait OPERATION_ID > test.json

ℹ️出力結果
Waiting for operation [operations/OPERATION_ID] to complete....
```

- gcloud コマンドにより、`test.flac` ファイルを GCS に転送します。

```bash
🟢コマンド: test.json を Google Cloud Storage に転送
gsutil cp test.json gs://0228-speech/test.json

🟢コマンド: test.json を Google Cloud Storage で公開
gsutil acl ch -u AllUsers:R gs://0228-speech/test.json

ℹ️出力結果
Updated ACL on gs://0228-speech/test.json
```
- GCS で公開リンクをクリックし、URL をコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42406/05e8c035-09c9-1388-3e9a-c76d8c86c68f.png)


### GCS にアップロードされた JSON ファイルを Google スプレッドシートにパース
[How to import JSON data into Google Spreadsheets in less than 5 minutes](https://medium.com/@paulgambill/how-to-import-json-data-into-google-spreadsheets-in-less-than-5-minutes-a3fede1a014a) に簡潔な手順があるので、こちらを参考に JSON をパースします。

- [Google スプレッドシートを作成](https://docs.google.com/spreadsheets/create)
- ツール ➡️ スクリプト エディタ 
- 最初にあるコードをすべて削除し、[こちらの Script](https://gist.githubusercontent.com/paulgambill/cacd19da95a1421d3164/raw/047b04a1c321b697533adad5828e6df8748b5e54/import_json_appsscript.js) を上書き
- `ImportJSON.gs` という名前で保存
- Google スプレッドシートに戻り、ImportJSON を使い `test.json` ファイルをパース（URL に先程コピーした test.json の公開 URL を使います）
`=ImportJSON("https://storage.googleapis.com/0228-speech/test.json")` 
- このままだと、GCS 上のファイルを削除すると参照できなくなるので、一度コピーして、テキストだけをペーストするといいかもしれません。
- うまくパースできたら、[GOOGLETRANSLATE 関数](https://support.google.com/docs/answer/3093331?hl=ja)を使って、翻訳します。
`=GOOGLETRANSLATE(A1)`

- 完成イメージは、こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42406/10c91a33-952c-bea5-ecdb-b18e3555a689.png)


### GCS にアップロードしたファイルを削除
最後に、GCS にアップロードしたファイルを削除しておきます。まだ使うという方は残しておいても問題ありませんが、少々課金されますのでご注意を。

```bash
🟢コマンド: GCS に作成したバケットにあるファイルをすべて削除
gsutil -m rm gs://0228-speech/**
```

---
以上です。

ご意見、ご依頼等あれば、[Facebook](https://www.facebook.com/kkitase) | [Twitter](https://twitter.com/kkitase) までお願いします。