【Python】AI音声認識Whisperを使ったSRT字幕ファイルの自動作成

【Python】AI音声認識Whisperを使ったSRT字幕ファイルの自動作成 プログラミング

「SRT字幕ファイルを自動的に作成したい」
「動画の字幕ファイルを無料で簡単に作成したい」

このような場合には、この記事の内容が参考になります。
この記事では、Whisperを用いたSRT字幕ファイルの自動作成について解説しています。

本記事の内容

  • SRT字幕ファイル自動生成システムの仕様
  • システム要件
  • 動作確認

それでは、上記に沿って解説していきます。

SRT字幕ファイル自動生成システムの仕様

2022年9月末にWhisperという音声認識モデルが、公開されました。
Whisperのインストールは、次の記事で解説しています。

正直、WhisperはとんでもないAIです。
上記記事内では、簡単な検証を行っています。
その検証結果からでも、Whisperの凄さに驚きました。

しかし、今回の結果(動作確認)ではさらに驚きました。
「Whisper 半端ないって!」という感じです。

この記事を最後まで読めば、そのヤバさがわかるでしょう。
さて、肝心の仕様を説明しておきます。

仕様と言っても、完全にWhisper頼りです。
Whisperの機能を活かして、SRTファイルに必要なデータを取得します。

test.mp3

具体的には、上記音声からは 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.62016年12月23日2021年12月23日
3.72018年6月27日2023年6月27日
3.82019年10月14日2024年10月
3.92020年10月5日2025年10月
3.102021年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」をもとに字幕を埋め込んだ動画を紹介しておきます。

AI音声認識Whisperで自動生成したSRT字幕ファイルを利用した動画

字幕を動画に埋め込む方法は、次の記事で解説しています。

タイトルとURLをコピーしました