OpenAI Whisperを使ってノーコードで自動文字起こしを実現する、しかもタダ

# はじめに

英語のミーティングを楽して理解する方法ないかなーと考えていたところ、OpenAI Whisperを使った会話の文字起こしを見つけました。文字起こしと同時に翻訳することができます。`が、よく調べたら翻訳は英語への翻訳にのみ対応`しており、英語を日本語に翻訳することはできないようです。それでも、英語の文字起こしがノーコードで、しかもタダでできます。あとはgoogle翻訳先生にお願いするか、DeepL翻訳を使うなど、ちょっと手間はかかりますが、便利なのかもしれません。

この記事では、オープンソース版を使って、お金がかからない方法で試してみた記録をご紹介します。タダであること以外のメリットはないかな、と考えてみたのですが、セキュリティ面でも優位性がありそうです。Webサービスのようにデータを外部に送信することはなく、ローカルで処理を行うため、セキュリティ的に問題になる可能性は低いかと思います。

# 前提条件
## 使用したソフトウェア

この記事で扱うのは[OpenAI/Whisper](https://github.com/openai/whisper)のオープンソース版です。有償サービスである[OpenAI/Documentation/Models/Whisper](https://platform.openai.com/docs/models/whisper)ではありません。仕組みはほとんど同じようです。オープンソース版でも多言語モデルである`small、medium、large、large-v2`などが利用できました。結果として、十分実用に足りると考えています。

Whisperとは、汎用的なスピーチ認識モデルです。多様なオーディオのデータセットを使ってトレーニングされており、多言語スピーチ認識、スピーチ翻訳、言語特定といった様々なタスクを行うことができます。

## 実行環境

Windows、MacOS、Linuxなど、様々な環境に対応しているようです。私は`Macbook Pro 13-inch, M1, 2020, 16GB Memory, Ventura 13.3.1 (a)`を使って試しました。セットアップの前に`Python 3.11.3`をhomebrewでインストールしています。

## セットアップ

インストールとアップデートは下記コマンドです。

```sh
pip install -U openai-whisper
```

コマンドラインツールの`ffmpeg`も必要となります。

```sh
brew install ffmpeg
```

# コマンドラインで実行

Pythonを使って利用することも可能です。が、この記事では、ノーコードで対応することを目的にしているので、Pythonには言及しません。Pythonでの利用については、[github/openai/whisper](https://github.com/openai/whisper)のページ下部をご参照下さい。

## 日本語で文字起こし

Zoomでレコーディングしたオーディオファイルから日本語にて文字起こししてみました。業務中に作成したデモムービー(3.3MB、3分26秒の尺)を利用しました。業務上のキーワードが色々含まれるので、途中でカットしています。私の滑舌が悪い部分などが理由で、文字起こしが不正確な部分がありますが、実用に足りると感じています。

```sh
whisper audio1454496418.m4a --language Japanese
/opt/homebrew/lib/python3.11/site-packages/whisper/timing.py:57: NumbaDeprecationWarning: The 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.
  @numba.jit
100%|███████████████████████████████████████| 461M/461M [00:19<00:00, 25.0MiB/s]
/opt/homebrew/lib/python3.11/site-packages/whisper/transcribe.py:114: UserWarning: FP16 is not supported on CPU; using FP32 instead
  warnings.warn("FP16 is not supported on CPU; using FP32 instead")
[00:00.000 --> 00:11.640] このデモビデオではデモアプリに持つ 仕分けシステムを紹介します
[00:11.640 --> 00:18.400] Vantech統合開発環境はご覧のように WebUIとして提供しています
[00:18.400 --> 00:27.060] 左上がAppBuilderというペインになります 左下がVantechタイプという
```

ファイルとして、いくつか出力されます。`.txt`は文字だけ出力されており、`.srv`、`.tsv`、`.vtt`は字幕ファイルの形式のようです。

```sh
ls -la
total 6472
drwxr-xr-x   8 vfuji  staff      256  5 23 18:03 .
drwx------@ 15 vfuji  staff      480  5 23 17:56 ..
-rw-r--r--   1 vfuji  staff    15040  5 23 18:03 audio1454496418.json
-rw-r--r--@  1 vfuji  staff  3278789 11 12  2022 audio1454496418.m4a
-rw-r--r--   1 vfuji  staff     2510  5 23 18:03 audio1454496418.srt
-rw-r--r--   1 vfuji  staff     2027  5 23 18:03 audio1454496418.tsv
-rw-r--r--   1 vfuji  staff     1703  5 23 18:03 audio1454496418.txt
-rw-r--r--   1 vfuji  staff     2311  5 23 18:03 audio1454496418.vtt
```


## 精度を向上したい場合

`--model`オプションを使うことで、使用するモデルを指定できます。下記では、デフォルトの`small`ではなく、一つ上の`medium`を利用しています。パラメータ数が3倍強となりますが、VRAMの要求も5GB程度と書いてあります。それなりに処理時間の差がありました。

```sh
whisper audio1454496418.m4a --language Japanese --model medium
/opt/homebrew/lib/python3.11/site-packages/whisper/timing.py:57: NumbaDeprecationWarning: The 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.
  @numba.jit
100%|█████████████████████████████████████| 1.42G/1.42G [00:31<00:00, 47.9MiB/s]
/opt/homebrew/lib/python3.11/site-packages/whisper/transcribe.py:114: UserWarning: FP16 is not supported on CPU; using FP32 instead
  warnings.warn("FP16 is not supported on CPU; using FP32 instead")
[00:00.000 --> 00:11.600] このデモビデオでは、デモアプリに 持つ仕分けシステムを紹介します。
[00:11.600 --> 00:18.280] Vantek統合開発環境は、ご覧のように Web UIとして提供しています。
[00:18.280 --> 00:23.200] 左上が、App Builderというペインになります。
[00:23.200 --> 00:32.800] 左下が、Vantek Typeという永続化領域に保存している 仕分け情報を表示しているペインになります。
```

## 日本語を英語に翻訳する

`--task`オプションで、翻訳を行うことができます。日本語のまま文字起こしする場合と比べて、著しく時間がかかる、というわけではありませんでした。

```sh
whisper audio1454496418.m4a  --language Japanese --model medium --task translate
/opt/homebrew/lib/python3.11/site-packages/whisper/timing.py:57: NumbaDeprecationWarning: The 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.
  @numba.jit
/opt/homebrew/lib/python3.11/site-packages/whisper/transcribe.py:114: UserWarning: FP16 is not supported on CPU; using FP32 instead
  warnings.warn("FP16 is not supported on CPU; using FP32 instead")
[00:00.000 --> 00:07.000]  In this demo video, I will introduce the demo app, Emotu Shiwake System.
[00:07.000 --> 00:14.000]  As you can see, the Vantech integrated development environment is provided as a web UI.
[00:14.000 --> 00:19.000]  The upper left is the pane called App Builder.
[00:19.000 --> 00:27.000]  The lower left is the shiwake information that is stored in the video area called Vantech Type.
[00:27.000 --> 00:32.000]  This is the pane that displays the shiwake information that is stored in the video area called Vantech Type.
```


# おまけ、処理時間と負荷

複数種類のZoomレコーディングのオーディオファイルと映像ファイルを使って試した結果をまとめてみました。下記の表は参考程度に捉えて下さい。厳密な測定ではありません。他のアプリなどを通常通り使用中の状態でアクティビティモニタを目視で確認しましたが、ユーザCPU負荷は、いずれも39%程度でした。使用済みメモリはモデルによって、多少変動するようです。尺が長ければ、それなりに時間がかかるという結果でしたが、尺が長いからとCPUやメモリの負荷が上がるわけではないようです。

処理対象のファイルサイズについては、有償版と比較すると、優位点かもしれません。2023/5/25現在、有償版の[OpenAI Whisper API/Speech to text](https://platform.openai.com/docs/guides/speech-to-text)では、ファイルのアップロードは25MBまでに制限されている、と記載があります。一方、オープンソース版では、90MBを超えるサイズのファイルを一つのコマンドラインで実行し、問題なく結果が得られました。

下記のようにlanguage optionで言語を指定し、さらにmodel optionでモデルを指定しています。前後に`date`を入れることで処理時間を測定しました。

`date; whisper audio1454496418.m4a --language Japanese --model large-v2; date`

|ファイル種別|ファイルサイズ|audio/movie尺|モデル|処理時間|
|---|---:|---:|:---:|---:|
|audio (m4a)|3.3MB|3分26秒|small|3分1秒|
|audio (m4a)|3.3MB|3分26秒|medium|5分44秒|
|audio (m4a)|3.3MB|3分26秒|large|12分41秒|
|audio (m4a)|3.3MB|3分26秒|large-v2|9分55秒|
|audio (m4a)|94.6MB|99分01秒|small|87分46秒|
|movie (mp4)|10.3MB|3分26秒|medium|5分42秒|


# 日本語文字起こしの精度比較について

Whisper APIの日本語文字起こしの精度について、他の仕組みと比較した記事がありました。参考までにリンク[ImpressWatch/OpenAIの自動文字起こし「Whisper API」は1分1円以下! 簡単に使える?](https://www.watch.impress.co.jp/docs/topic/1493886.html)を記します。

# 残念なところ

一通り手順を確認し、さて英語のレコーディングを日本語に翻訳しよう、と考えたのですが、「どうやらそのようなオプションはない」ということに気がつきました。残念ながら、実装されていないようです。翻訳は全て英語への翻訳に限る、という対応のようです。


# 参考

[github/openai/whisper](https://github.com/openai/whisper)