Geminiで無料でVTT字幕を生成する

動画の字幕作成については、これまで何度も試行錯誤を繰り返してきましたが、「これだ!」と思えるおすすめの方法を見つけました 。

今回は、Googleの生成AI(Gemini)の「Gem共有(カスタムAIエージェント)」を活用して、高精度なVTT字幕を生成するプログラムを作成しましたので紹介します 。

最大の特徴は、サブスクリプション不要(無料)で実践できるという点です 。(※Googleアカウントは必要です 。)

Geminiの文字起こし精度は非常に高く、後から手直しする手間が劇的に減ります 。無料枠の制限を賢く回避しつつ、面倒な作業は、Macクイックアクションで自動化する、実践的なワークフローを公開します。

解説動画をご覧ください。

字幕一覧(クリック)

(00:00:00) 〜無料でGem共有でvtt字幕生成〜
(00:00:14) 今回は、えーGem。Gemというのは、あのーGoogleのAIエージェントですけれども、
(00:00:24) それを使って、VTT字幕の生成を行うプログラムを作成したので紹介します。
(00:00:36) 動画の字幕作成については、これまで何度も取り上げてきました。
(00:00:43) でもまあ、なかなかここで満足ということにはなりませんが、
(00:00:48) 最近これが結構おすすめという方法を見つけましたので紹介します。
(00:00:56) 生成AIを使う方法です。
(00:01:00) サブスクなしで、お金を使わないでできる方法ですのでご心配なく。
(00:01:11) ただし、Googleアカウントは必要になります。
(00:01:16) まず、字幕を作りたい動画を用意します。
(00:01:21) 今回ですね、一つ10分弱の動画をですね用意しました。
(00:01:29) VTT作成用にこの動画を分割します。
(00:01:34) その理由はGeminiのGemを使うとき、特に無料アカウントで使うときは、
(00:01:42) 動画は5分以内という制限があるからです。
(00:01:49) この動画をですね、右クリックします。
(00:01:52) クイックアクション、このクイックアクションの中から、
(00:01:59) あらかじめ自作した「字幕用に動画を分割する」これを選びます。
(00:02:20) すると、分割する基本秒数を入れてください、と出てきます。
(00:02:28) デフォルトは270秒になっています。つまり4分30秒になっています。
(00:02:36) でもこれは4分30秒のところでバサッと分割するのではありません。
(00:02:44) 4分30秒付近で1秒間の無音になる部分を探して、
(00:02:51) その無音が開始する場所で分割するようになっています。
(00:02:58) 分割ファイルはsplit_01_02...と、いうように分割されていきます。
(00:03:31) えー、split_01、02、03と3つのファイルに分割されました。
(00:03:39) で、あと一つ、offsets.txtというファイルも出来上がってます。
(00:03:46) それではこのoffsets.txtというファイルを開いてみます。
(00:03:52) すると、ここにですね、分割したファイルの開始時刻が入っています。
(00:04:02) 01、02、03、ここにズレ0秒、ズレ245.130秒
(00:04:09) ズレ443.475秒となっています。
(00:04:19) これは後で使うことになります。まあ、あることだけを覚えておいてください。
(00:04:25) 一応これを見て、確かにそのそれぞれが5分以内で分割されていることは確認できます。
(00:04:35) 一つ目が245秒、二つ目が、まあ200秒ぐらい、三つ目はですね、
(00:04:44) 全体で9分41秒、つまり9分41秒、443秒だから、えー、
(00:04:53) 7分、7x6=42、7分ちょっとのところで終わりますので、
(00:05:04) あと残りが2分ちょっとですかね。その部分が03になるはずです。
(00:05:13) 確かに3つのファイルがですね、5分以内で分割されています。
(00:05:24) えっと、次にですね、Gemで作ったこのVTT形式のコードを作成するプログラムですね、
(00:05:37) これを開きます。これがそれです。
(00:05:45) えー、このGemはですね、公開してますので、ブログにつけます。
(00:05:53) モードはですね、あの、Proモードを選択してください。
(00:06:01) で、下のボックス、ここにですね、今作った分割された動画をドロップします。
(00:06:11) コピーアンドペーストします。まず一つ目コピー、
(00:06:18) ここにペーストします。で、ここに入れるのはただこれだけです。
(00:06:30) で、これでこの「Go」、送信の矢印を押してください。
(00:06:40) そうすると作業が開始します。しばらく待ちます。
(00:07:33) しばらく待ちますと、このようにVTTコードが出力されます。
(00:07:41) これをコピーして、拡張子がVTTのファイルにペーストします。
(00:07:54) えーと、これをコピーして、拡張子がVTTのファイルにペーストします。
(00:08:10) あの、このVTTファイルは、あらかじめ用意しておいてください。
(00:08:17) 私はあの以前に作ったVTTファイルをですね、コピペして名前を変えて、
(00:08:28) 中身を削除して作っておきました。この3つですね。
(00:08:33) それではこの01にですね、ペーストします。ここのコードをコピー。
(00:08:43) えー、そして、ファイルにペースト。という形ですね。
(00:08:58) 保存。ということで、01番ができました。
(00:09:14) 同じようにしてですね、02以降も作るんですけども、
(00:09:21) この同じセッションの中にですね、複数の動画があると、なかなかうまく受け付けてくれないので、
(00:09:30) 新しいセッションで同じことを繰り返すようにしてください。
(00:09:42) こういう形で新しいセッションを開きます。そしてこの02ですね。これをコピーして、
(00:09:57) 貼り付けます。Proモードにして、
(00:10:12) Proモードにして、送信します。
(00:10:38) はい、コードができました。そしたらこれをコピーして、
(00:10:47) 02番のVTTファイルにペーストします。
(00:11:12) 同じように03番も作ります。
(00:11:39) 送信。
(00:11:58) えーと、できましたのでコードをコピーして、
(00:12:06) 03VTTに貼り付けます。
(00:12:23) こうして作るとお気づきのように、02以降のですね、動画の時刻は0秒からの開始になってしまっています。
(00:12:39) 秒ずらしの作業を行います。
(00:12:45) この時に先ほど見たoffsets.txtの中の秒がずらし秒になってきます。
(00:12:58) vttファイルの上で右クリックしてクイックアクションから「字幕時刻の秒ずらしを行う」を選びます。
(00:13:22) ここでさっきの秒数を入れます。245.130秒。これ入れましてOKを押します。
(00:13:48) timeshifted.vttができて245.130秒、つまり4分何秒かを加算したファイルができあがってます。
(00:14:13) 同じように03も秒ずらしを行います。今度は443.475。同じようにファイルができてます。
(00:14:51) 7分24秒ぐらいのところからのスタートに置き換わっています。
(00:15:04) 秒ずらしが済んだら結合したvttファイルを作ります。あらかじめbinded.vttを用意します。
(00:15:17) この中に3つのvttファイルをコピペします。まず01は時刻ずれなしでそのままペーストします。
(00:15:45) 次に02_timeshifted.vttです。この連番以降のところをコピーして貼り付けます。
(00:16:18) 次に03_timeshifted.vtt、これも番号以降のところをコピーして貼り付けます。以上ですね。
(00:16:45) 全部1つのファイルにバインドされました。保存します。
(00:16:54) ところがこれはすでにお気づきのように1からスタートした箇所が3箇所あるわけですね。
(00:17:08) ここにもありますし、それから、
(00:17:15) あ、ここにもあると。3箇所あります。
(00:17:18) これを連番が全部通しで1番から開始するように、番号の振り直しをします。
(00:17:37) このbinded.vttの上で右クリックして、
(00:17:41) クイックアクションの中から、
(00:17:47) この「字幕VTTの連番を付け直す」、これを選びます。
(00:17:58) すると、renumbered.vttが出来上がります。
(00:18:07) これは1番からですね。ずっと連番で、
(00:18:18) 67番までですか。ここまで繋がってます。
(00:18:26) それで言葉遣いの修正とかテキストの修正は、ここまで形が整った後で行うのがいいと思います。
(00:18:38) 地味にコツコツとやる方法ではありますが、仕組みとして分かりやすいので作業のストレスは感じません。
(00:18:51) この方法が優れているのは、GeminiのGems、これの文字起こしの精度が非常に高いということです。
(00:19:03) 手直しするところはとても少ないです。満足できると思います。
(00:19:10) 以上、Gemsを使ったVTTコード作成の紹介でした。
(00:19:17) コード類はブログ記事に掲載しますのでご利用ください。

要約:
「VTT作成用に動画を分割する」ワークフローは、ユーザーが指定した基本秒数を基に、動画を無音区間で自動分割し、VTTの「秒ずらし」に役立つオフセット記録を生成します。ffmpegとPythonスクリプトを連携させ、再エンコードなしで高速分割します。
「字幕時刻の秒ずらしを行う」ワークフローは、選択したVTTファイルの全タイムスタンプを、ユーザーが入力した秒数だけシフト(前後にずらす)させ、新しいVTTファイルを出力します。awkを用いて精密な時間計算を行います。
「VTTの連番を付け直す」ワークフローは、VTTファイル内の古い連番や不要なヘッダを削除し、字幕ブロックに正しい連番を振り直して整理されたVTTファイルを生成します。
これらのワークフローは、それぞれ動画の分割、字幕の時間調整、字幕ファイルの整理という異なる課題に対応し、VTT作成・管理作業を自動化・簡素化することを目的としています。
添付の動画の音声から字幕用のvtt形式のコードを出力します(Gem共有)。
公開スクリプトに関するお問い合わせは以下へ↓

解決すべき課題:Geminiの「5分の壁」

Geminiに動画を読み込ませて文字起こしをする際、特に無料アカウントでは「動画は5分以内」という制限があります 。 今回紹介するワークフローは、事前の「動画分割」と、事後の「タイムスタンプ調整(秒ずらし)」を組み合わせることで、この壁をストレスなく突破します。

長時間の動画からVTT字幕を生成する6つのステップ

ここでは、例として10分弱の動画に字幕をつける手順を解説します 。

1. 動画の準備

まずは手元に、字幕を作成したい元の動画ファイルを用意します 。

2. 基本秒数の設定と動画の分割(自動化ツール)

動画を5分以内のパーツに分けます 。

  • 用意した動画を右クリックしクイックアクションから自作の「字幕用に動画を分割する」を選択します 。
  • 分割する基本秒数を入力します(デフォルトは270秒=4分30秒です) 。
  • ポイント: 単純に時間でバサッと切るのではなく、指定時間付近の「1秒間の無音部分」を探し、キリの良いところで自動分割されるように工夫しています 。
  • 実行すると、split_01、02…という分割動画と同時に、offsets.txtというファイルが生成されます 。このテキストには「245.130秒」といった分割時のズレ(累計秒数)が記録されており、後で使います 。

3. Gemini(Gem)によるVTT字幕作成(手動)

いよいよAIに文字起こしを依頼します。公開している専用のGemを使用します(※リンクは「コードと要約」に掲載します) 。

  • Gemを開き、「Proモード」を選択します 。
  • 下部のメッセージボックスに、分割した最初の動画(01)をドロップ(またはコピペ)して送信します 。
  • しばらく待つと、タイムスタンプ付きのVTTコードが出力されます 。
  • 出力されたコードをコピーし、あらかじめ用意しておいた空のVTTファイル(例:01.vtt)にペーストして保存します 。
  • 注意点: 02以降の動画を処理する際は、AIが混乱するのを防ぐため、必ず「新しいセッション(チャット)」を開いてから同じ手順を繰り返してください 。

4. VTTの秒ずらし(自動化ツール)

出力された02番以降のVTTファイルは、動画の開始時刻が「0秒」にリセットされてしまっています 。これを元の時間軸に戻します。

  • 対象のVTTファイル(02など)を右クリックし、クイックアクションから「字幕時刻の秒ずらしを行う」を選びます 。
  • 手順2で生成されたoffsets.txtに記載されている秒数(例:245.130)を入力し、OKを押します 。
  • 正しい時間にシフトされた _timeshifted.vtt というファイルが新しく作成されます 。

5. VTTファイルの結合(手動)

それぞれの時間軸が整ったら、1つのファイルにまとめます。

  • 結合用の空ファイル(binded.vtt)を用意します 。
  • 01.vttの中身をそのままペーストします 。
  • 続けて、02_timeshifted.vtt、03_timeshifted.vtt の連番以降のテキスト部分を順番にコピーして下に追加し、保存します 。

6. 連番の振り直しと整理(自動化ツール)

結合したファイルは、字幕の通し番号(連番)が「1」から始まる箇所が複数混在してしまっています 。これを綺麗に整えます。

  • binded.vtt を右クリックし、クイックアクションから「字幕VTTの連番を付け直す」を選択します 。
  • これにより、最初から最後まで番号が正しく振り直された完成版 renumbered.vtt が出来上がります 。

まとめ

言葉遣いやテキストの微修正は、このように全体の形が綺麗に整った最後に行うのがおすすめです 。

地味にコツコツと進める手作業の部分もありますが、仕組みが非常に分かりやすいため、作業中のストレスはほとんど感じません 。何より、Gemの文字起こし精度が抜群に高いので、手直し自体が最小限で済むのが最大のメリットです 。

以上