はじめに
音声データを自動的に文字起こしできたらとてもハッピーなはず、とのことでCloud Speech-to-Text APIを使ってみました。本記事はその際の備忘録です。
事前準備
Cloud Speech-to-Text APIを使うために以下を準備。
- GCP環境(Speech-to-Text APIを有効化しておく)
- Google Cloud SDK(今回は
gcloud
コマンド経由でAPIコールしたため)
やってみる
今回変換しようとした音声ファイルは1時間ちょっとあったので、非同期での変換を試みた。
https://cloud.google.com/speech-to-text/docs/async-recognize?hl=ja
Cloud Storageに音声ファイルを置いておき、そのパスを指定する形で以下コマンドでAPIをコールする。
$ gcloud ml speech recognize-long-running 'gs://<YOUR FILE PATH>' --language-code='ja-JP' --async --project <YOUR PROJECT ID>
Check operation [operations/<OPERATION ID>] for status.
{
"name": "<OPERATION ID>"
}
対応言語は以下のページで確認することができる。今回は日本語なので ja-JP
を指定。
https://cloud.google.com/speech-to-text/docs/languages
ちなみに、拡張子含め文字列は完全に一致している必要がある模様。拡張子の大文字小文字が違っても NOT FOUND
エラーとなった。
ERROR: (gcloud.ml.speech.recognize-long-running) NOT_FOUND: No such object: <YOUR BUCKET PATH>/<YOUR FILE NAME>.mp3
また、非可逆圧縮式であるMP3形式などは非推奨で、実際に音声認識させてみたところ、たしかに結果は散々だった。
そのため MP3
→ FLAC
への変換を行った。
Mac環境だったため、 homebrew
経由で sox
をインストール。
brew install lame
brew install sox
sox
を利用して FLAC
形式への変換を行った。(インプット音声はステレオではなくモノラルである必要があります)
sox input.mp3 --rate 16k --bits 16 --channels 1 output.flac
先程取得したOPERATION IDを使って、プロセスの進捗を確認することができる。
gcloud ml speech operations describe <OPERATION ID> --project <YOUR PROJECT ID>
また、処理が完了するまでポーリングさせることも可能。
gcloud ml speech operations wait <OPERATION ID> --project <YOUR PROJECT ID>
ただし処理が30分を超えるとポーリングは自動的に停止してしまうみたい。
ERROR: (gcloud.ml.speech.operations.wait) Operation https://speech.googleapis.com/v1/operations/<OPERATION ID> has not finished in 1800 seconds. The operations may still be underway remotely and may still succeed; use gcloud list and describe commands or https://console.developers.google.com/ to check resource state.
APIで取得した結果はJSON形式だが、文字起こしの結果だけをシンプルに取得するためにjqで以下のようにこねくり回した。
cat output.json | jq .response.results[].alternatives[].transcript > text.txt