ブログに戻る

SRTファイルを翻訳してもタイミングを崩さない方法

SRTファイルを翻訳してもタイミングを崩さない方法を解説。一般的な翻訳ツールがタイムコードを壊す理由、崩れない4つの方法、壊れたファイルを一行で見抜くチェック方法に加え、翻訳で文字数が増えて読み上げ速度が崩れる理由まで紹介します。

2026年9月20日
Sablate Team

SRTファイルを翻訳してタイミングを保つには、ファイルを1つの文章として扱うツールではなく、字幕の形式を解釈するツールを使ってください。形式を解釈するツールはブロック番号、タイムコード行、テキストという3つを別々のものとして読み取り、そのうち3つ目だけを翻訳し、残り2つは元のとおりに書き戻します。

壊れた翻訳字幕ファイルは、たいてい同じ原因にたどり着きます — ファイル全体を、どの行が構造を支えているかを知る由もない汎用の翻訳ツールに丸ごと入れてしまったことです。

SRTを翻訳するとなぜタイミングが崩れるのか?

SRTのブロックは4つの要素からできており、そのうち言語であるものは1つだけです:

2
00:00:04,120 --> 00:00:06,480
The timings live on the line above.
A translator must never touch it.

番号はキューを識別します。コンマ区切りのミリ秒と-->の矢印を含むタイムコード行は、タイミングそのものです。テキストは字幕本文です。そして空行は、パーサーにブロックが終わったことを伝える区切りです。

汎用の翻訳ツールは、この4つをまとめて1つの文書として見ます。00:00:04,120 --> 00:00:06,480を構文として特別扱いする理由がないため、たいてい次の3つが同時に発生します:

  1. キューが結合される。 ブロックとブロックの間の空行は、文章として扱う翻訳ツールにとってはただの空白であり、往復の過程でそれが失われると、2つのキューが1つの段落になってしまいます。その時点より後のすべてが、音声とずれた状態になります。
  2. ブロックの番号が振り直される、または順序が変わる。 段落の組み替えによって通し番号が入れ替わり、ファイルをそのまま拒否するパーサーもあれば、気づかないまま番号を振り直してキューをずらしてしまうパーサーもあります。
  3. タイムコードの書式が変わる。 矢印の前後にスペースが加わる、コンマがピリオドに変わる、ミリ秒の桁の埋め方が変わる — こうしたことのどれか1つでも、その行は解析できなくなります。

翻訳ツールとは無関係な、4つ目の失敗もあります。エンコーディングです。 アクセント付き文字や非ラテン文字を含むファイルをUTF-8ではなくLatin-1やWindows-1254で保存すると、開くプレイヤーの半分で文字化けして表示されます。すべての字幕ファイルをUTF-8で保存しておけば、この問題は永久になくなります。

厄介なのは、壊れたファイルをざっと見ただけでは、たいてい問題なさそうに見えてしまうことです。テキストは正しい言語で書かれ、タイムコードもそこにあり、何も違和感を訴えてきません。実際に破綻するのは、プレイヤーがそれを解析しようとしたときであり、さらに悪いことに、解析はできても2秒ずれて再生される場合もあります。

SRTを翻訳する4つの方法

最速のものから、最もコントロールが効くものへ:

  1. Subtitle Edit — 無料、オープンソース、翻訳機能を内蔵、ローカルで動作。
  2. 形式を解釈するオンライン翻訳ツール — ファイルをアップロードすれば、翻訳済みのファイルが返ってくる。
  3. 厳密なプロンプトを使うLLM — 用語のコントロールは最も効くが、検証が必須。
  4. 翻訳をレイヤーとして扱うデスクトップアプリ — 1つのタイムラインから複数言語を作れる。

この4つはいずれも、正しく使えばタイムコードをそのまま保てます。違うのはコスト、プライバシー、そして何言語分を作るかという点です。

方法1: Subtitle Edit

無料の選択肢であり、ほとんどの人がまず試すべき方法です。

Subtitle Editはオープンソースで、Windows・macOS・Linuxで動作し、メモリ上でテキストだけを置き換えてブロック構造にはそもそも手を加えないAuto-Translate機能を備えています。エンジンも複数選べます — キーを持っていればDeepLやGoogle、自前でホストするならLibreTranslate、そしてOllama・llama.cpp・任意のOpenAI互換エンドポイントによるローカルモデルです。

  1. Subtitle Editで.srtを開く。
  2. Auto-Translateを選び、エンジンと翻訳先の言語を選ぶ。
  3. リスト表示で結果を確認する。原文と翻訳が左右に並んで表示される。
  4. 新しいファイルとして、UTF-8で保存する。

知っておく価値があるのはローカルモデルという選択肢です。APIキーが不要で、何もマシンの外に出ないため、このページで唯一、無料かつプライベートな方法になります。ただし小さなローカルモデルは、ヨーロッパ言語間の翻訳においてDeepLよりも明らかに精度が落ちるという代償があり、編集の手間は増えます。

方法2: 形式を解釈するオンライン翻訳ツール

ファイルをアップロードし、言語を選べば、結果をダウンロードできます。DeepL.srtを文書の一種として受け付け、構造を保ったまま翻訳済みの.srtを返します。何件処理できるかはプランによって決まります。字幕翻訳に特化した複数のサイトも、同じことを行っています。

1つのファイルを1つの言語にするだけなら最も速い方法であり、主要なヨーロッパ言語間の翻訳品質は、設定を一切いじらなくても4つの方法の中で最も高くなります。

使う前に知っておくべきことが2つあります。ファイルをアップロードする方式なので、未公開のカット、クライアントの映像、社内会議の録画など、機密性のあるものには向きません。また文書翻訳ツールは用語をコントロールできません。製品名、キャラクター名、専門用語もほかのすべてと一緒に翻訳されてしまい、名前に関してはまさに望ましくない結果になります。

方法3: 厳密なプロンプトを使うLLM

4つの方法の中で用語のコントロールが最も効くのは、この方法です。モデルに何を翻訳しないかを指示できるからです。ただし、気づかないうちにファイルを壊してしまう可能性が最も高い方法でもあるため、検証の工程は省略できません。

実際に使えるプロンプトです:

Translate the subtitle text below from English into German.

Rules:
- Output exactly the same number of subtitle blocks as the input.
- Copy every block number and every timecode line unchanged, character for character.
- Translate only the subtitle text lines.
- Keep the blank line between blocks.
- Do not merge, split, reorder or renumber blocks.
- Do not translate these terms: [list product and character names here]
- Keep each translated line roughly the length of the original.

2時間分の映画を一度に貼り付けるのではなく、50〜100ブロックのまとまりごとに作業してください。入力が長くなるほど、モデルはキューを結合したりブロックを落としたりし始め、しかもそれを何も言わずにやってしまいます。

そのうえで検証してください。次の一行で、両方のファイルのタイムコード行の数を数えられます:

grep -c " --> " original.srt translated.srt

2つの数は完全に一致していなければなりません。翻訳後の数が少なければブロックが結合されたということであり、結合より後のすべてのキューが誤った状態になっています。LLMによる翻訳では、このチェックを毎回必ず行ってください。

方法4: ファイルではなくレイヤーとして翻訳する

ここまでの3つの方法には共通の形があります。1つのファイルから、もう1つのファイルを作るという形です。8言語欲しければ、それを8回繰り返し、8個のファイルを管理することになります。

デスクトップアプリなら、代わりに1つのタイムラインを保ち続けられます。Sablateでは、翻訳は新しいジョブではなく、既存の文字起こしに追加されるレイヤーです — キューの境界は一度だけ作られ、すべての言語がそれを引き継ぐため、タイミングの問題は二度と発生しません。各レイヤーは独自のスタイルと独自の文字体系フォントを持っており、これはキャプション用フォントがカバーしていない文字体系がある言語で必要になった瞬間に大きな意味を持ちます。

翻訳の経路は2つ用意されています。Argosはあなたのマシン上でオフラインで動作し、どこにも何も送信しません。DeepL、OpenAI、Claudeは、自分のAPIキーを用意すれば使えます。オフライン経路について正直に触れておくべき点が1つあります。Argosが公開しているパッケージは英語を片側に含むペアが中心であるため、トルコ語からドイツ語のような組み合わせには直接のパッケージがなく、英語を中間ホップとして経由する形で構成されます。それでも機能はしますが、トルコ語からドイツ語への行は、トルコ語から英語への行に比べてわずかに硬く読めます。

無料プランでは、10分までの動画で1ジョブにつき1つのオフライン翻訳レイヤーを使えます。無制限のレイヤー、クラウドエンジン、全言語のワンクリック書き出しはProに含まれます。WindowsまたはMac版をダウンロードして、何かを決める前に1つのファイルで翻訳を試してみてください。

どの方法を使うべきか?

方法コストオフライン動作用語のコントロール向いている用途
Subtitle Edit無料対応、ローカルモデルを使えば部分的1ファイル、任意の言語ペア
オンライン文書翻訳ツール無料枠あり、以降は有料非対応非対応ヨーロッパ言語間で最速かつ良好な結果
厳密なプロンプトを使うLLMモデルによる対応、ローカルモデルを使えば対応専門用語、固有名詞、独自の用語集
Sablate無料枠あり、Proは$29買い切り対応対応1つの文字起こしから複数言語

「ファイルは1つだけで、予算はない」 Subtitle Editです。無料で、このリストの中でも形式を扱う作業においては最も能力の高い字幕ツールであり、タイミングを壊すこともありません。

「最高品質のドイツ語訳が必要で、ファイルは機密ではない」 文書翻訳ツールです。DeepLの英語からドイツ語への出力は、ここで挙げた中で最も編集の手間が少なくて済みます。

「動画が機密情報である」 ローカルモデルを使ったSubtitle Edit、またはSablateのオフライン経路です。どれだけ性能が良くても、アップロードする方式はすべて対象外になります。

「同じ動画を6言語で公開する」 ファイル単位ではなく、レイヤーです。ファイル単位の方法は6倍に膨らみますが、レイヤーによるワークフローはそうなりません。多言語ワークフローでは、何かを始める前に文字起こしを丁寧に校正しておくべき理由を解説しています。

タイミングを二度と崩さないためには

3つの習慣を、時間の節約効果が大きい順に紹介します。

すべての翻訳でブロック数を検証する。 先ほどのgrepの一行は2秒で終わり、見た目では気づけない唯一の失敗を検出してくれます。翻訳後のファイルの数がソースより少なければ、それは例外なく壊れています。

読み上げ速度は、文字起こしの後ではなく翻訳の後に確認する。 タイミングは無事でも、テキストの長さは同じではありません。英語からスペイン語やフランス語への翻訳は通常20〜25%長くなり、ドイツ語では35%に達することもありますが、表示時間はどちらも変わりません。快適な14 CPSの行が、タイムスタンプを1つも動かさないまま17.5 CPSの行になってしまいます — 読み上げ速度の上限ではその対処法を扱っていますが、答えは常に文言か表示時間を変えることであり、同期を変えることでは決してありません。

元の文字起こしをマスターとして扱う。 何かを翻訳する前に、そこで名前、専門用語、句読点を修正してください。ソースで直した姓は、すべての言語で直ったことになります。あとから同じ姓を直すとなると、言語ごとに1回ずつ編集することになり、修正内容にもずれが生まれます。

これを動画に焼き込む場合は、必ず最後に行ってください。焼き込んだコピーの読み上げ速度は、あとから変更できません。そして書き出す形式が、視聴者が言語を切り替えられるかどうかそのものを決めてしまいます。

翻訳するのは動画ではなく、ファイルです。すでに対価を払って手に入れたタイムラインを保ち、労力はその上に乗る言葉に注ぎ、書き出す前にブロック数を確認してください。