OpenAIの音声認識Whisperを使用して英作文の文字起こしテスト

# はじめに
暗記のための自由/オープンソースソフトウェアである「[Anki](https://apps.ankiweb.net/)」を知りました。これを使用すれば、エビングハウスの忘却曲線に基づいて暗記することが出来るようになります。
英単語などであれば自分は英単語アプリ「TANZAM」を使用しており、このアプリも忘却曲線に基づいて暗記できるように作られています。

https://www.path-to-success.net/tanzam

1行か2行程度の英作文の暗記をする上で、本を使用しても面倒くさくなって段々やらなくなる。それだったらAnkiアプリで問題文を作成した方が効果的である。その本の英作文を入力するのも結構大変である。Kindle for PCを使用してもコピー制限があり全文取得は難しい。巻末などに一覧で掲載されていればiPhoneで写真を撮って「[一太郎Pad](https://www.justsystems.com/jp/products/ichitaropad/)」でOCRすることで手間を省くことが出来たりします。

そこで最近、OpenAIから音声認識モデルWhisperが出たので、本についていたCDから文字起こしができるのか試してみました。
今回試したのは、竹岡広信著の「ドラゴンイングシュッシュ基本英文100」の1問目のみ。

# 準備
Googleアカウントさえあれば誰でも出来るように、Google Colaboratoryを使用します。
「ドラゴンイングシュッシュ基本英文100」のCDを取り込みます。
自分はMacでM4Pフォーマットで取り込まれました。ただWhisperでは、~~M4Pフォーマットには対応しなかった~~ため、今回はお試しで問題文001のみMP3フォーマットに変換して、Googleドライブに「English」フォルダを作成して「001.mp3」ファイルとしてコピーしました。

【2022/10/13追記】
M4Pフォーマットには対応していました。mp3と同等な結果を得られましたので変換は不要です。ただmp3の方がファイルサイズが小さくなります。

## Google Colaboratoryの起動
https://colab.research.google.com/?hl=ja#

## GPUに切り替え
ランタイムメニューにある「ランタイムのタイプを変更」で「GPU」に変更して設定保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/bd329798-5e90-28e8-b6e0-1bb7454f22ec.png)

## Google Driveのマウント
コードを入力します。

```py
#@markdown ## Google Driveのマウント
from google.colab import drive
drive.mount('/content/drive')
```
Mounted at /content/drive

## GPUの確認
```py
nvidia-smi -L
```
GPU 0: Tesla T4 (UUID: GPU-0ddedc1b-7ad2-0d54-9082-93e6ab15d4e7)

## whisperのインストール
```py
!pip install git+https://github.com/openai/whisper.git
```
Successfully built whisper
Installing collected packages: tokenizers, huggingface-hub, transformers, ffmpeg-python, whisper
Successfully installed ffmpeg-python-0.2.0 huggingface-hub-0.10.0 tokenizers-0.12.1 transformers-4.22.2 whisper-1.0

## 音声認識
```py
import whisper

# 言語
lang = "ja"#@param ["en", "ja"]
# モデル選択
model_size = "tiny"#@param ["tiny", "base", "small", "medium", "large"]
# 対象の動画ファイルのパス
mp3_file_path = "/content/drive/MyDrive/English/001.mp3"#@param {type:"string"}

model = whisper.load_model(model_size)
result = model.transcribe(mp3_file_path, verbose=True, temperature=0.8, language=lang)
print(result["text"])
```

「RuntimeError: CUDA out of memory」のエラーが出た場合、ランタイムメニューにある「ランタイムを再起動」をクリックしてやり直しています。

### 正解
```text:正解
ドラゴンイングリッシュ 基本英文100
パート1 時制
1.ウイスキーのボトルを2本も空けて車を運転するのは危険だ。
It would be dangerous to drink two bottles of whiskey and drive a car.
```

### モデル tiny
```text:結果
[00:00.000 --> 00:05.120] ドラゴイングリッシュ 基本へぶん逆
[00:05.120 --> 00:07.900] パート丸 実際
[00:07.900 --> 00:09.560] 一
[00:09.560 --> 00:14.680] うい月のボトルを 日本も開けてくれま運転するのが危険だ
[00:14.680 --> 00:44.680] そしてまた 使い介意がいいというかが マシュドで腹のワンマンを 聞かせると アクリーム服の柔らかにつかり というもので というのに 真似前は その注意とかあったにして 彼とは すぐにつかり
```

### モデル base
```text:結果
[00:00.280 --> 00:04.540] ドラゴンイングリッシュ 基本A分100
[00:04.540 --> 00:07.820] パートバム 時生
[00:07.820 --> 00:10.960] 1.ウィッスキーのボトルを
[00:10.960 --> 00:14.160] 日本も開けて車を運転するのは危険だ
[00:14.160 --> 00:25.560] It would be dangerous to drink two bottles of whiskey and drive a car.
```

### モデル small
```text:結果
[00:00.000 --> 00:04.320] ドラゴンイングリッシュ基本英文100
[00:04.320 --> 00:07.560] パート1 地勢
[00:07.560 --> 00:14.960] 1 ムイスキーのボトルを2本も開けて車を運転するのは危険だ
[00:14.960 --> 00:19.480] It would be dangerous to drink two bottles of whiskey and drive a car
```

### モデル medium
```text:結果
[00:00.300 --> 00:04.400] ドラゴン・イングリッシュ、基本英文100
[00:04.460 --> 00:08.020] パート1 自制
[00:08.020 --> 00:14.800] 1,ウィスキーのボトルを2本も開けて車を運転するのは危険だ
[00:14.800 --> 00:25.280] It would be dangerous to drink two bottles of whiskey and drive a car.
```

### モデル large
```text:言語jaの結果
[00:00.000 --> 00:04.420] ドラゴンイングリッシュ 基本英文100
[00:04.460 --> 00:07.900] パート1 時政
[00:07.920 --> 00:14.360] 1.ウイスキーのボトルを2本もあけて車を運転するのは危険だ。
[00:14.360 --> 00:25.380] It would be dangerous to drink two bottles of whiskey and drive a car.
```

```text:言語enの結果
[00:00.000 --> 00:04.660] ドラゴン英文基本英文 100
[00:04.660 --> 00:07.900] パート1 時勢
[00:07.900 --> 00:14.640] 1.ウィスキーのボトルを2本も開けて車を運転するのは危険だ。
[00:14.640 --> 00:25.080] It would be dangerous to drink two bottles of whisky and drive a car.
```

## 正解との比較
正解とモデル`large`をWinMergeで比較しました。「時制」が「時政」になってしまっていますが、これは前後の文脈がないので漢字が違っていても仕方ないです。「空ける」が「あける」となっています、これも許容範囲です。
言語は`ja`にしていますが、英文をちゃんと認識しています。英文はもちろん一致していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/961519ac-29bd-e4d4-9f42-7556848a6ce7.png)
他のモデルよりは時間は掛かり(といっても1分)ますが、精度を考慮したらモデル`large`にしないと駄目ですね。
言語は`en`にしても結果は変わらず、ちゃんと日本語として認識されました。

# 最後に
1問に1分かかるので、100問だと単純計算で100分＋編集時間など考えると全体で4〜6時間かかりますね。
「ドラゴンイングシュッシュ基本英文100」に関しては、巻末に一覧があったので7ページ分をiPhoneで写真を撮って「[一太郎Pad](https://www.justsystems.com/jp/products/ichitaropad/)」でOCRした方が編集含めても1時間くらいだったので、それで済ましてしまいました。
あと、「[Anki](https://apps.ankiweb.net/)」は「TTS (Text-to-Speech、テキスト読み上げ機能)」に対応しているので、音声を取り込まなくてもテキスト読み上げ機能で英文が聞けたりします。 

「ドラゴンイングシュッシュ基本英文100」は久しぶりに本棚から取り出したんですが、これって2005年に山Pが主演した１作目の[ドラゴン桜のドラマ](https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A9%E3%82%B4%E3%83%B3%E6%A1%9C_(%E3%83%86%E3%83%AC%E3%83%93%E3%83%89%E3%83%A9%E3%83%9E))あたりに購入した本なので、もはや17年前になります。ガッキーこと新垣 結衣さんがギャルで金髪姿でした。その後に番宣で黒髪に戻った姿をみて、可愛さに驚愕したものです。有名な[「ポッキー」のCM](https://www.youtube.com/watch?v=YoCPzcO122I)(2006年〜)はこのドラマの後になります。