はじめに
YouTubeなどに動画をそのままアップロードすると、自動的に日本語や英語の音声データの文字起こしがされるが、特に日本語に関してはかなり間違いを含んでいる。
自分の場合は、実験手技に関する研究系の動画を上げることが多い。
例として過去作った実験手技の動画から、youtubeが自動生成した字幕のsrt fileから抜粋した。
(字幕を 日本語(自動生成)を選択)
ところどころ意味不明だ。
19
00:01:03,019 --> 00:01:08,580
そしてここはイワナイザーですね
(正:これはイオナイザーですね)
20
00:01:05,939 --> 00:01:12,240
米内沢はなぜあるかっていうとビデオの
(正:イオナイザーがなぜあるかというと、微量な)
21
00:01:08,580 --> 00:01:14,939
液体を使う時に手袋すると
(正:液滴を使うときに手袋をすると)
これをマニュアルで、文字起こしを直して、文章として意味の通る日本語にすれば、YouTube上での英語への自動翻訳はある程度うまくいくようだ。
だがいちいち直すのは面倒すぎる。
ポイントとしては、文字起こしの正確性だが、別途動画から文字起こしをして、YouTube上に取り込めば良さそう。
そこで、所属するラボで話題になっていた、OpenAI社のWhisper
を試してみた。
そのやり方など備忘録
導入
# macの環境にpythonを入れる
# whisper githubのinstallに従う
# whisperをいれる
Mac-mini % pip install -U openai-whisper
# ffmpegをいれる
# on MacOS using HomeBrew (https://brew.sh/)
Mac-mini % brew install ffmpeg
* homebrewがはいってなかったら、以下対応
whisperを使用した文字起こし
# pythonを起動する
Mac-mini % python
Python 3.10.9 (main, Mar 1 2023, 12:33:47) [Clang 14.0.6 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
# homedirectoryやFILEの場所を確認する
# 参照:https://toufulog.com/archives/961
>>> import os
>>> os.path.expanduser("~")
# whisper による transcriptionのfirst tryの結果
コマンドラインのほうが使いやすい気がする
[pythonの場合]
>>> import whisper
>>> model = whisper.load_model("base")
# "base" = 中身を tiny/base/small/medium/large を選択できる。largeに近づくと計算時間が増えるが、正確性も増す。
>>> result = model.transcribe("audio.mp3")
# "audio.mp3" の部分を動画の場所に指定する。 "/data/xxxx/yyyy/wwww.mp4" などで場所を指定すること。
>>> print(result["text"])
[command lineの場合]
Mac-mini % whisper /Volumes/HD-PCFSU3-A/20221206_pipetteman_movies.mp4 --model large --task transcribe
上記の過去にアップしたファイルのmp4 fileを計算してみた。
一部出力結果の抜粋を下記に示したが、modelによりだいぶ異なりそう。largeはかなり正確な印象を受けた。base版だと、ボギットってなんだw
10分程の動画だが、baseだと、1-2minくらい、largeだと10minは超えた。長い動画だと、largeは厳しくなっていくのかもしれないな。様子見をする。
[base model]
先端が結構柔らかいので横にこういう風に手この限りで動かすとボギット簡単に折れちゃうので すぐにさすっていうことが重要です
↓
[large model]
先端が結構柔らかいので横にこういうふうに手この原理で動かすとボキッと簡単に折れちゃうのでまっすぐに指すということが重要です
# whisper による transcriptionのsrt file出力
まずhelpですぐ使いそうなオプションを確認する
Mac-mini % whisper --help
[--model {tiny.en,tiny,base.en,base,small.en,small,medium.en,medium,large-v1,large-v2,large}]
[--output_dir OUTPUT_DIR]
[--output_format {txt,vtt,srt,tsv,json,all}]
[--task {transcribe,translate}]
コマンドラインで、以下を実行して、srt fileを出力する
Mac-mini % whisper /Volumes/HD-PCFSU3-A/20221206_pipetteman_movies.mp4 --model large --output_format srt --task transcribe --output_dir /Volumes/HD-PCFSU3-A
# 上記では、input fileの場所を指定し、modelをlarge, output formatをsrt, taskをtranscribe (言語を認識して、文字起こしする), output directoryを指定
#input fileの指定として、 /data/* フォルダに入っているすべてのような指定可能。
#taskをtranslateにすると 英語に翻訳される。
#outputのfile名は、inputのfile名に準拠して排出される。
SRT fileの中身を確認する
1
00:00.000 --> 00:07.000
本日はピッペッターの使い方ですね
2
00:07.000 --> 00:11.000
基本的な機械なんですけれども
3
00:11.000 --> 00:16.000
こちらは分子生物素学的な反応では
YouTube動画にSRT fileを取り込む
字幕 → 言語を追加 → 言語の選択(今回は日本語)→ 字幕追加
あとはファイルをアップロードするだけ
おわりに
動画や音声データなどフォルダに入れておいて、夜中に全部文字起こしするなんかは簡単にできるようになった。
C++ versionはまだ試してない
あとyouTubeにあげるとき、日本語・英語両方取り込ませたい時があるので、同時に排出してほしい。transcribe (文字起こしをする)のとtranslate (文字起こしして同時に英語にもする)を同時に出力するのは、まだできてないけど、やりたい。二回計算したらいいんだろうけど。。。
追記
C++ versionを試してみた。
こっちが断然早い。2.5時間くらいの.mp4 fileだと、python版で途中で止まってしまった。
C++ versionだと、3時間くらいで完了した。
以下実行
git clone https://github.com/ggerganov/whisper.cpp.git
cd whisper.cpp
make
large modelをダウンロード
./models/download-ggml-model.sh large
動画fileからwav fileに変換して出力する。このwav fileをwhisper.cppで処理する。
ffmpeg -i ~/test.mp4 -ar 16000 test.wav
一括のMP4 to wav変換は以下。
for f in ./*.MP4; do ffmpeg -i "$f" -ar 16000 "${f%.MP4}.wav"; done
#特定のフォルダに有る特定のMP4拡張子のファイルを、そのままの名前でwavに変換する。
transcribeでsrt fileを出力させる
./main -m models/ggml-large.bin -f test.wav -l auto --output-srt
あとは、出力されたsrt fileをYouTubeにとりこむ
ファイル名は、test.wav.srt みたいにinputのファイル名をベースに出力される
20230508追記
上記srt fileだが、間違いがないわけではない。間違えている部分が少ないだけ。専門的な言葉などは、たまに壊滅的であることもある。
たとえば以下など。学習モデルに入りにくいものはそうなるんかな。
転倒混和 (実際)
↓
店頭講話 (YouTube)
伝統コンガ (Whisper)
点灯コーンは (Whisper)
なので、目で見て直すのは必須
あとwhisperですが、ときどき無音のところに変なのをいれるときがある。特に最後。以下54は無音の部分だったのだが。やっぱり目でもある程度は見たほうがいい。
53
00:05:17,000 --> 00:05:20,000
そちらに関しては別途お話したいと思います
54
00:05:20,000 --> 00:05:22,000
次回は山手線と新北線での旅をお楽しみに wünかないだくさんです!
Comments