書譯
書譯

如何製作雙語字幕:在一個 SRT 或 VTT 檔案中放入兩種語言

製作一份人人可讀的雙語 SRT 或 VTT 檔案:按時間合併、將兩種語言放入同一個字幕 cue、選擇哪種語言在上方,並執行免費檢查工具。

BookTranslator

BookTranslator Team

17 分鐘閱讀

要製作雙語字幕,你需要一個已校時的 SRT 或 VTT 字幕檔、一份保留相同時間軸的譯文,以及每個時間點一個包含兩種語言的字幕 cue:原文行在前,譯文行在後,共用同一個時間戳記。任何能輸出雙語檔案的翻譯工具都會幫你完成這件事;如果你已經有兩個檔案,合併工具也能做到。純 SRT 不需要特殊語法就能實現。

製作檔案是簡單的部分。更難的是,時間軸原本是為單一語言設計的。一個原本容納兩行英文的 cue,現在必須在同樣的幾秒內、同樣的畫面上容納四行。因此,本指南大部分篇幅都在討論合併後需要修正的地方。

我們寫了一個12 個 cue 的測試檔案,產生了西班牙文、中文和阿拉伯文版本,並寫了一個免費檢查工具。這些檔案來自 BookTranslator 自身的字幕寫入程式碼,並在本機執行。我們手動撰寫翻譯,而非呼叫模型,因此這些測試展示的是檔案會發生什麼變化,而非翻譯品質好壞。README 有詳細說明。檢查工具只需要 Python 3,別無其他需求。

快速解答:雙語 cue 長什麼樣子

2
00:00:03,400 --> 00:00:06,600
There's another one at six,
but the station closes at midnight.
Hay otro a las seis,
pero la estación cierra a medianoche.

這是有效的 SRT。每個 cue 保留其編號和時間戳記,時間戳記下方的每一行文字都會同時顯示在畫面上。WebVTT 的運作方式相同。

先選擇設定方式

你想要使用原因
在幾乎任何播放器中觀看,或將單一檔案傳送給他人一個合併的 SRT它就是一個普通的字幕檔,不需要播放器功能
在自己的電腦上觀看,並可控制每種語言在支援雙軌的播放器中使用兩個獨立檔案每種語言保留自己的時間軸,可以移動或關閉
在網頁上以不同大小顯示語言一個 VTT,為每種語言設定一個 classWebVTT 支援樣式;SRT 沒有標準做法
發布一部在任何地方看起來都一樣的影片燒錄式字幕文字成為畫面的一部分,觀眾無法關閉

對於雙軌,mpv 有一個 --secondary-sid 選項。其手冊說明第二軌預設繪製在螢幕頂部,這能讓兩種語言分開。我們沒有親自測試 mpv。

若要燒錄進畫面,FFmpeg 的字幕濾鏡需要包含 libass 的版本。我們為此測試安裝的 FFmpeg 9.0.1 沒有這個功能,所以在規劃之前請先執行 ffmpeg -filters | grep subtitles 確認。我們沒有測試燒錄功能。

步驟 1:將兩種語言放入同一個檔案

如果你只有一個檔案, 請用能輸出雙語檔案的翻譯工具。BookTranslator 對每個 SRT 和 VTT 任務都會這麼做:你會得到一個翻譯檔案和一個時間軸相同的雙語檔案,可以從字幕翻譯工具開始。如果你需要先選擇工具,請參閱我們的字幕軟體比較。

如果你有兩個檔案, 請按時間配對,而不是按字幕編號。合併出錯的地方就在這裡,因為同一部影片的兩條字幕軌很少以相同方式斷行。我們的第二條西班牙語軌將兩個長字幕對半拆分,並省略了音效、年份和音樂。

python3 check_bilingual_subs.py merge sample-source.srt sample-es-own-timing.srt -o merged.srt

按字幕編號配對(腳本的 --index 選項)在 12 個字幕中錯了 10 個,從第 2 個字幕開始,一半的西班牙語消失了。到了第 3 個字幕,翻譯已經屬於不同的台詞:

3
00:00:06,800 --> 00:00:08,000
So where do we wait?
pero la estación cierra a medianoche.

按時間配對則在 9 個字幕下給出了正確的翻譯,讓 3 個沒有西班牙語的字幕保持原樣,並回報了一行沒有匹配到任何內容的西班牙語,讓你可以手動放置。腳本會將第二軌的字幕分配給與其重疊最多的第一軌字幕,只要重疊部分至少佔其長度的一半。像 submerger 這樣的工具也能合併檔案;我們沒有測試過。無論你使用什麼工具,請在第一次拆分後抽查字幕。

步驟 2:檢查檔案

python3 check_bilingual_subs.py check sample-source.srt sample-es-bilingual.srt --max-target-cps 17

它會將雙語檔案與來源比對,並假設原始台詞在前,所以請在交換順序之前執行。如果頂部台詞與來源不符,它會警告你。以下是它在西班牙語檔案中發現的問題:

字幕秒數行數原始字元/秒西班牙語字元/秒問題
23.2419.417.8四行,西班牙語太快
52.726.77.0文字中有 '
71.024.04.0相同文字重複兩次
81.821.71.7相同文字重複兩次
91.2420.822.5四行,兩種語言都太快
103.6218.319.4兩行都超過 42 個字元,西班牙語太快

第 6 和第 12 個字幕也回報了四行。其他四個字幕則沒問題。

速度和行長限制來自 Netflix,因為它的數字公開且具體,並且因語言而異。其英語指南允許每行 42 個字元、兩行,成人節目每秒最多 20 個字元。其拉丁美洲西班牙語指南允許翻譯字幕每秒 17 個字元,而其簡體中文指南允許每行 16 個字元、每秒 9 個字元。因此,中文請使用 --max-target-line 16 --max-target-cps 9。這些指南一次只涵蓋一種語言,最多兩行。我們不知道有針對一個字幕中兩種語言的同等標準,所以檢查器的預設值(螢幕上三行)以及下一節的所有內容,都是我們的判斷。

檢查器還會印出一個合併數字,在第 9 個字幕達到了每秒 43.3 個字元。不要試圖修正這個數字。沒有人會全神貫注地閱讀兩種語言的每一個字元。把它當作值得注意的字幕的指標。

步驟 3:修正四行的字幕

這就是四行字幕的代價。在 Chromium 內建的字幕顯示中,於 1280x720 的畫面下,兩行英文 cue 佔了畫面高度的 10.6%,而同一條 cue 加上西班牙文後則佔了 21.9%。

在 1280x720 的純測試畫面底部,以 Chromium 預設字幕樣式顯示的兩行英文 cue。

同一條 cue 加上兩行西班牙文後,佔據約五分之一的畫面高度。

請依照以下順序處理被標記的 cue:

  1. 保留音訊語言的逐字內容。 如果觀眾一邊聽原文一邊看文字,縮短後的原文就不再與他們聽到的內容相符。
  2. 將另一種語言刪減為一行。 當西班牙文改成 A las seis hay otro; cierran a medianoche. 時,我們的 cue 2 從每秒 17.8 個字元降到 13.1 個。這樣畫面上會是三行而不是四行,而且保留了兩項事實。
  3. 只有在有間隙時才增加時間。 移動結束時間前,請先檢查下一條 cue 的開始時間。Cue 2 還有 0.2 秒的餘裕,不值得為此費心。
  4. 其餘的就別動了。 Cue 9 是 You knew? / Since March.,時間為 1.2 秒。它違反了速度和行數限制,但我們會保留它:它之後的 0.2 秒間隙太小,幫不上忙,而觀眾很可能一眼就能看完兩句簡短的回應。不是每個標記都是錯誤。

對於像 cue 10 這樣的長單行,只有在 cue 有足夠時間時,才將每種語言分成兩行。否則請縮短翻譯。

如果你能控制顯示方式,也可以讓其中一種語言更容易辨識。執行 to-vtt 讓每種語言有自己的 class。產生的檔案在 Chromium 中渲染時,英文為 80% 大小並以淺灰色顯示。這幾乎節省不了空間(佔畫面高度 21.1% 而非 21.9%),所以不能取代刪減一行。我們沒有測試這是否有助于人們閱讀。

四行 cue,其中英文行比西班牙文行更小、更灰。

這使用了 WebVTT 的 cue class 與 ::cue() 選擇器。這是為瀏覽器設計的。其他播放器可能會忽略這些樣式或 VTT 檔案。

步驟 4:決定哪種語言放在上方

關於這一點已有一些研究。在一項 2026 年的眼動追蹤研究中,42 位以英語為第二語言的西班牙語母語者,無論上方是哪種語言,觀看者都會花更多時間在上方那一行,而且他們會花更多時間在與音訊相符的那一行。當母語西班牙語放在上方時,理解分數更高。另一項較早的研究以 112 位中文英語學習者為對象,發現雙語字幕對理解的幫助與僅有母語字幕一樣大,而且兩者都優於英語字幕或無字幕。

這些是針對特定觀眾群體的單一研究,因此請將它們視為起點:

  • 為了內容而觀看電影或聽講座: 將你閱讀最流暢的語言放在上方。
  • 練習你正在學習的語言: 將該語言放在上方,並接受你可能理解得少一些。2026 年的研究測量的是理解,而不是學習,所以這一點是我們的判斷。
  • 審閱翻譯: 順序影響不大,所以保持原樣即可。

BookTranslator 的雙語檔案總是將原文放在上方。若要交換:

python3 check_bilingual_subs.py flip sample-source.srt sample-es-bilingual.srt -o translation-on-top.srt

哪些地方會出錯,以及如何修正

這些問題來自於在我們的測試檔案上執行 BookTranslator 的字幕程式碼,而檢查器會標記前兩項。

  • 無需翻譯的文字會出現兩次。 1984 和 ♪ ♪ 因為沒有可翻譯的詞語而被跳過,所以雙語檔案會將它們各印兩次。請手動刪除一行。
  • 文字中可能出現 &apos;。 截至 2026 年 11 月,帶有格式標籤和撇號的 cue 可能會在傳回時將撇號轉義。我們的原始行在雙語檔案中變成 <i>Don&apos;t answer that.</i>,而在另一項 VTT 測試中,法文翻譯在翻譯後的檔案中也變成 <i>Je n&apos;attendrai pas.</i>。Chromium 在 VTT 中解碼了它並顯示正常的撇號。但當我們用 FFmpeg 轉換 SRT 時,&apos; 留在輸出文字中,所以假設某些播放器會直接顯示它。使用檔案前,請將 &apos; 替換為 '。我們已將此問題回報給工程師。
  • VTT cue 設定會被移除。 位置設定如 line:0 align:start position:10% 和 NOTE 區塊在我們的 VTT 測試輸出中消失了,而且講者標籤出現在兩行上。如果你的 VTT 依賴位置設定,請在翻譯後重新加上。
  • 由右至左的文字會逐行標記。 阿拉伯文行回來時被包在 Unicode 方向標記中。我們只在 Chromium 中檢視了 VTT 副本裡的一個字幕 cue,它顯示為由右至左。像我們的第 10 個 cue 那樣混合阿拉伯文與數字的行是更難處理的情況,我們沒有檢視那些,所以請在你實際使用的播放器中測試。SRT 沒有其他方式可以設定方向。我們的由右至左指南涵蓋了書籍更廣泛的相關問題。

如果你的來源是 ASS 或 SSA,BookTranslator 的雙語輸出會將翻譯行新增為具有相同樣式與時間的第二個事件,這是不同的結構。我們的 ASS 字幕指南說明了這些檔案是如何組成的。如果任一語言中的重音字元看起來損壞,問題通常是檔案的編碼,我們的字幕編碼指南涵蓋了這一點。

分享檔案之前

  1. 執行檢查工具,並逐一處理每個被標記的 cue。
  2. 找出 &apos;、&amp; 和 &quot; 並替換它們。
  3. 刪除音效、數字和音樂上的重複行。
  4. 在觀眾會使用的播放器中,以他們會使用的螢幕尺寸,觀看最繁忙的幾分鐘。
  5. 檢查底部行是否遮蓋了影片中的螢幕文字。
  6. 在上下文中閱讀譯文。我們的 AI 字幕工作流程涵蓋了如何審閱它。

準備好 SRT 或 VTT 了嗎?將它上傳到字幕翻譯工具,在付款前查看價格。完成後,下載雙語檔案以及翻譯後的檔案。然後對它執行檢查工具,因為實際工作中的行數取決於模型如何拆分每個翻譯後的 cue。

相關文章

如何製作雙語字幕:在一個 SRT 或 VTT 檔案中放入兩種語言