字幕樣式
字幕大約在兩秒內被閱讀、在手機上、靜音模式、動態畫面之上、應用程式按鈕之下。以下所有預設值都是為了那位讀者服務。若使用者有自己的編輯器,請在其中工作;數字在任何地方都一樣。若無編輯器,請使用 references/ffmpeg-burn-in.md 中的 ffmpeg 配方。
預設值
除非使用者或其樣式指南另有指示,否則使用這些預設值。
| 設定 | 預設值 | 原因 |
|---|---|---|
| 每個提示的行數 | 最多 2 行 | 第三行會遮蓋主體,且無法及時閱讀。 |
| 每行字元數 | 橫向 16:9 為 42;垂直 9:16 為根據大小符合安全寬度:64 px 約 32 字元,72 px 約 28 字元(大小寫混合) | 較長的行迫使眼睛移動,在垂直畫面中會跑出邊框。 |
| 閱讀速度 | 每秒最多 17 個字元(約每分鐘 160 到 180 字) | 廣播實務;WCAG 未設定速度,因此這是工作標準。 |
| 提示持續時間 | 最少 1 秒,最多 6 秒 | 少於 1 秒是閃爍;多於 6 秒觀眾會重讀。 |
| 提示間隔 | 0 或至少 2 幀 | 1 幀間隔會被視為閃光。 |
| 位置 | 底部居中,在安全區域內;在 1080x1920 上,文字保持在底部 420 px(高度 22%)以上 | 這可避開 TikTok 和 Reels。當下方三分之一有臉部、內嵌文字或應用程式 UI 時,移到頂部。 |
| 大小,句子字幕 | 橫向:畫面高度的 4.5 到 5%(1080p 為 49 到 54 px)。垂直:1080x1920 上為 64 到 72 px | 在手臂長度內可讀,且上述行長仍符合 900 px 安全寬度。 |
| 大小,簡潔短式字幕(1 到 3 個單字) | 1080x1920 上約 140 到 150 px,混合大小寫每行最多約 14 個字元,全大寫 11 個 | 這些是圖形元素,而非字幕。 |
| 顏色 | 米白色 #F2F2F2 搭配 70 到 80% 不透明深色底板,或 3 到 5 px 深色輪廓加柔軟陰影 | 移動畫面對比度無法逐幀測量;底板保證 WCAG 4.5:1。 |
| 字型 | 一個粗體無襯線字型(粗體或半粗體);一支影片中最多兩個字型家族 | 細字重壓縮後會消失。 |
| 單字突出顯示(卡拉 OK) | 僅在作用中單字上使用一個強調色,且該色也必須滿足 4.5:1 | 第二種顏色用於「強調」會讓觀眾尋找意義。 |
渲染前進行貼合檢查。 一個粗體 Arial 類型的混合大小寫無襯線字型平均每個字元約佔字型大小的 0.44(已測量,包含空格);全大寫約佔 0.55;窄體字型約佔 0.35。因此一行約為 字元數 x 係數 x 字型像素 寬,且必須符合安全寬度(1080x1920 上為 900 px,橫向為寬度的 90%),而非畫面寬度。在 96 px 時,27 字元的混合大小寫行約為 27 x 0.44 x 96 = 1,140 px:比整個 1080 px 畫面還寬。這些係數是針對測量時所用的字型平均(參見注意事項),因此請用渲染幀確認。
平台像素安全區域以及如何為任何畫布推導安全框,請參見 references/platform-safe-zones.md。在垂直影片上放置字幕前請先閱讀。
工作流程
-
從實際時間開始。 字幕需要帶有片段或單字時間的轉錄稿。無轉錄稿就無法製作字幕:請說明,或先進行轉寫。切勿發明用詞。
-
將時間重新對應到剪輯。 轉錄稿的時間是針對原始檔案。在修剪、剪輯或變速後,需將每個提示的時間偏移並縮放到時間軸上(參見注意事項)。
-
將內容分割為提示。 在子句邊界處分割:在標點符號之後、連接詞和介係詞之前。切勿將冠詞與名詞、名字與姓氏、或數字與單位分開。若有多種分割選項,選擇使兩行長度最接近的那個。
-
強制執行閱讀速度。 若提示超過每秒 17 個字元,則分割或將其延長到之後的靜默中。切勿縮小字型來適應。
-
標記說話者和聲音。 當說話者改變時,在行首加上
-(或首次用方括號標明名字)。將有意義的非語言聲音放入方括號:[門砰一聲]、[緊張音樂]。勿將從音訊中刪除的填充詞加上字幕。 -
使用預設值和此畫布的安全框進行樣式和位置調整。
-
檢查檔案,然後修復其報告的每個錯誤:
python scripts/check_captions.py captions.srt --fps 30 --max-chars 32它會檢查行數、行長、每秒字元數、持續時間、間隔和重疊,並在發現錯誤時以非零退出碼結束。加上
--json可產生機器可讀報告。其預設行長限制為 32 個字元,這是垂直和無障礙的標準;傳入--max-chars 42用於橫向字幕。 -
查看渲染幀,而非設定:第一個提示、最長的提示、以及背景最雜亂的提示。確認沒有內容被裁剪、沒有內容位於應用程式 UI 下方,且在手機大小上文字可讀。
-
交付兩種版本:一份供社群媒體使用的內嵌版本,以及一份供無障礙和平台上傳用的側邊
.srt或.vtt檔案,除非使用者只要求其中一種。
注意事項
- 寬度估算在窄體字型上會失準。 平均字元寬度估算可能誤差超過 3 倍:一次溢出檢查報告一行在兩側超出 127 px,但實際在 1080 px 畫面中渲染為 270 px 寬。為滿足估算而縮小字型,在 1080x1920 上產生了 76 px 的字幕,而簡潔風格要求約 150 px,在手機上完全無法閱讀。請渲染一幀並測量。
- 轉錄稿時間是相對於來源的。 若一個片段在原始檔案中從 12.4 秒處開始,則從每個提示減去 12.4 秒,並加上片段的時間軸起點。在 2 倍速下,持續時間減半,因此提示可能低於 1 秒;應重新分割而非保留舊的提示邊界。
- ffmpeg 使用 288 行網格而非像素來燒錄 SRT。 使用
subtitles=file.srt:force_style=...時,FontSize和MarginV是相對於 384x288 的腳本空間測量的,因此FontSize=24在 1080 行影片上渲染為 90 px 字型,在 1920 行影片上渲染為 160 px。請使用FontSize = px * 288 / frame_height進行轉換,或撰寫一個PlayResX和PlayResY等於影片大小的 ASS 檔案,使單位為像素(配方會這樣做)。 - ASS 中的底板使用 OutlineColour。 使用
BorderStyle=3時,框的顏色來自OutlineColour,而非BackColour,且 ASS 顏色格式為&HAABBGGRR,其中 alpha00表示不透明。&H40000000是 75% 不透明的黑色。 - ASS 底板中的內聯顏色變更會導致問題。
BorderStyle=3行內的{\c...}高亮會為每個顏色區段繪製單獨的框,而半透明框重疊會產生深色接縫。請將底板繪製為帶有不可見文字的獨立圖層,並將可見文字放在其上方的圖層中(配方會展示如何操作)。 - 缺少字型會靜默失敗。 libass 會無錯誤地回退到另一個字型。請檢查 ffmpeg 日誌中的
fontselect:行,或傳入fontsdir=。 - Windows 路徑會破壞字幕濾鏡。 請轉義磁碟冒號:
subtitles='C\:/clips/subs.srt'。 - 歌詞歌詞是短語定時的。 在音樂下的語音辨識會遺漏單字(一次測試遺漏了 17 個中的 4 個)並返回短語時間而非單字時間。未經與音訊核對,請勿從中建構逐字卡拉 OK。
- 預設集可能會在多個地方著色作用中單字。 一個編輯器的霓虹預設集同時從高亮顏色和發光效果繪製高亮,因此僅覆蓋一個不存在的欄位不會有任何效果,也不會報錯。請使用其真實名稱覆蓋所有攜帶該顏色的欄位,並在渲染幀上確認。