[ GCP ] 自分の声を録音して自動で文字に起こしてみる( Cloud Speech-to-Text API )

本記事ではGCPでAPIとして提供されている Cloud Speech-to-Text サービスを使用して、音声データから文字起こしを行なってみたいと思います。

今回はテスト音声として自分の声を録音し、それをどのくらいの精度で文字にしてくれるのかを確認してみます。

この記事ではAPIを実際に使用するまでに必要な手順をまとめていますが、音声データとそれに対する文字起こしの結果だけをご覧になる方は、見出し [ 8. 結果を確認する]にお飛びください。


なおこの記事の内容は、私の個人サイトからの転載です。個人サイトの方では実際の音声データも埋め込んでいますので、よろしければそちらもご覧ください。

http://wild-data-chase.com/index.php/2019/02/27/post-547/


# GCPって何？
GCP とは Google Cloud Platform の略称で、Googleから提供されているパブリック・クラウドサービスを指します。下記個人サイト記事で説明してみたので、よければご覧ください。
http://wild-data-chase.com/index.php/2019/02/18/post-409/


# Cloud Speech-toText API って何？
Cloud Speech-to-Text とは、機械学習の機能を使用して音声からテキストデータを生成するGoogleのサービスです。対応言語は多岐に渡り、音声データの時間も短時間用の機能から長時間用の機能まで取り揃えられています。APIを使用することで、個人の目的にも使用することができます ( お金はかかりますが )。

詳しくは、下記のURL先の情報をご覧ください。

https://cloud.google.com/speech-to-text/?hl=ja

# 実践
## 1. APIを有効にする
まずは Cloud Speech-toText API を有効化しましょう。

a. GCPコンソールのメニューから[ APIとサービス ]を選択し、[ ライブラリ ]をクリックします。
<img width="402" alt="スクリーンショット 2019-02-27 13.37.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/184568/3e2140e2-32b4-f2ad-9080-df5c898d1b99.png">



b.  ライブラリの検査画面で、[ Speech ] を入力するといくつかAPIが出てくるので、その中から[ Cloud Speech-to-Text API ] を選択します。
<img width="274" alt="スクリーンショット 2019-02-27 13.39.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/184568/fe45ac4c-e340-b269-37f0-dba3d70e8be9.png">



c. APIの画面に飛ぶので、「有効化」をクリックすれば設定は完了です。
(写真は有効化済みのものです。)
<img width="974" alt="スクリーンショット 2019-02-27 13.41.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/184568/2aa98239-b104-5c24-3fe1-f93798613764.png">



## 2. アカウントキーを取得し、キーファイルへのパスを通す
次にサービスアカウントキーを取得し、ファイルへのパスを通します。

a. GCPコンソールのメニューから[ APIとサービス ]を選択し、[ 認証情報]をクリックします。




b.  [ 認証情報を作成 ] のプルダウンをクリックし、[ サービスアカウントキー ] を選択します。



c.  役割を Project-編集者 に設定し、キーのタイプが JSON になっていることを確認して[ 作成 ] を押します。作成されると、キーファイルがダウンロードされます。
<img width="891" alt="スクリーンショット 2019-02-27 13.48.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/184568/9119dc8a-475f-c9e1-0920-c73a95c45d62.png">



d. ローカルPCで、ダウンロードしたキーファイルへパスを通します。

```
export GOOGLE_APPLICATION_CREDENTIALS="[ キーファイルのPATH ]"
```


## 3. Cloud SDK をインストールする。
ローカルPCでgcloudコマンドを使用する為に、Cloud SDK をインストールします。すでにインストールされている場合はスキップします。

Cloud SDK のインストールについては、下記URL先の公式ホームページの手順を参照ください。

https://cloud.google.com/sdk/docs/

## 4. 音声データを用意する
音声データを作成することがあまりないので、ここも手順化します。今回はmacで自分の声を録音するという前提で進めていきます。

mac で録音を行うことができるアプリは QuickTimePlayer です。これはデフォルトでmacにインストールされているので、今回はこれを使用します。

### 4-1. 録音する(mac)
a. QuickTimePlayer を開き、[ ファイル ] メニューの [ 新規オーディオ収録 ] を選択します。

<img width="475" alt="スクリーンショット 2019-02-27 13.55.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/184568/a8445014-dfd6-6e41-7aa4-16165e21b054.png">




b.  収録画面に飛ぶので、録音ボタンを押して収録します。作成したファイルはm4a形式で保存されます。ちなみに今回の方式では１分以上の音声データを変換できないので、音声データはそれ以内の時間に収まるようにします。長時間用の変換についても行うことができますが、本記事では触れていません。



### 4-2. FLAC形式に変換する
今回使用するAPIは m4a 形式に対応していないので、対応しているFLAC形式に変換します。今回変換にはwebサービスを利用します。

a. 次のURLにとび、[ AudioConverter ] メニューの [ convert to FLAC ] を選択します。

https://audio.online-convert.com/

<img width="360" alt="スクリーンショット 2019-02-27 14.00.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/184568/0887652b-69e0-4be8-7603-d1b8e60a5ac0.png">




b. 録音データをドロップして、コンバート設定を編集します。コンバート設定では、
「サンプルレートを16000」に、
「チャンネルをモノラル(mono)」に
します。設定を終えたら [ Start conversion ] を選択し、変換ファイルをダウンロードします。
<img width="567" alt="スクリーンショット 2019-02-27 14.00.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/184568/5d69a971-e5a7-bd89-a292-9bc4a02c5f4b.png">




## 5. ファイルを Cloud Storage に保存する。
次に、作成したファイルをGCPのストレージに保存します。

a. GCPコンソールのメニューから[ Storage ]を選択し、[ ブラウザ ]をクリックします。

<img width="417" alt="スクリーンショット 2019-02-27 14.07.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/184568/8e541c2c-835f-a5b5-23a5-245fefc8daaf.png">




b. [ バケットを作成 ] を押下し、バケットの設定をしてバケットを作成します。今回はテスト用なので、設定は画像のような設定(Coldline = ほとんど使用しないデータ)で大丈夫です。

<img width="548" alt="スクリーンショット 2019-02-27 14.11.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/184568/45a2e145-040d-fd7d-d1ea-e357b214e288.png">


  

c. 作成したバケットに録音データをドロップすれば、データの準備は完了です。



## 6.  リクエスト用のファイルを作成する
ここまできたら、あとはAPIへのリクエスト準備だけです！

次のような内容のjsonファイルを作成します。ここでのファイル名は [ sync-request.json ] とします。(なんでも良いのですが)

```
{
  "config":{
    "encoding":"FLAC",
    "sampleRateHertz":16000,
    "languageCode":"ja-JP"
  },
  "audio":{
    "uri":"gs://speech-test20190227/test/Henshin.flac"
  }
}
```

- encoding
音声ファイルのデータ形式を指定します。今回はFLACを使用しています。MP3やMP4は使用できません。
- sampleRateHertz
音声のサンプルレートを指定します。
- languageCode
対象音声の言語を指定します。日本語であれば ja-JP 、英語であれば en-US などを指定します。
- uri
音声データの保存場所を指定します。今回はGCPのStorageを使用しているので、 "gs://" を先頭につけて先ほど作成したバケットの位置と格納したファイルの名前を記載してください。
7. Speech-to-Text API にリクエストを送信する
最後に、作成したjsonファイルを用いてAPIにリクエストを送ります。コマンドは次の通りです。
コマンドは、先ほど作成したjsonファイルと同じ階層で実行します。

``` 
curl -s -H "Content-Type: application/json" \
     -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
     https://speech.googleapis.com/v1/speech:recognize \
     -d @sync-request2.json
```

- curl
HTTPアクセスをしてコンテンツを取得できるコマンドです。以下のようなオプションを設定できます。
- -s  : ダウンロードの進捗とエラーメッセージを表示しない。
- -H : リクエストヘッダを追加する。POSTのフォーマットがJSONの場合は -H "Content-Type: application/json" という指定をする
- gcloud auth application-default print-access-token ( ※非curlオプション )
: gcloud コマンドにより通したパスから認証トークンを取得する。
- -d : POSTする本体を指定するオプションで、その後の@以降が送信データになる。


※curlコマンド参考
https://hydrocul.github.io/wiki/commands/curl.html

## 8. 結果を確認する
API へのリクエストを行うと、そのレスポンスの中に文字起こしされたテキストが入っています。

今回用意した音声データでは、フランツ・カフカの『変身』の冒頭を読んでみました。


そのデータに対して、APIが文字に起こしてくれたデータ(レスポンス)がこちらです。

``` 
{
  "results": [
    {
      "alternatives": [
        {
          "transcript": "ある朝グレゴールザムザが気がかりな夢から目覚めた時自分がベットの上で一匹の巨大な毒虫に変わってしまっているのに気づいた",
          "confidence": 0.9376586
        }
      ]
    }
  ]
}
```

レスポンスはjson形式で返却されます。transcript が起こされたテキストデータで、confidence は単語レベルでの信頼度を示してくれています。
今回は、一字一句、間違えずに翻訳してくれています...すごい...。

句読点などは起こしてくれないので商業利用する時などはもう一つ編集の手間が必要ですが、それにしても便利なAPIであることは間違い無いですね！



ちなみにもう少し長い文章でも試してみました。夏目漱石の『草枕』の冒頭を朗読し、音声データを投げてみました。



``` 
{
  "results": [
    {
      "alternatives": [
        {
          "transcript": "山道を登りながらこう考えた智に働けば角が立つ情に棹させば流される意地を通せば窮屈だ",
          "confidence": 0.9540678
        }
      ]
    },
    {
      "alternatives": [
        {
          "transcript": "とかくに人の世は住みにくい",
          "confidence": 0.9295728
        }
      ]
    },
    {
      "alternatives": [
        {
          "transcript": "住みにくさが高じると安い所へ行きこしたくなるどこへ越しても住みにくいと悟った時詩が生れて絵ができる人のよう作ったものは神でもなければ鬼でもない",
          "confidence": 0.93297905
        }
      ]
    },
    {
      "alternatives": [
        {
          "transcript": "やはり向こう三軒両隣にチラチラするただの人であるただの人が作った人の世は住みにくいからとて越す国はあるまいあれば人でなしの国へ行くばかりだ",
          "confidence": 0.94112563
        }
      ]
    },
    {
      "alternatives": [
        {
          "transcript": "人でなしの国は人の世よりもなお隅肉過労",
          "confidence": 0.89679825
        }
      ]
    }
  ]
}
``` 

概ね良かったのに、最後...隅肉過労...。

# まとめ
GCP で提供されている Cloud Speech-to-Text API を使用することで、音声データの文字起こしができる。
音声から生成されるテキストの精度は高く、実用に十分耐え得る。


以上です。ここまでご覧いただき、ありがとうございました。

下記サイトでも細々投稿しているので、よろしければ足をお運びください！
http://wild-data-chase.com/



# 参考
https://cloud.google.com/speech-to-text/docs/basics?hl=ja

https://cloud.google.com/speech-to-text/docs/quickstart-protocol?_ga=2.193739949.-1297467846.1550208871

https://blog.apar.jp/web/8971/

https://www.magellanic-clouds.com/blocks/guide/create-gcp-service-account-key/

https://qiita.com/knyrc/items/7aab521edfc9bfb06625