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

要製作雙語字幕,你需要一個已校時的 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,為每種語言設定一個 class | WebVTT 支援樣式;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
它會將雙語檔案與來源比對,並假設原始台詞在前,所以請在交換順序之前執行。如果頂部台詞與來源不符,它會警告你。以下是它在西班牙語檔案中發現的問題:
| 字幕 | 秒數 | 行數 | 原始字元/秒 | 西班牙語字元/秒 | 問題 |
|---|---|---|---|---|---|
| 2 | 3.2 | 4 | 19.4 | 17.8 | 四行,西班牙語太快 |
| 5 | 2.7 | 2 | 6.7 | 7.0 | 文字中有 ' |
| 7 | 1.0 | 2 | 4.0 | 4.0 | 相同文字重複兩次 |
| 8 | 1.8 | 2 | 1.7 | 1.7 | 相同文字重複兩次 |
| 9 | 1.2 | 4 | 20.8 | 22.5 | 四行,兩種語言都太快 |
| 10 | 3.6 | 2 | 18.3 | 19.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%。


請依照以下順序處理被標記的 cue:
- 保留音訊語言的逐字內容。 如果觀眾一邊聽原文一邊看文字,縮短後的原文就不再與他們聽到的內容相符。
- 將另一種語言刪減為一行。 當西班牙文改成
A las seis hay otro; cierran a medianoche.時,我們的 cue 2 從每秒 17.8 個字元降到 13.1 個。這樣畫面上會是三行而不是四行,而且保留了兩項事實。 - 只有在有間隙時才增加時間。 移動結束時間前,請先檢查下一條 cue 的開始時間。Cue 2 還有 0.2 秒的餘裕,不值得為此費心。
- 其餘的就別動了。 Cue 9 是
You knew?/Since March.,時間為 1.2 秒。它違反了速度和行數限制,但我們會保留它:它之後的 0.2 秒間隙太小,幫不上忙,而觀眾很可能一眼就能看完兩句簡短的回應。不是每個標記都是錯誤。
對於像 cue 10 這樣的長單行,只有在 cue 有足夠時間時,才將每種語言分成兩行。否則請縮短翻譯。
如果你能控制顯示方式,也可以讓其中一種語言更容易辨識。執行 to-vtt 讓每種語言有自己的 class。產生的檔案在 Chromium 中渲染時,英文為 80% 大小並以淺灰色顯示。這幾乎節省不了空間(佔畫面高度 21.1% 而非 21.9%),所以不能取代刪減一行。我們沒有測試這是否有助于人們閱讀。

這使用了 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和♪ ♪因為沒有可翻譯的詞語而被跳過,所以雙語檔案會將它們各印兩次。請手動刪除一行。 - 文字中可能出現
'。 截至 2026 年 11 月,帶有格式標籤和撇號的 cue 可能會在傳回時將撇號轉義。我們的原始行在雙語檔案中變成<i>Don't answer that.</i>,而在另一項 VTT 測試中,法文翻譯在翻譯後的檔案中也變成<i>Je n'attendrai pas.</i>。Chromium 在 VTT 中解碼了它並顯示正常的撇號。但當我們用 FFmpeg 轉換 SRT 時,'留在輸出文字中,所以假設某些播放器會直接顯示它。使用檔案前,請將'替換為'。我們已將此問題回報給工程師。 - VTT cue 設定會被移除。 位置設定如
line:0 align:start position:10%和NOTE區塊在我們的 VTT 測試輸出中消失了,而且講者標籤出現在兩行上。如果你的 VTT 依賴位置設定,請在翻譯後重新加上。 - 由右至左的文字會逐行標記。 阿拉伯文行回來時被包在 Unicode 方向標記中。我們只在 Chromium 中檢視了 VTT 副本裡的一個字幕 cue,它顯示為由右至左。像我們的第 10 個 cue 那樣混合阿拉伯文與數字的行是更難處理的情況,我們沒有檢視那些,所以請在你實際使用的播放器中測試。SRT 沒有其他方式可以設定方向。我們的由右至左指南涵蓋了書籍更廣泛的相關問題。
如果你的來源是 ASS 或 SSA,BookTranslator 的雙語輸出會將翻譯行新增為具有相同樣式與時間的第二個事件,這是不同的結構。我們的 ASS 字幕指南說明了這些檔案是如何組成的。如果任一語言中的重音字元看起來損壞,問題通常是檔案的編碼,我們的字幕編碼指南涵蓋了這一點。
分享檔案之前
- 執行檢查工具,並逐一處理每個被標記的 cue。
- 找出
'、&和"並替換它們。 - 刪除音效、數字和音樂上的重複行。
- 在觀眾會使用的播放器中,以他們會使用的螢幕尺寸,觀看最繁忙的幾分鐘。
- 檢查底部行是否遮蓋了影片中的螢幕文字。
- 在上下文中閱讀譯文。我們的 AI 字幕工作流程涵蓋了如何審閱它。
準備好 SRT 或 VTT 了嗎?將它上傳到字幕翻譯工具,在付款前查看價格。完成後,下載雙語檔案以及翻譯後的檔案。然後對它執行檢查工具,因為實際工作中的行數取決於模型如何拆分每個翻譯後的 cue。





