GCPのCloud Speech-to-Textを使ってYouTubeの動画の文字起こしをする

YouTubeの動画を文字に起こしたい。
[GCPのCloud Speech-to-Text](https://cloud.google.com/speech-to-text/?hl=ja)を使えば、長い動画でも文字起こしができる。

もちろん、YouTubeの音声に限らず、他の音声ファイルでもいけるはず。

# 使ったもの
- Google cloud speech to text
- ffmpeg


# 注意

有料です。60分の無料枠を超えると15秒ごとに音声処理の料金が発生します。
料金は[こちらのページ](https://cloud.google.com/speech-to-text/?hl=ja)を参照してください。

# 手順

## YouTubeの動画を音声のみダウンロード

[こちらのサイト](https://www.y2mate.com/jp/youtube-to-mp3)で動画の音声のみダウンロードできました。
広告モリモリで怪しいサイトですが、ちゃんとダウンロードできました。

ダウンロードしたファイルを `sample_audio.mp3` としましょう。

今回はプロブロガーイケハヤことイケダハヤトさんの[【理由も解説】世界一の投資家・バフェットの朝食はマックのハンバーガー。](https://www.youtube.com/watch?v=JNAJuJUktRU)をチョイスしました。

理由としてはこんなかんじです。

- 話者が一人
- 話すスピードが早すぎない
- 収録環境が整っていて（ハンドマイク使用）、ノイズや騒音が少ない
- BGMやサウンドエフェクトがない
- 長すぎない

複数の人が同時に話したり、周囲の騒音がある動画は精度が出なさそうなので、まずは手始めにこの動画から。

## mp3からflacへ変換する

[こちらのページ](https://cloud.google.com/speech-to-text/docs/encoding)にもある通りCloud Speech-to-Textは2019年11月現在、mp3をサポートしていないようなので、flacに変換する必要があります。

`ffmpeg` を使うと簡単に変換できます。

```shell
ffmpeg -i sample_audio.mp3 -ar 16000 -ac 1 sample_audio.flac
```

`-ar` はサンプリング周波数です。こちらの[クイックスタートの例](https://cloud.google.com/speech-to-text/docs/quickstart-client-libraries?hl=ja)に合わせて16,000Hzに設定します。
`-ac` はチャンネル数です。モノラル(=1)にしていないとエラーになりました。

コマンドを実行すると`sample_audio.flac` というファイルが作成されます。

## Cloud storageにアップロードする

ローカルからでも文字起こしできるそうですが、今回はCloud storage上のファイルを対象にします。
適当なバケットを作成し、Cloud SDKをインストールしている場合は下記のコマンドでアップロード。

```shell
gsutil cp sample_audio.flac gs://[YOUR BACKET]
```
容量が小さいファイルであればブラウザからアップロードしても大丈夫です。

## 文字起こし

ほとんど公式のドキュメントの関数そのままです。

```python:transcribe.py
def transcribe_gcs(gcs_uri):
    print(f'Processing {gcs_uri}')
    client = speech.SpeechClient()

    audio = types.RecognitionAudio(uri=gcs_uri)
    config = types.RecognitionConfig(
        encoding=enums.RecognitionConfig.AudioEncoding.FLAC,
        sample_rate_hertz=16000,
        language_code='ja-JP')

    operation = client.long_running_recognize(config, audio)
    print('Waiting for operation to complete...')
    response = operation.result()
    text = ''.join([result.alternatives[0].transcript for result in response.results])
    return text
```

全文が文字起こしされて返ってくるので、あとはtextファイルにするなり、csvファイルにするなりお好きにどうぞ。

# 結果

数分の動画であればすぐに文字起こしが完了します。先ほどのイケハヤさんの動画は4分08秒の動画ですが2分くらいで完了しました。文字起こしした結果全文がこちら。(長いので折りたたんでいます)

<details><summary>文字起こし結果全文</summary><div>

>はい今日は IKEA です今日は大富豪のパンフレットはマクドナルドにめっちゃ行くとか言うね知られた事実を話したいと思います僕ねあの一応1000ミリ対応したということでねまあなんだと今結構のんびり暮らしています183デートに1億円ぐらい突破したということでねまその頑張って働かなくても大丈夫という状況になりましたそこですね先日ね回転寿司に行ったんですよねでそれをツイッターにアップしたところは例によってくそ米が届きましたどんなクソコメかと言うとね子さんが1億円もあるのに回転寿司に行くなんて絶対恋と嘘ついてると言うね今日もかっこ笑いみたいな感じの約束をメガネキッズでしょうかね中学生ぐらいからから届きましたまあおいおいという感じで回転寿司は行きますよ回転寿司は行くよよめちゃくちゃ行きますよね普通ねもうめちゃくちゃ行きますよ家に子供3人いるんでやばい回転寿司はいいんですよねあれはねまあ確かにねそんなに美味しくないと言ったのは非常に申し訳なくてママも頑張ってるなというくらいでもめっちゃうまい涙が出ごとうまいって感じじゃないですがいっぱいで子供連れで行くにはすごくいいねえんための設備なんですよねなんでそういうような回転寿司は行くんですよねえーまたカウンター寿司行きたいですね一人ね2万円ぐらいの寿司お値打ちの妻と二人で行ってねというのがすごい有名なんですがなかなかね子供さんに入ると難しいなという感じでは本当に夢だなという感じの状況なわけでございますがまぁそれは別にどうでもいいですねだいふおめえバフェットもうほんと世界でトップの不幸ですねこの人の朝食皆さん知ってますかこれねバフェットさんのドキュメンタリーで取り上げられて結構世界的に話題になったんですがなんとねマクドナルドなんですよねすごいですねものすごい子さん持ってる人だけどこの人に朝食は Mac なんですよすごいですね本当にこの前に朝マックらしいですよ凄いですびっくりしましたねし左側がなんと8から9兆円ぐらい持ってるということで夫婦8から9兆円あるけどマックってすごいですよねこれなかなかインパクトあって面白いなって感じしますよねこうちゃんなんでねこのレバーセット3でめっちゃお金持ってんのねまくって向かってるとねやっぱりねそれを食べることは合理的なんでしょうねそうじゃないと食べないですか何だこれを食べる事はきっとね彼にとって合理性があるんでしょうねでも猫マックなんて健康に悪いじゃないかっていうふうに思う人多いですよね僕も思いましたでもねあのバケットさん年齢調べてた88歳でしたバリバリ現役やばいですよね家も健康だよなーって感じがするんだよマックが健康に悪いとしてもとりあえずそれでも88歳までバリバリ現役で行けるんだったら別にいいんじゃねって感じがしてきますよねやっぱりねマックを食べるとこ多分ねこの人って週間になってるんでしょうね皆さん道場が朝食に迷ってこと結構してたりしませんかまうちもね子供金いるんでねやっぱりいつも同じ朝食って言うから甲ひびねこ朝食を考えて猫今日はジャズにしようかとか今日はパンにしようかと考えるんですけどあれ結構ね面倒ですよねそういうのってすごくね僕はに愚かだなと思っちゃうんですよねまあね楽しいんですけどねでも楽しいけど大変じゃないかなもう一枚を取ってねそういうところと迷わないようにするってものすごく重要なのかなと思います朝ごはんてないねまぁ所詮で朝ごはんなんですね多分バフェットさんもそう考えて行って真っ暗から世界中どこでも食べられるしまあそれ迷わずねもうとりあえずマックでって言っても非常に注文したら持ってきてくれたそれが一番いいじゃないですかって話なんだと思いますねでこの同じ話やねスティーブジョブズもそうですねスティーブジョブズを毎日同じ服を着ていたという風に言われまして実際に写真残ってんのね光輝の写真はもずっとの同じタートルネックを着てるわけですねあれもいっぱいで迷わないためなんだと思います迷わないためにでも今日どの服を着るかっての家じゃねえすかあり日本と僕嫌いなので僕もねいつも同じ服を着ていますやっぱり迷うのがやなんですが本当にね今日どの服を着ようかってあれほんと時間の無駄だと僕はねあの服嫌いな服嫌いの人間としたねすごくねあの嫌なんですねって言う感じでねやっぱそういうような習慣をつくってのは凄く重要なんだなと思いますなのでねバフェット3で8から9兆円ね持っててね来れるんだよなんでマック食べてすごく疑問だと思われますかまそういう所ってのはきっとね彼にとって週間なっているそういう余計な意志力を使わないためにねこうやってマックを食べていてでそのね自分のあ待って白くてもしかり子でいろんな意思決定に使っていてだからこそこうやってね億万長者になったという感じのことを理解できるといいのかなと思います影響はまそんな感じでねマックスお米から始まりね回転寿司は行きますよ回転寿司は普通に行くよという話から始めてバフェットさんの話落とし込んでみました引き続き毎日更新で頑張ってね楽しい話を提供していこうと思いますまあちゃんねと6000型ポチとお願いいたしますご清聴ありがとうございました
</div></details>

冒頭の**「はい今日は IKEA です」**がいきなり残念ですが、「あのー」などの話し言葉も起こされてます。なかなかの精度ですが、その後もやはり固有名詞は弱い。仕方ないですね。

ただ、自分で音声を聞きながら全文タイピングすると思ったら骨が折れるのでこれだけでも非常にありがたいですね。だって2分でこのレベルの文章が自動で作成されるんやで！？

# その後

このあと、1時間40分の動画を文字起こししてみました。20分ほどかかりましたが、きちんと全文、文字起こしされていました。なかなか優秀です。
YouTubeで特定の人の動画をどんどん文字起こしして自然言語処理のデータソースにできるかもしれない。

以上

# 参考文献
役に立つ情報をありがとうございます。

- [Google Cloud Speech API を使った音声の文字起こし手順](https://qiita.com/knyrc/items/7aab521edfc9bfb06625)
- [gcloudコマンドでGoogle Speech APIを使って再生時間の長い音声の文字起こしを行う](https://qiita.com/uni-3/items/2b9bd66b285c908a833b)