迅速・正確・お手軽文字起こし!大規模言語モデルWhisperを用いた無料字幕作成法【コピペでOK】
はじめに
この記事では,人類史上最高精度と話題の大規模言語モデルWhisper(chatGPTで有名なOpenAIが公開している)を用いて,音声ファイルから字幕ファイルを生成する方法(しかも無料!)を紹介します.自分自身,C言語やJavaScript,Swiftを少し触った経験はあるものの,PythonやGoogle Colabは初めての利用でした.しかし,日本語での情報が少なく,なかなか思うようにいきませんでした.そこで,初心者でもコピペで簡単に試せるような記事を書いてみることにしました.
【想定している前提知識】
Google Colabの基本的な使い方
音声ファイルや字幕ファイルの形式に関する基本的な知識
【この記事でできるようになること】
Google Colab上でWhisperを実行できる
音声ファイル(mp3など)から,高精度な文字起こしを行える
srt形式の字幕ファイルを作成できる
上記の操作を無料で実行できる
なお,OpenAIのAPIを利用する方法もありますが,その場合はAPIの使用料がかかります.ここではAPIを利用しない方法を紹介します.
実際の操作手順
Google Colabを利用します.ローカル環境でも同様に実行できることを確認済みですが,当方のマシン(Macbook Air M2)では,当然Colabの方が処理速度が速いです.
⓪準備
Colab上で新規ノートブックを作成し,編集>ノートブックの設定 を開き,ハードウェア・アクセラレータにGPUを選択してください.
①ライブラリのインストール
!pip install -q git+https://github.com/openai/whisper.git
!pip install -q pysrt
Whisperとpysrt(srtを生成するためのライブラリ)をインストールします.他にffmpegも必要ですが,Colabにはデフォルトでインストールされているようです.
②モデルのロード
import whisper
import ffmpeg
import pysrt
model = whisper.load_model("large")
Whisperのモデルをロードします(1分程度かかります).ここでは最も高品質のlargeを指定していますが,medium等も指定することができます(が指定する必要性はない).
③ソースファイルの指定
audio_source = "ファイルのパスを指定" #@param {type: "string"}
ソースファイルのパスを指定します.インプット・フォーム内にパスを記入し,実行ボタンを押してください.
ソースファイルを直接アップロードすることもできますが,予めGoogle Driveに保存しておき,Google Driveをマウントする方が速そうです.なお,ファイルのパスは「パスをコピー」を選択すれば楽です.
④文字起こしの実行
result = model.transcribe(audio_source, verbose=True, language='ja')
print(result["text"])
subs = pysrt.SubRipFile()
sub_idx = 1
for i in range(len(result["segments"])):
start_time = result["segments"][i]["start"]
end_time = result["segments"][i]["end"]
duration = end_time - start_time
timestamp = f"{start_time:.3f} - {end_time:.3f}"
text = result["segments"][i]["text"]
sub = pysrt.SubRipItem(index=sub_idx, start=pysrt.SubRipTime(seconds=start_time),
end=pysrt.SubRipTime(seconds=end_time), text=text)
subs.append(sub)
sub_idx += 1
subs.save(audio_source+".srt")
文字起こしを実行し,字幕ファイル(srt形式)を保存します.
途中経過と最終的なテキスト全体も出力します(字幕形式でないテキストが必要な場合はここからコピペしてください).
ここでは,言語に日本語を指定していますが,変更したり,指定を外して自動認識にすることも可能です.
記事に賛同してくださる方,なんらかの学びが得られたと感じてくださった方は,経済的に余裕のある範囲で投げ銭をいただければ幸いです.