7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Google Cloud Speech-to-Text 使ってみた

Last updated at Posted at 2019-09-21
1 / 23

動機

最近 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

ご清聴ありがとうございました。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?