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

## 動機

最近 [Tsundokanai Radio • A podcast on Anchor](https://anchor.fm/dokanai) というポッドキャストを始めたんだが「あの話どこでしたっけ？」と調べることがあった。聴き直すのは大変なので、なんとか楽できんかなー？そうだ、テキスト化すればええんや。

--- 

## Cloud Speech-to-Text

愛するAWSのサービスでは日本語未対応なので、同じく愛するGCPのを使うことにした。

[Cloud Speech-to-Text - 音声認識  |  Cloud Speech-to-Text  |  Google Cloud](https://cloud.google.com/speech-to-text/?hl=ja)

---

## お値段

[Cloud Speech-to-Text - 音声認識  |  Cloud Speech-to-Text  |  Google Cloud](https://cloud.google.com/speech-to-text/?hl=ja&utm_source=google&utm_medium=cpc&utm_campaign=japac-JP-all-ja-dr-bkws-all-super-trial-e-dr-1003987&utm_content=text-ad-none-none-DEV_c-CRE_205812820475-ADGP_Hybrid+%7C+AW+SEM+%7C+BKWS+~+T1+%7C+BMM+%7C+ML+%7C+1:1+%7C+JP+%7C+ja+%7C+Speech+%7C+google+speech+api+%7C+en-KWID_43700037081438526-kwd-44517982592&userloc_1009370&utm_term=KW_%2Bgoogle%20%2Bspeech%20%2Bapi&&gclid=CjwKCAjw8ZHsBRA6EiwA7hw_sbNTMywQAQxzAAmbGHYNaS2IiRhKTOopQZRz6g3CGQIPQQVAPDD76RoCt1sQAvD_BwE)

最初の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](https://github.com/googleapis/google-cloud-ruby/tree/master/google-cloud-speech)


---

## 準備

[ベスト プラクティス  |  Cloud Speech-to-Text ドキュメント  |  Google Cloud](https://cloud.google.com/speech-to-text/docs/best-practices?hl=ja)

にあるとおり、フォーマット: **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](https://github.com/PhalanXware/dokanai)

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