Google Cloud Speech API+Rubyで音声ファイルを文字起こししてみるテスト

Google Cloud Speech APIの文字起こし精度が結構高いという話を聞いたのでRubyAPIを叩いて試すところまでやってみた。

流れとしては、

  • サービスの有効化
  • GCPでサービスアカウントキーを取得
  • 音声ファイルの作成
  • ストレージに音声ファイルをアップロード
  • APIを叩く

という感じ。

APIを叩くのはライブラリを使えばいいだけなので簡単だが、音声ファイルの作成には少し注意が必要だった。その辺含めてメモ。

サービスの有効化

まずはSpeech APIを利用できるようにしないといけない。

このクイックスタートのプロジェクトを設定するというセクションまでやっておく

GCPでサービスアカウントキーを取得

APIを叩くのにアカウント認証用のjsonファイルが必要。

Google Cloud Platform のサービスアカウントキーを作成するとか見て、キーを作成する。与える権限はSpeech APIの利用だけでいいけど、サーバにアップしたりしないならは全リソースへのアクセス権つきのキーを作成したら今後の手間が省けて楽かも。

音声ファイルの作成

音声コーデックはFLACがいいとのことだったのでFLACを使う。

自分は普段録音してる声優ラジオのmp4ファイルの音源を使いたかったのでffmpegで抽出作業をした。

  • mp4 to m4a
ffmpeg -i minaseinori_radio.mp4 -acodec copy tmp.m4a
  • m4a to wav
ffmpeg -i tmp.m4a -acodec copy tmp.wav
ffmpeg -i tmp.wav -vn -ar 44100 -ac 2 -acodec flac -f flac tmp.flac
ffmpeg -i tmp.flac -ac 1 output.flac

Speech APIに投げる音声ファイルのチャンネルは単一にしないといけないらしいので、-ac 1で一つに変換する。

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

GCPのストレージに作成した音声ファイルをアップロードする。このストレージのオブジェクトのurlを後ほど利用する。

APIを叩く

ライブラリのインストール。

gem install google-cloud-speech

コードはこんな感じ。

一応同期変換のAPIは1分以下の音声ファイルしか扱えないので、今回は非同期変換のAPIを利用する。

require "google/cloud/speech"

SPEECH_PROJECT = "プロジェクトID"
SPEECH_KEYFILE = "サービスアカウントキーのjsonファイルのパス"

speech_client = Google::Cloud::Speech::V1.new
encoding = :FLAC
sample_rate_hertz = 44100
language_code = "ja-JP"
config = {
  encoding: encoding,
  sample_rate_hertz: sample_rate_hertz,
  language_code: language_code
}
uri = "gs://ストレージバケット名/output.flac"
audio = { uri: uri }

# Register a callback during the method call.
operation = speech_client.long_running_recognize(config, audio) do |op|
  raise op.results.message if op.error?
  op_results = op.results
  op_results.results.each do |resp|
    resp.alternatives.each do |alt|
      puts alt.transcript
    end
  end

  metadata = op.metadata
  puts metadata
end

# Or block until the operation completes, triggering callbacks on
# completion.
operation.wait_until_done!

ほんで、これが水瀬いのりのラジオ音源から1分ちょい切り出して実行してみた結果。

あの何も耳に書いたもんだから真現代病で猫を間違えた漢字覚えちゃってたってやって飛ぶってる神ではないんですねこれは飛ぶにちょい足し下に持ったとみたいと言う市から現れる羽が増えたかな羽も増えて頭も突き出た感じのと太い子を描かせていただきましたまあこれね実際問題2017年私とんだよねめっちゃと

精度としては7割くらいか。

スタッフの笑い声とかBGMとかは一応カットされてるみたいだけど、言い直しとか「あっ」とか「うーん」とかの言葉が誤変換の要因になってる感じがある。例えば、翻訳結果の真現代病の「真」は本当は「まぁ」だし。

全編を手直し無しで翻訳結果を使うのは無理っぽいけど、翻訳の第一フェーズを作成する用途とかだとありかもしれない。

ちなみにコストは音声の合計量で決まる。

0~60分は無料で、それ以上の翻訳時間になると$0.006 / 15 秒が課金される。

自分は普段聴いてる声優ラジオが月48時間分くらいあるので、すべて文字起こしにかけたら月8000円くらいかかる(((486060) / 15) * (0.006 * 110))。

すべてテキスト化してElasticSearchにでもぶっこめばラジオ内容のデータベースでも作れるかなと思ってたが翻訳精度や曲とかどうするの問題とかもあるし割と難しいか〜という気持ちになりました。