動機
最近 Tsundokanai Radio • A podcast on Anchor というポッドキャストを始めたんだが「あの話どこでしたっけ?」と調べることがあった。聴き直すのは大変なので、なんとか楽できんかなー?そうだ、テキスト化すればええんや。
Cloud Speech-to-Text
愛するAWSのサービスでは日本語未対応なので、同じく愛するGCPのを使うことにした。
Cloud Speech-to-Text - 音声認識 | Cloud Speech-to-Text | Google Cloud
お値段
Cloud Speech-to-Text - 音声認識 | Cloud Speech-to-Text | Google Cloud
最初の60分無料、後は $0.006/15秒、
1分 $0.024、1時間 $1.44
お値段 with データロギング
データロギングを有効にすると、Cloud Speech-to-Text に送信された音声データを Google が記録するのを許可したことになります。このデータは、Google が音声文字変換に使用する機械学習モデルの改善のために利用されます。そのため、データロギングを有効にした場合の Cloud Speech-to-Text の料金は割安に設定されています。
こっちは最初の60分無料、後 は $0.004/15秒、
1分 $0.016、1時間 $0.96、1時間100円ぐらいだな
GEM
ベータ版ながらGEMもある。
google-cloud-ruby/google-cloud-speech at master · googleapis/google-cloud-ruby
準備
ベスト プラクティス | Cloud Speech-to-Text ドキュメント | Google Cloud
にあるとおり、フォーマット: FLAC サンプリングレート 16,000 Hz で音声を準備する
音声をどこからもってくるか
1. 収録データからもってくる
homebrew あたりでffmpegをインストールして
ffmpeg in.aif -ab 160k -ac 1 -ar 16000 -vn own.flac
ab: ビットレート、ac: 音声チャンネル、ar: サンプリングレート、vn: ビデオなし
2.1. skypeの録音からもってくる
skype公式録画をダウンロード、まずffprobeでチャンネル番号を調べる
ffprobe Video.mp4
-略-
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 16000 Hz, mono, fltp, 69 kb/s (default)
-略-
2.2. skypeの録音からもってくる
調べたチャンネルをinputに指定してflac作成
ffmpeg -i Video.mp4 -map 0:1 -ab 160k -ac 1 -ar 16000 -vn own.flac
ab 、 ac 、 ar 、vn は同じ、map で調べたチャンネル番号を指定
音声ファイルアップロード
GCPのストレージでバケットを作成し、そこに配置。
方式
- ストリーミング文字起こし
- 音声データを投げて結果を得るREST方式
- ファイルを指定してのREST方式 ← 今回はこれ
コード
require "google/cloud/speech"
speech_client = Google::Cloud::Speech.new
language_code = 'ja-JP'
encoding = :FLAC
config = {
language_code: language_code,
enable_word_time_offsets: true ←時間オフセットもくれ
encoding: encoding
}
audio = { uri: 'gs://bucket/own.flac' }
コード(2)
operation = speech_client.long_running_recognize(config, audio) do |op|
# ブロックに認識結果取得後の動作を書いておく
puts op.results.to_json
end
operation.wait_until_done!
実行結果
"results": [{
"alternatives": [{
"transcript": "一回積んどかないラジを始めますよろしくお願いします",
"confidence": 0.94464016, ← 信頼度
"words": [{
"startTime": "0s", ← 開始時間オフセット (単位100ミリ秒)
"endTime": "0.300000000s", ← 終了オフセット (0.3 x 100 で 30ミリ秒?)
"word": "一|イッ"},
まぁできたけど、話者識別してほしい
ベータ版にはある >
話者ダイアライゼーションベータ版
会話におけるそれぞれの発話が、どちらの話者によるものなのかを自動予測できるようになりました。
やってみる
require "google/cloud/speech/v1p1beta1"
speech_client = Google::Cloud::Speech.new(version: :V1p1beta1)
config = { enable_speaker_diarization: true, ... }
やってみたけどやっぱいまいち
識別できてない。
たぶんラジオ用に音量やノイズなど、話すタイミング、呼吸など、だいぶ正規化してしまっているのでよくない。(普通の録音において0.5秒以上、無音時間があることなんてないやろ)
チャットみたいな表示させたいよお
そうだ、ゲストはゲスト、俺のは俺で認識して、音声オフセットでソートすればいけるんじゃね?
やってみた。 > いけそうたけど、チャットみたいに表示するのはけっこうがんばらないといけない。
チャットみたいな表示させたいよお(2)
A「本日は」B「おう」A「晴天なり」B「いいですね」
↓
A「本日は晴天なり」B「おういいですね」
短文ならいいがこれがやや長文で発生するとマジで意味がわからん会話になる。
まぁ真面目にガッチャンコすればできるかも
使ってみた結果 -> PhalanXware/dokanai
ご清聴ありがとうございました。