「SRT字幕ファイルを自動的に作成したい」
「動画の字幕ファイルを無料で簡単に作成したい」
このような場合には、この記事の内容が参考になります。
この記事では、Whisperを用いたSRT字幕ファイルの自動作成について解説しています。
本記事の内容
- SRT字幕ファイル自動生成システムの仕様
- システム要件
- 動作確認
それでは、上記に沿って解説していきます。
SRT字幕ファイル自動生成システムの仕様
2022年9月末にWhisperという音声認識モデルが、公開されました。
Whisperのインストールは、次の記事で解説しています。
正直、WhisperはとんでもないAIです。
上記記事内では、簡単な検証を行っています。
その検証結果からでも、Whisperの凄さに驚きました。
しかし、今回の結果(動作確認)ではさらに驚きました。
「Whisper 半端ないって!」という感じです。
この記事を最後まで読めば、そのヤバさがわかるでしょう。
さて、肝心の仕様を説明しておきます。
仕様と言っても、完全にWhisper頼りです。
Whisperの機能を活かして、SRTファイルに必要なデータを取得します。
具体的には、上記音声からは Python API(モジュール)を使って以下データを取得できます。
(※「tokens」は、人間が見ても意味のない値)
{'language': 'ja', 'segments': [{'avg_logprob': -0.15588046565200342, 'compression_ratio': 0.4069767441860465, 'end': 5.62, 'id': 0, 'no_caption_prob': 0.12109240889549255, 'seek': 0, 'start': 0.0, 'temperature': 0.0, 'text': '過去最強クラスの台風14号が近づいてきています。', 'tokens': [***]}, {'avg_logprob': -0.15429736267436633, 'compression_ratio': 0.3709677419354839, 'end': 30.62, 'id': 1, 'no_caption_prob': 0.0028858412988483906, 'seek': 562, 'start': 5.62, 'temperature': 0.0, 'text': '九州南部、そして北部の皆さんを中心に暴風、高波、高潮や大雨などに最大級の警戒をしてください。', 'tokens': [***]}], 'text': '過去最強クラスの台風14号が近づいてきています。九州南部、そして北部の皆さんを中心に暴風、高波、高潮や大雨などに最大級の警戒をしてください。'}
SRTファイルを生成する上で必要なのは、「segments」のデータになります。
最低限で次のデータがあれば、SRTファイルを作成できます。
- id
- start
- end
- text
これでSRTを自動生成できるイメージができたはずです。
やはり、Whisper依存ということになります。
以上、SRT字幕ファイル自動生成システムの仕様を説明しました。
次は、システム要件を説明します。
システム要件
OSは問いません。
とにかく、Pythonが動けばOKです。
そして、WhisperのPython API(モジュール)を利用します。
コマンドラインツールを使わないのは、精度と拡張性がその理由です。
コマンドラインツールの精度については、すでに紹介した記事内で説明しています。
なぜか、コマンドラインツールはPython APIより認識精度が低いのです。
もちろん、同じモデルを指定しているのですが。。。
また、拡張性の面から言ってもPython APIの方が勝っています。
その拡張性の恩恵を受けるようなコードを紹介しています。
詳細は、「動作確認」のコードをご覧ください。
Pythonのバージョンは、以下のPython公式開発サイクルに従ってください。
バージョン | リリース日 | サポート期限 |
3.6 | 2016年12月23日 | 2021年12月23日 |
3.7 | 2018年6月27日 | 2023年6月27日 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
3.10 | 2021年10月4日 | 2026年10月 |
Python 3.6は、2022年12月末でサポート期限が切れています。
よって、現在(2022年9月末)ではPython 3.7以降が必須となります。
そして、以下の要件を満たすことが必要です。
- Whisper
- srt(Pythonライブラリ)
Whisperは、仕様でも説明しましたが根幹になります。
あと、srtはSRTファイルの作成の際に利用します。
srtについては、次の記事で説明しています。
以上、システム要件を説明しました。
次は、動作確認を説明します。
動作確認
動作確認を行っていきます。
その前に、少し長めの動画を用意しましょう。
あと、ある程度は滑舌の良い人が発言している動画にします。
活舌が悪いと、いくらWhisperが優秀でもダメです。
これは、Googleの音声認識でも同じことが言えます。
今回は、次の動画を対象とします。
念のために言うと、政見放送には著作権がありません。
と言っても、加工してアップロードしない限りは、どんな動画でもいいのですけどね。
また、YouTubeからの動画取得にはyt-dlpを用いています。
yt-dlpについては、次の記事を参考にしてください。
ダウンロードした動画は、WebM形式の動画となっています。
もちろん、MP4形式の動画でもOKです。
ファイル名を「seiken.webm」と変更しておきます。
ここまで準備できれば、あとは次のコードを実行するだけです。
import whisper from datetime import timedelta from srt import Subtitle import srt def add_line(s): new_s = s s_count = len(s) s_max_count = 15 if s_count >= s_max_count: if (s_count - s_max_count) >= 3: # 15文字以上、かつ、2行目が3文字以上あれば、改行する # つまり、18文字以上であれば、15文字で改行する new_s = s[:s_max_count] + "\n" + s[s_max_count:] return new_s file_name = "seiken" file_path = file_name + ".webm" model = whisper.load_model("medium") result = model.transcribe(file_path) segments = result["segments"] subs = [] for data in segments: index = data["id"] + 1 start = data["start"] end = data["end"] text = add_line(data["text"]) sub = Subtitle(index=1, start=timedelta(seconds=timedelta(seconds=start).seconds, microseconds=timedelta(seconds=start).microseconds), end=timedelta(seconds=timedelta(seconds=end).seconds, microseconds=timedelta(seconds=end).microseconds), content=text, proprietary='') subs.append(sub) with open(file_name + ".srt", mode="w", encoding="utf-8") as f: f.write(srt.compose(subs))
上記コードを実行すると、数分程度の時間がかかります。
数分程度とは、GPUを利用しているケースです。
CPUだけだと、どれくらいの時間がかかるのでしょうか?
試していないので、この辺はわかりません。
処理が完了すると、「seiken.srt」が作成されています。
以下は、「seiken.srt」の一部となります。
12 00:00:56,000 --> 00:01:00,000 会社を上場させたビジネスマンで もできないことなんです
add_line関数により、テキストを自動で改行しています。
文字数が長いと自動で改行を入れているということです。
このようなことができるため、Python APIでWhisperを利用しています。
SRT字幕ファイルの自動作成についての動作確認は、以上となります。
最後に、作成した「seiken.srt」をもとに字幕を埋め込んだ動画を紹介しておきます。
字幕を動画に埋め込む方法は、次の記事で解説しています。