ブログに戻る

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つのファイルで翻訳を試してみてください。

字幕をオフラインで翻訳する方法

4つの方法のうち2つは、完全に自分のマシン上で動作します。台本が機密である場合や、安定した接続がない場合に役立つ方法で、ローカルモデルを使うSubtitle Editと、SablateのArgosレイヤーです。どちらもテキストだけを翻訳してタイムコードはすべて保つため、前述のタイミングの問題はどちらにも当てはまりません。

Subtitle EditとローカルモデルSablateとArgos
インストールするものOllamaまたはllama.cppとモデルを入れ、Subtitle Editをそこに向ける追加は不要。言語パックはアプリ内で1度だけダウンロードされる
対応言語選んだモデルが扱える言語原文の言語を問わず、翻訳先は約50言語。ほとんどのペアは英語を経由する
翻訳品質モデルの大きさ次第。ヨーロッパ言語のペアではDeepLに及ばない直訳調だが読める。DeepLや最新のLLMには及ばない
用語のコントロールプロンプトで、そのまま残す用語を指定できる翻訳側にはない。名前はあとで検索と置換で直す
コスト無料無料プランではジョブごとにオフラインレイヤー1つ、Proなら無制限

どちらを使う場合も、先に期待値を決めておいてください。オフラインの翻訳ツールはDeepLや最新のクラウドLLMよりずっと小さなモデルで、その差は訳文に出ます。訳は直訳調になり、慣用句は単語ごとに訳され、訳してはいけない名前が訳されてしまうこともあります。Argosには、さらに独自の制約があります。パッケージのほとんどは、ある言語と英語を組にしたものです。そのため、トルコ語からドイツ語のような組み合わせは、英語を経由する2回続けての翻訳として実行され、両方の誤りを引き継ぎます。

そのため、オフライン翻訳が向いているのは、作業用の下書き、自分が話せない言語の映像を把握したいとき、自分で見直せる言語に訳すときです。チームの誰も読めない言語で公開する字幕は、先にオフラインで翻訳してから結果を確認してもらうか、その言語のレイヤーだけを自分のキーを使ってDeepLまたはLLMに切り替えてください。そもそもの文字起こしを作る、ほかのオフラインツールについては、オフライン字幕生成ツールの比較で比較しています。

どの方法を使うべきか?

方法コストオフライン動作用語のコントロール向いている用途
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回ずつ編集することになり、修正内容にもずれが生まれます。

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

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

よくある質問

SRTファイルを翻訳してもタイミングを崩さないようにするにはどうすればいいですか?

SRTをプレーンテキストとして扱うツールではなく、SRTの形式を解釈するツールを使ってください。形式を解釈するツールはブロック番号、タイムコード行、テキストを別々に読み取り、テキストだけを翻訳して残りはそのまま書き戻します。Subtitle Editはこれを無料で行え、DeepLはSRTを文書として受け付けます。

字幕をオフラインで翻訳できますか?

できます。Subtitle EditはOllamaまたはllama.cpp経由のローカルモデルで翻訳でき、SablateはArgosで言語ごとのレイヤーとして翻訳します。Argosは言語パックを1度ダウンロードすれば、その後は接続なしで動作します。どちらもタイミングは保たれます。ただし訳文は直訳調になります。オフラインのモデルはDeepLやクラウドのLLMより小さいため、公開するものは必ず見直してください。

Google翻訳がSRTファイルを壊してしまうのはなぜですか?

ファイル全体を1つの文章として認識してしまうからです。一般的な翻訳ツールにとっては、タイムコードもブロック番号もタイムスタンプの間の矢印もすべて翻訳対象のテキストにすぎないため、書式を変え、区切りの空行が失われたキューを結合し、段落を組み替える際にブロックの番号を振り直してしまいます。その結果、ファイルが正しく解析できなくなることが多いです。

SRTファイルを無料で翻訳することはできますか?

できます。Subtitle Editは無料のオープンソースソフトで、Windows・macOS・Linuxで動作し、インターネット接続が不要なローカルモデルを含む複数の翻訳エンジンを内蔵しています。無料のオンライン字幕翻訳サービスも存在しますが、ファイルをアップロードする仕組みのため、内容が機密情報の場合は注意が必要です。

翻訳した字幕は元のタイミングにきちんと収まりますか?

タイミングには収まりますが、読み上げ速度には収まらないことがよくあります。英語からスペイン語やフランス語への翻訳では文字数が通常20〜25%増え、ドイツ語では35%に達することもありますが、表示時間は変わりません。キューの境界は正しいままなのに、行だけが読み切れないほど速くなってしまいます。

翻訳後のSRTファイルがまだ正しいかどうかは、どうやって確認すればいいですか?

両方のファイルのタイムコード行の数を数えて比較してください。元のファイルが412行で翻訳後が389行であれば、ブロックが結合されたか失われたことになります。そのうえで翻訳後のファイルを動画と一緒にプレイヤーで再生し、最初のキュー、最後のキュー、そして途中の速いやり取りを1か所確認してください。

字幕ファイルは翻訳すべきですか、それとも対象言語で文字起こしをやり直すべきですか?

翻訳してください。言語ごとに音声認識をやり直すと、言語ごとに異なるキューの区切りができてしまい、ある言語で同期を直しても他の言語には反映されません。テキストを翻訳すれば、追加するすべての言語で正しいタイムラインを1つだけ使い回せます。