ソフトウェア/whisper

(544d) 更新


公開メモ

OpenAI の Whisper を使って授業動画に正しいキャプションを付けたい

Microsoft Stream の標準機能で自動的に動画にキャプションを付けられるのだけれど、 文字起こしの精度が悪すぎてとても残念な感じになってます。。。

OpenAI の Whisper を使うとより正確な文字起こしができそうなので、試してみることにします。
→ gigazin の記事: https://gigazine.net/news/20220929-openai-whisper-install-and-usage/

Docker を使って簡単に動かせるようです

普段から pip を使って python で計算をしているなら docker を使うまでもないですが、 テストでちょこっとやってみたいなら docker でいろいろ気にせずやっちゃうのが便利?

https://dev.classmethod.jp/articles/openai_whisper_only_local_cpu/ を参考に、

LANG:console
$ mkdir whisper
$ cd whisper
$ cat << EOS >Dockerfile
FROM python:3.9-slim

WORKDIR /workspace

RUN apt update && apt install -y \
    build-essential \
    gcc \
    git \
    ffmpeg \
    && rm -rf /var/lib/apt/lists/*

RUN pip install --upgrade pip

RUN pip install git+https://github.com/openai/whisper.git
EOS
$ docker build -t whisper .
$ docker images
 REPOSITORY               TAG             IMAGE ID       CREATED          SIZE
 whisper                  latest          5f346a2f452e   40 minutes ago   3.52GB
 python                   3.9-slim        690ca4c8a70d   6 hours ago      125MB
$ mkdir -p ~/.cache/whisper
$ alias whisper='docker run --rm -v ~/.cache/whisper:/root/.cache/whisper/ -v $(pwd):/workspace/ whisper whisper'
$ whisper --language ja --model medium audio.mp3 | tee -a whisper.log

のようにして、簡単に動かすことができました。

コンテナはその場限りの使い捨てで問題がないので --rm を付けてあります。

モデルデータは whisper が自動的にダウンロードしてコンテナ内の /root/.cache/whisper/ に保存されるのですが、そのままだと実行が終了してコンテナが壊されるときに失われてしまいます。 そこで、ホスト側の ~/.cache/whisper/ に保存されるよう volume 指定を追加してあります。

念のためログ表示を whisper.log に残すよう tee -a を付けて実行します。

この文字起こし、特に大きなモデルを使う場合は GPU がないとかな~り時間がかかるみたい。 とはいえ tiny や small だと変換精度が残念な感じに。

cuda が使えるなら、PyTorch が自動的に認識して cuda による高速な処理が可能になるので、 ぜひ cuda 環境で使うべき。 → モデルを large にすると 8GB の VRAM では足りなかった orz

字幕データがそのまま得られる

コマンド一発で vtt ファイルができるので、それを Microsoft Stream にアップロードすれば字幕データを置き換えられます。

区切りを調整したい?

デフォルトだと文と文との間を認識せずに行分けされてしまうみたいに感じられるので、これを調整できないものか検討中。← tiny や small だと分の切れ目で行分けされるのに medium 以上だとなぜかそうなってしまう?

← medium でも large でも、与える音源によってちゃんと句読点が付いて正しく区切られる場合と、 そうならない場合があるようで、今のところ理由が分からない状況です。

Microsoft Stream で変換した結果:

線形代数bの授業を続けます数理不躾、竹内です
この動画は、春学期の復讐1となっています
ええまず線形代数という言葉からですけれども、うんとこの線形代
数の線形皆さんもわかりますよね
意味はええと関数fっていうのが線形であるっていうのはどういう
意味かというと、これは?
エックスとyを足してからエフを適用するのと、fを適用
してから多数のと
結果が変わらないよっていうことです
あるいはscalarばいしてからエフを適用するのと、fを適用
してからscalarヴァイスの音で結果が変わらないと
こういう関数のことを線形な関数と言うのでした
でこの2つのええ
条件は?1つにまとめてしまってscalarバイトはを計算して
からエフを適用するのと、fを適用してからscalarバイトは
を計算するのとが等しいと書いても同じことになります

whisper (medium) で変換した結果:

線形大数Bの授業を続けます 数理 物質系竹内です この動画は春学期
の復習1となっています まず線形大数 という言葉からですけれども この
線形大数の線形 皆さんも分かります よね 意味は 関数Fっていうのが
線形であるっていうのはどういう 意味かっていうと これは xとyを
足してからFを適用するのと Fを適用 してから足すのと 結果が変わらない
よっていうことです あるいは スカラーバイしてからFを適用する
のと Fを適用してからスカラーバイ するのとで結果が変わらないと
こういう関数のことを線形な関数 と言うのでした この二つの条件
は一つにまとめてしまって スカラーバイ とYを計算してからFを適用する
のと Fを適用してからスカラーバイ とYを計算するのとが等しいと
書いても同じことになります この条件とこの条件は同値な条件
になります

large での変換結果:

線形台数Bの授業を続けます 数理物質系竹内です
この動画は春学期の復習1となっています
まず線形台数という言葉からです けれども この線形台数の線形
皆さんも分かりますよね 意味は 関数Fっていうのが線形である
っていうのはどういう意味かという と これはxとyを足してからfを適用
するのとfを適用してから足すのと 結果が変わらないよっていうことです
あるいはスカラー倍してからfを 適用するのとfを適用してからスカラー
倍するのとで結果が変わらない とこういう関数のことを線形な
関数というのでした この2つの条件は1つにまとめて
しまってスカラー倍とyを計算してから fを適用するのとfを適用してから
スカラー倍とyを計算するのとが 等しいと書いても同じことになります
この条件とこの条件は同値な条件 になります

本来言いたかった内容:

線形代数Bの授業を続けます。
数理物質系武内です。
この動画は「春学期の復習1」となっています。
まず線形代数、という言葉からですけれども。
この線形代数の「線形」、皆さんもう分かりますよね、意味は。
関数 f っていうのが線形であるっていうのは どういう意味かっていうと、
これは x と y を足してから f を適用するのと、f を適用してから足すのと、
結果が変わらないよ、っていうことです。
あるいは、スカラー倍してから f を適用するのと、
f を適用してからスカラー倍するのとで結果が変わらないと。
こういう関数のことを「線形な関数」と言うのでした。
この二つの条件は一つにまとめてしまって、
スカラー倍と和を計算してから f を適用する
のと f を適用してからスカラー倍と和を計算するのとが等しいと
書いても同じことになります。
この条件とこの条件は同値な条件になります。

比べてみると whisper の変換精度がかなり高いことが分かります。

ただ、専門用語を全く知らないわけではないものの、 専門用語を使う頻度(?)が低いみたいで、正しい用語が出てこない ケースもそこそこ見られました。同じ用語を正しく使いこなしている個所も あったりして、「え?さっきはちゃんと聞き取れたよね?!」と思うこともしばしば。 このあたり、AI の気まぐれさが謎なところです。

オプションを見直す

 --temperature TEMPERATURE
                       temperature to use for sampling (default: 0)
 --best_of BEST_OF     number of candidates when sampling with non-zero temperature (default: 5)
 --beam_size BEAM_SIZE
                       number of beams in beam search, only applicable when temperature is zero (default: 5)
 --patience PATIENCE   optional patience value to use in beam decoding, as in https://arxiv.org/abs/2204.05424, the default (1.0) is equivalent to conventional
                       beam search (default: None)
 --length_penalty LENGTH_PENALTY
                       optional token length penalty coefficient (alpha) as in https://arxiv.org/abs/1609.08144, uses simple length normalization by default
                       (default: None)
 --suppress_tokens SUPPRESS_TOKENS
                       comma-separated list of token ids to suppress during sampling; '-1' will suppress most special characters except common punctuations
                       (default: -1)
 --initial_prompt INITIAL_PROMPT
                       optional text to provide as a prompt for the first window. (default: None)
 --condition_on_previous_text CONDITION_ON_PREVIOUS_TEXT
                       if True, provide the previous output of the model as a prompt for the next window; disabling may make the text inconsistent across
                       windows, but the model becomes less prone to getting stuck in a failure loop (default: True)
 --fp16 FP16           whether to perform inference in fp16; True by default (default: True)
 --temperature_increment_on_fallback TEMPERATURE_INCREMENT_ON_FALLBACK
                       temperature to increase when falling back when the decoding fails to meet either of the thresholds below (default: 0.2)
 --compression_ratio_threshold COMPRESSION_RATIO_THRESHOLD
                       if the gzip compression ratio is higher than this value, treat the decoding as failed (default: 2.4)
 --logprob_threshold LOGPROB_THRESHOLD
                       if the average log probability is lower than this value, treat the decoding as failed (default: -1.0)
 --no_speech_threshold NO_SPEECH_THRESHOLD
                       if the probability of the <|nospeech|> token is higher than this value AND the decoding has failed due to `logprob_threshold`, consider
                       the segment as silence (default: 0.6)
 --threads THREADS     number of threads used by torch for CPU inference; supercedes MKL_NUM_THREADS/OMP_NUM_THREADS (default: 0)

あー、どこかでこれらの意味を解説してたりしないかな・・・


Counter: 2827 (from 2010/06/03), today: 2, yesterday: 0