SRT 字幕ファイルを編集するなら Subtitle Edit

久々に SRT 字幕ファイルを扱ったよ…。あまり役には経たないだろうからメモ書きレベルの乱文を投稿。

目次

日本語字幕がない

とある海外の動画を見ようと思ったら、日本語字幕がなかった。

ネットで探してみるとオリジナルの英語字幕が SRT ファイルで配布されていたので、とりあえずそれをダウンロードした。

機械翻訳する

SRT ファイルは、連番・タイムコード・テキストが羅列されているテキストファイル。ただのテキストファイルなので機械翻訳がやりやすい。

「Google 翻訳」はテキストファイルをアップロードして翻訳できるのだが、3000行くらいまでしか翻訳されないので、適当にテキストファイルを分割してアップロードし、あとで結合した。

翻訳したテキストファイルのうち、連番とタイムコード部分は謎に翻訳されて書式が狂うので、使い物にならない。そこでオリジナルの SRT ファイルと翻訳したファイルを利用して、

という SRT ファイルを作る Node.js スクリプトを書いた。

2つのファイルを読み込み、それぞれ空行で区切って配列にする。その配列の1要素について、1・2行目はオリジナル版から取得し、以降の行は2ファイルの内容を交互に出力してやる。

const fs = require('fs');

// ファイルを読み込む
const enFile = fs.readFileSync('./en.srt', 'utf-8');
const jaFile = fs.readFileSync('./ja.srt', 'utf-8');

// 空行で区切る
const enSections = enFile.split('\n\n');
const jaSections = jaFile.split('\n\n');

// 結果テキスト
let result = '';

// 念のため配列の少ない方まででループする
const sectionLength = Math.min(enSections.length, jaSections.length);
for(let sectionIndex = 0; i < sectionLength; sectionIndex++) {
  // 1行ずつ処理する
  const enLines = enSections[sectionIndex].split('\n');
  const jaLines = jaSections[sectionIndex].split('\n');
  
  // 1・2行目はオリジナル版の内容を使用する
  result += enLines[0] + '\n'
         +  enLines[1] + '\n';
  
  // 3行目以降は交互に出力する
  const lineLength = Math.min(enLines.length, jaLines.length);
  for(let lineIndex = 2; j < lineLength; lineIndex++) {
    result += enLines[lineIndex] + '\n'
           +  jaLines[lineIndex] + '\n';
  }
  
  // セクションを区切る空行のためさらに改行を入れる
  result += '\n';
}

fs.writeFileSync('./result.txt', result, 'utf-8');

コレでとりあえず日本語と英語の字幕が両方並んだ SRT ファイルができた。機械翻訳の至らないところはオリジナルの字幕を読んで補完するワケだ。

タイムコードのズレを直す

いざ、作成した字幕ファイルを適用してみたところ、字幕が段々ズレていく。タイムコードのシフトはかなり面倒なので、Subtitle Edit というフリーソフトで調整することにした。

選択した行以降を何秒ズラすか、という操作ができるので、コレで気になるところを修正して、完成。

Subtitle Edit によるタイムコードのズラしが楽で良かった。