SRTやVTTの字幕ファイルからきれいなテキストを抜き出す方法
字幕ファイルからセリフだけを取り出すのは簡単そうに聞こえますが、キュー番号やタイムスタンプ、文の途中での分割に当たると途端に厄介になります。正しいやり方を解説します。
字幕ファイルには、インデックス番号、タイミング範囲、実際のテキストという3つの情報が入り混じって保存されています。欲しいのがテキストだけ(ブログの引用、記事、検索インデックス、他のツールへの入力など)であれば、タイミングと番号は取り除くべき雑音にすぎません。
手作業での対処法と、それが崩れる場面
タイムスタンプ行(\d{2}:\d{2}:\d{2}[,.]\d{3}\s*-->\s*...)に対する正規表現での一括置換は、わかりやすいケースには対応できます。しかし、以下のような場面で破綻します。
- テキストに見えるキュー番号。 単独の行にある
42のような数字は、キューのインデックスかもしれませんが、まれに実際のセリフ(キャラクターが数字を読み上げる場面など)である可能性もあります。単純なストリッピングでは、大量のデータの中でこの違いを確実に見分けられません。 - 複数のキューに分割された文。 字幕は文法のためではなく、画面上での読みやすさ(おおよそ数秒ごとに1行)を基準に分割されています。1つの文が2つ、3つの連続したキューにまたがることは珍しくありません。フラグメントを結合せずにタイミング行だけを取り除くと、流れるような文章ではなく、途切れた文の断片だけが残ってしまいます。
- インラインの書式タグ。
<i>、<b>、そしてVTTの話者・色タグ(<v Speaker>、<c.colorname>)もすべて取り除く必要があります。そうしないと、出力の中にそのまま角括弧付きのテキストとして残ってしまいます。 - 改行コードの混在。 異なるツールやOSからエクスポートされたファイルでは、
\r\nと\nが混在していることがあり、一方を前提にした正規表現を崩してしまう場合があります。
良い出力とはどのようなものか
正しく抜き出されたテキストは、通常の文章のように読めます。完結した文、自然な間で入る段落区切り、余計な数字やタイムスタンプの断片がなく、書式タグの残骸もありません。目指すべきは、字幕形式だった痕跡がまったくない、最初から誰かがセリフをそのまま文字起こししたかのような文書です。
手作業でのクリーンアップなしで行う
当サイトのSRT to TXT 変換ツール(対応するVTT to TXT 変換ツールも同様)は、これをすべて自動で処理します。キュー番号とタイムスタンプを除去し、タグを取り除き、複数のキューに分割されていた文を自然な段落に結合します。すべてブラウザ内で完結するため、ファイルがどこかに送信されることはありません。