Whisper + ChatGPT + HandBrake 字幕付き動画を簡単に作成

以前に、Whisperを使った字幕ファイルの作成を紹介しました。

そこで、以下の2つのフリーソフトを使用して実際に動画に埋め込む作業をしたいと思います。

  • 無料字幕制作ソフト「Subtitle Edit
  • オープンソースで開発されている動画変換ソフト「HandBrake

Subtitle Editは、字幕ファイルの修正・調整をする専用のソフトです。
このソフトだけでは、動画への字幕の合成はできません。

HandBrakeは、この修正・調整した字幕ファイルを動画へ合成するのに使用します。

※別のフリーの動画変換ソフト「MediaCoder」で字幕の合成を試したのですが、
 字幕が早く消えたり抜けたりと、うまく行きませんでした。参考までに。

動画ファイルを準備する

最初に、元となる動画ファイルを準備します。

色々とネット上を探して、やっと見つけた以下の動画にしました。
著作権フリーと記載されていたので、お言葉に甘えさせて頂きます。
https://youtu.be/686es9zYF04


Whisperで字幕ファイルを作成する

Whisperを使った字幕ファイルの作成を参考に、字幕ファイルを作成します。

最初に、「編集」→「ノートブックの設定」から、
ハードウェアアクセラレートを「GPU」に設定しましょう。

以下のコマンドを入力し、Shift+Enterを押して実行しましょう。
GPUの情報が出てくれば、正常に設定変更できています。

!nvidia-smi

さて、ソースを書いていくことにします。

! pip install git+https://github.com/nyanta012/whisper.git
import whisper
model = whisper.load_model("large")
! pip install yt-dlp
! rm input.mp3 
! yt-dlp -x --audio-format mp3 https://youtu.be/686es9zYF04 -o "input.mp3"
! yt-dlp --recode-video mp4 https://youtu.be/686es9zYF04 -o "input.mp4"
# 出力される1文の長さの調整(デフォルト=1.0)
slr = 0.3

result = model.transcribe("input.mp3", segment_length_ratio=float(slr))
#result = model.transcribe("input.mp3", segment_length_ratio=float(slr), verbose=True)
#import pandas as pd
#pd.DataFrame(result["segments"])[["id", "start", "end", "text"]]
! pip install srt

from datetime import timedelta
from srt import Subtitle
import srt

segments = result["segments"]

subs = []
 
for data in segments:
    index = data["id"] + 1
    start = data["start"]
    end = data["end"]
    text = 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("test.srt", mode="w", encoding="utf-8") as f:
    f.write(srt.compose(subs))
!cat test.srt

以下のファイルが作成されれば完了です。

途中、動画ファイルを「input.mp4」で取得していますので、
ファイル名を右クリック→ダウンロードしておきましょう。


英語の字幕ファイルを翻訳する

日本語の動画であれば必要ない作業ですが、適当な素材が見つからなかったため、
今回は翻訳作業が必要となります。

ChatGPTの始め方の記事を参考に、翻訳しましょう。

※長くて途中で出力結果が切れてしまうので、2回に分けて翻訳してもらいました。
 また、続けて入力すると、1回目の翻訳の影響を変に受けてしまったので、
 2回目の翻訳の前に「New Chat」をして初期化しました。

できました。念のため、全出力結果も以下に記載しておきます。「test_ja.srt」とします。

1
00:00:00,000 --> 00:00:03,360
第1章 ウサギの穴の中へ

2
00:00:03,360 --> 00:00:10,960
アリスは姉の傍らに座って何もすることがなく、とても退屈していた。

3
00:00:10,960 --> 00:00:18,960
数回、姉の読んでいる本を覗き込んでみたが、絵や話は何一つなかった。

4
00:00:18,960 --> 00:00:25,200
アリスは、絵や話のない本なんて、何の役に立つのかと思った。

5
00:00:25,200 --> 00:00:33,600
暑い日だったため、アリスはとても眠くて愚かな状態で、自分なりに考えていた。

6
00:00:33,600 --> 00:00:39,600
ヒナギクの鎖を作る楽しみが、立ち上がってヒナギクを摘む手間をする価値があるかどうかを検討していた。

7
00:00:39,600 --> 00:00:44,600
すると、突然ピンク色の目をした白いウサギが近くを走っていくのが見えた。

8
00:00:44,600 --> 00:00:51,400
それはあまりにも珍しいことではなく、アリスもそれほど変に思わなかったが、

9
00:00:51,400 --> 00:00:57,000
ウサギが自分で言ったのを聞いて、ああ、ああ、遅れてしまうと言ったのを聞いたのでした。

10
00:00:57,000 --> 00:01:03,400
後で彼女がそれを考えたとき、彼女はこれに驚くべきだったと思いました。

11
00:01:03,400 --> 00:01:07,200
しかし、当時はそれがすべて自然に思えました。

12
00:01:07,200 --> 00:01:14,600
しかし、ウサギが実際にウエストコートのポケットから時計を取り出して見て、そして急いで去ったとき、

13
00:01:14,600 --> 00:01:25,400
アリスは驚いて立ち上がり、ウサギがウエストコートのポケットやそれから取り出す時計を持っているウサギを以前に見たことがないということが彼女の頭をよぎりました。

14
00:01:25,400 --> 00:01:29,600
そして好奇心に燃えながら、彼女はそれに続いてフィールドを走りました。

15
00:01:29,600 --> 00:01:36,600
そして幸いなことに、彼女はヘッジの下の大きなウサギの穴に飛び込むときにちょうど間に合いました。

16
00:01:36,600 --> 00:01:39,800
もう一瞬で、アリスはその後ろに飛び込んで、

17
00:01:39,800 --> 00:01:44,600
再び世界から出る方法を一度も考えずにいます。

字幕ファイルの調整・修正(Subtitle Edit)

Subtitle Editをダウンロードし、インストールしておきましょう。
デフォルト設定でインストールすれば問題ありません。

先ほど作成した字幕ファイル「test_ja.srt」が、SRT拡張子でソフトに関連付けされたので、
ダブルクリックしてファイルを開きます。

字幕ファイルが読み込まれた状態で、ソフトが起動します。

右下の「波形を追加する」部分(右下の黒い画面部分)に、
動画ファイルをドラック&ドロップします。

上部右側のフォーマットを「Advanced Sub Station Alpha」(ASS形式)に、
エンコードを「UTF-8 without BOM」に変更します。
※SRT形式フォーマットだと文字サイズ情報を与えられないため、ASS形式フォーマットに変更しています。


全体設定

最初に、字幕ファイル全体の設定を行っていきます。

左の字幕が表示されている表のどこかを選択した状態で、「Ctrl+A」で全選択します。
その状態で、上部メニューの「A」と書かれたボタンを押します。

「フォント名」に好きな日本語フォントを指定し、「フォントサイズ」を決めます(30程度かな?)
お好みで色の設定も変更してください。

「OK」ボタンを押すと、全体設定は完了です。


個別設定

表の下のテキストボックス内で文字を選択し、右クリックすると、様々なメニューが出ます。
文字に個別に色を付けたり、太字にしたり、斜字にした可能です。

また、字幕が長すぎて見切れる箇所は、左上の字幕の表で赤く色が塗られます。
同じく、表の下のテキストボックス内で字幕の修正ができるので、改行を加えましょう。

※赤く色が塗られてなくても字幕が見切れている箇所がある可能性があります。

※3行以上になっても赤く色が塗られます。問題ないなら無視しましょう。

右上のプレビュー画面で動画を再生してみて、字幕に調整・修正が必要ないか確認します。

修正が終わったら、「ファイル」→「上書き保存」で字幕ファイルを保存しましょう。


字幕ファイルの合成(HandBrake)

HandBrakeをダウンロードし、インストールしておきましょう。
こちらも、デフォルト設定でインストールすれば問題ありません。

起動時に「.NET 6.0 Desktop Runtime」のインストールを求められる場合があります。
画面に従ってインストールしてください。

ソフトが起動したら、動画ファイルをドラック&ドロップします。

その後、字幕タブの「トラック」「字幕をインポート」を選択し、
先ほどのASS形式の字幕ファイルを読み込んでください。

「Lang」を「Japanese」に、「Burn In」にチェックを入れます。

最後に、上部ボタンの「エンコード開始」ボタンを押すと、動画と字幕の合成が行われます。
下部の保存先ファイルのパスが書かれていますので、確認してみましょう。

実際の完成した動画は以下の通り。
https://youtu.be/t0JV40QLW10(日本語字幕)
https://youtu.be/xseHpJxB92w(英語字幕)


有料ソフトを使用すればもっとスマートにできるのかもしれませんが、
無料ですることに重きを置いているので。

とりあえず、ここまで。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

thirteen − 4 =