英語の動画を爆速で日本語テキストにする話(しかも無料で)

# 動機


教育系YouTubeチャンネル面白そうだけど長尺で見るのだり～～～～～～～～

だるくね？

# 手順

大まかな手順としては、

1. 文字起こししたい動画または音声ファイルを用意する
2. Whisperを使って文字起こしをする
3. 日本語でない場合はDeepL APIを使って和訳する

となる。

タイトルに「英語の動画を～」とつけたが、日本語音声を日本語に文字起こししたい場合は手順2でまでで済む。

# 1. 音源を準備する(動画サイトからDLしたい場合は後述)


文字起こししたい動画または音声を用意する。

なぜかあまり触れられていないが、様々なファイル形式に対応している。

- MP3
- MP4
- M4A
- WAVE

のファイル形式に対応していることは確認できた。

# 2. whisperで文字起こし

whisperとは、簡単に言えば**OpenAIがフリーで提供しているものすごく高精度な音声認識モデル**である。

YouTubeだと話者がきちんとした文法の言語を話している場合は自動翻訳でも何とかなるが、雑談配信などにおいて自動翻訳はあまり役に立たない。

しかし、whisperはかなりの精度で文字起こしをしてくれる。
しかも多言語対応であり、

- 英語音声→英語テキスト
- 日本語音声→日本語テキスト
- 日本語音声→英語テキスト

といった芸当までこなしてくれる。
が、現在は英語音声→日本語テキストには対応していないので、英語音声を日本語に文字起こししたい場合は手順3の通りDeepLを噛ませる必要がある。

whisperはGPUでの使用を前提としているが、一応CPUも対応している。
しかし、CPUに任せるくらいならGoogle Colabに処理を投げれば良いと思う。この辺も後述する。

## 2.1. スペックの高いPCを持っている人(目安：GPUを積んだデスクトップパソコン)

**自分のPCでwhisperを走らせよう。**

ここではAnacondaとPython3系を使用してwhisperを動かす方法を説明する。
Anacondaの環境構築についてはここでは省略する(いつか書きたいけれども)。

### 2.1.1 **PyTorchのインストール**

PyTorchとはニューラルネットワークを構築するライブラリであり、whisperはこれを利用するため、インストールが必要となる。
コンソールに以下のコマンドを入力してPyTorchをインストールする。

```bash
conda install pytorch torchvision torchaudio cudatoolkit=11.6 -c pytorch -c conda-forge
```

### 2.1.2 ffmpegのインストール
ffmepgとは、動画と音声を記録・変換・再生するためのフリーソフトウェアである。
これは動画から音声を抽出するときや、変換したテキストを字幕として動画につけたい場合に用いる。
こちらもコンソールから以下のコマンドを入力してインストールする。

```bash
conda install ffmpeg -c conda-forge
```

### 2.1.3 whisperのインストール
whisperはcondaコマンドに対応していないため、コンソールからpipでインストールする。

```bash
pip install git+https://github.com/openai/whisper.git
```

このとき、Anacondaにgitコマンドをインストールしていないとgit+～の部分が実行できないため、

```bash
conda install git
```

で予めインストールしておこう。

### 2.1.4 動画から音声を抽出

用意したのが音声ファイルであればこの章は飛ばそう。
コンソールで以下のように入力して実行。

```bash
ffmpeg -i (抽出元となる動画ファイル名) -vn
```

`-i` で動画を指定、`-vn`で「音声のみを抽出」を表す。

詳しいオプションは[この記事](https://qiita.com/CyberRex/items/960bbd0f348ad8dca544)が参考になった。

### 2.1.5 whisperで文字起こし

```bash
whisper (音源のファイル名) --model medium --language (音源で使われている言語)
```

`--model`で指定できるオプションは以下の通り(引用元：[https://github.com/openai/whisper](https://github.com/openai/whisper))

![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204334/bb73cc59-e78b-8852-3dc2-79e31aee8b3f.png)

Sizeが大きくなるほど高性能になるかわりにメモリを食うし変換速度も遅くなる。
英語で利用できるモデルはmediumが最高なので、今回はmediumを指定しておく。
ちなみに`--language`オプションは指定しなくても勝手にwhisperが判定してくれる。(指定しておくと判定する時間の分少しだけ文字起こしが速くなる)

上記コマンドを実行するとGPUが唸り、コンソールでタイムスタンプつきで文字起こしされている様子が表示される。

![選択管理者_ Anaconda Powershell Prompt (Anaconda3) 2022_10_16 22_33_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204334/f042b97d-3569-23f3-06cc-45b5337122c2.png)

実行が終わると、フォルダにtxtファイル、srtファイル、vttファイルが生成されているのを確認しよう。
このうち、次で使うのはtxtファイルだ。

## 2.2. スペックがあまり高くないPCを持っている人(目安：薄いノートパソコン)

**Google Colabを使おう。**

これに関しては[この記事](https://qiita.com/walnut-pro/items/0124a5a0c83c9b4e2669)が詳しい。

# 3. DeepL APIで翻訳
## 準備

DeepL API(Free)に登録する。

[https://www.deepl.com/pro-api?cta=header-pro-api](https://www.deepl.com/pro-api?cta=header-pro-api)

Free版であっても身元確認のため、クレジットカードが必要だ。
(クレジットカードを持っていない人は頑張ってコピペして通常のDeepLの翻訳機能を使おう！！)

APIを利用中のアカウントは通常のDeepLの翻訳機能は使えなくなることに注意。ログアウトすれば通常のDeepLの翻訳機能を利用することができる。

利用開始手続きは以下の通り。

1. 利用登録(住所氏名、パスワードなど)
2. ログインしてマイページへ移動
3. APIキー(認証キー)を取得

念のためだが、APIキーは誰にも公開してはいけない。

## Pythonで翻訳実行プログラムを書く

読みやすさ重視のためあまり綺麗なコードではないが、参考になれば嬉しい。

```python:translate.py
import requests

# API Keyを入力
API_KEY:str = 'さっき取得した自分のAPIキーを入力'

# 翻訳元のファイル名を入力
source_file:str = '翻訳したいテキストのファイル名.txt'

# 翻訳したいファイルを開く
with open(source_file) as f:
    txt = f.read().replace('\n', ' ')

# 英語から日本語に変換
params = {
    "auth_key": API_KEY,
    "text": txt,
    "source_lang": 'EN',
    "target_lang": 'JA'
}

# DeepL APIにPOST
# これはfree版URLなので有償版を利用している人は適宜URLを変更すること
req = requests.post("https://api-free.deepl.com/v2/translate", data=params)

# json形式で結果を取得
result = req.json()

# JA_hoge.txtとしてtxt形式で結果を保存
with open("JA_"+source_file, "w") as text_file:
    text_file.write(result["translations"][0]["text"])

# 読みやすいように句点で改行する
with open("JA_"+source_file) as f:
    raw_data = f.read()

raw_data = raw_data.replace("。", "。\n")

with open("JA_"+source_file, mode="w") as f:
    f.write(raw_data)
```

これをエディタに貼りつけ、適宜修正し、translate.pyとして保存する。
あとはいつものように、コンソールで以下のコマンドを入力するだけ。

```bash
python translate.py
```

# 完了

筆者の環境では、40分近くの音源をwhisperで変換するのに数分、できたテキストをDeepLに投げると5秒もしないうちに翻訳されたテキストファイルがフォルダに生成されていた。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204334/e559231f-aaf3-f308-0b88-7ce3ce0067eb.png)
こんな感じ。これはSQLインジェクションについての講義だった。

# YouTubeの動画をサクッと文字起こししたいんだけど…

YouTubeの動画や音声を抽出してのDLは、**規約違反になるのでやめておいた方が賢明である。**

YouTubeの利用規約の違反リストには以下のように示されている。

> 本サービスまたはコンテンツのいずれかの部分に対しても、アクセス、複製、ダウンロード、配信、送信、放送、展示、販売、ライセンス供与、改変、修正、またはその他の方法での使用を行うこと。ただし、（a）本サービスによって明示的に承認されている場合、または（b）YouTube および（適用される場合）各権利所持者が事前に書面で許可している場合を除きます。

> 自動化された手段（ロボット、ボットネット、スクレーパなど）を使用して本サービスにアクセスすること。ただし、（a）公開されている検索エンジンを YouTube の robots.txt ファイルに従って使用する場合、または（b）YouTube が事前に書面で許可している場合を除きます。

[Youtube利用規約](https://www.youtube.com/static?template=terms&hl=ja&gl=JP)より

### **そうは言っても英語がわからない**

そこでYouTube標準機能である『文字起こしを表示』を使う。

1. YouTube画面の右下にある歯車マークを押して英語、もしくは自動生成の英語を選択
2. 高評価ボタンなどが並んでいる右側、点が3つ並んだボタンをクリック
3. 『文字起こしを表示』を選択
4. 動画の右側にタイムスタンプつきで字幕が表示されるので、右上にある点が3つ並んだボタンをクリックして『タイムスタンプ表示を切り替える』を選択
5. タイムスタンプ表示が消えるので、全てを選択してエディタにコピペする
6. 任意のファイル形式で保存。上記の手順3のDeepL翻訳に突っ込む

YouTubeの字幕自動生成は、whisperほどに高精度ではないが、概要を把握する程度には役立つ。
また海外の動画の場合、作成者が英語字幕をつけてくれている場合があるので、この場合は高い精度で日本語に訳することができる。