Communitygithub.com

vidmoat/caption-styling

為在手機上無聲觀看的字幕和旁白進行樣式、時間與位置調整。設定行長、閱讀速度、提示時機、大小、對比度與平台安全區域,並檢查 SRT 或 VTT 檔案是否符合規範。

caption-styling 是什麼?

這是一個專為開發者與 AI 助手設計的 AI 技能,用於自動化字幕與旁白的樣式調整與合規檢查。它基於實際使用場景(手機、靜音、動態背景)定義了一組嚴格的預設值,包括每行字數、閱讀速度、提示持續時間、位置與字體大小等。該技能支援 SRT 與 VTT 格式,並提供內建的 Python 檢查指令碼 `check_captions.py`,可驗證行數、行長、每秒字元數、持續時間與間距。此外,它還包含了常見陷阱的說明(例如 ffmpeg 的字幕座標系統、ASS 格式的色板問題、寬度估算誤差等),並提供了實用的工作流程指引。適合整合到影片編輯工具鏈、社群媒體自動化腳本或無障礙檢查流程中。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/vidmoat/skills/tree/HEAD/skills/core/caption-styling

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

字幕樣式

字幕大約在兩秒內被閱讀、在手機上、靜音模式、動態畫面之上、應用程式按鈕之下。以下所有預設值都是為了那位讀者服務。若使用者有自己的編輯器,請在其中工作;數字在任何地方都一樣。若無編輯器,請使用 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。在垂直影片上放置字幕前請先閱讀。

工作流程

  1. 從實際時間開始。 字幕需要帶有片段或單字時間的轉錄稿。無轉錄稿就無法製作字幕:請說明,或先進行轉寫。切勿發明用詞。

  2. 將時間重新對應到剪輯。 轉錄稿的時間是針對原始檔案。在修剪、剪輯或變速後,需將每個提示的時間偏移並縮放到時間軸上(參見注意事項)。

  3. 將內容分割為提示。 在子句邊界處分割:在標點符號之後、連接詞和介係詞之前。切勿將冠詞與名詞、名字與姓氏、或數字與單位分開。若有多種分割選項,選擇使兩行長度最接近的那個。

  4. 強制執行閱讀速度。 若提示超過每秒 17 個字元,則分割或將其延長到之後的靜默中。切勿縮小字型來適應。

  5. 標記說話者和聲音。 當說話者改變時,在行首加上 - (或首次用方括號標明名字)。將有意義的非語言聲音放入方括號:[門砰一聲]、[緊張音樂]。勿將從音訊中刪除的填充詞加上字幕。

  6. 使用預設值和此畫布的安全框進行樣式和位置調整。

  7. 檢查檔案,然後修復其報告的每個錯誤:

    python scripts/check_captions.py captions.srt --fps 30 --max-chars 32
    

    它會檢查行數、行長、每秒字元數、持續時間、間隔和重疊,並在發現錯誤時以非零退出碼結束。加上 --json 可產生機器可讀報告。其預設行長限制為 32 個字元,這是垂直和無障礙的標準;傳入 --max-chars 42 用於橫向字幕。

  8. 查看渲染幀,而非設定:第一個提示、最長的提示、以及背景最雜亂的提示。確認沒有內容被裁剪、沒有內容位於應用程式 UI 下方,且在手機大小上文字可讀。

  9. 交付兩種版本:一份供社群媒體使用的內嵌版本,以及一份供無障礙和平台上傳用的側邊 .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,其中 alpha 00 表示不透明。&H40000000 是 75% 不透明的黑色。
  • ASS 底板中的內聯顏色變更會導致問題。 BorderStyle=3 行內的 {\c...} 高亮會為每個顏色區段繪製單獨的框,而半透明框重疊會產生深色接縫。請將底板繪製為帶有不可見文字的獨立圖層,並將可見文字放在其上方的圖層中(配方會展示如何操作)。
  • 缺少字型會靜默失敗。 libass 會無錯誤地回退到另一個字型。請檢查 ffmpeg 日誌中的 fontselect: 行,或傳入 fontsdir=。
  • Windows 路徑會破壞字幕濾鏡。 請轉義磁碟冒號:subtitles='C\:/clips/subs.srt'。
  • 歌詞歌詞是短語定時的。 在音樂下的語音辨識會遺漏單字(一次測試遺漏了 17 個中的 4 個)並返回短語時間而非單字時間。未經與音訊核對,請勿從中建構逐字卡拉 OK。
  • 預設集可能會在多個地方著色作用中單字。 一個編輯器的霓虹預設集同時從高亮顏色和發光效果繪製高亮,因此僅覆蓋一個不存在的欄位不會有任何效果,也不會報錯。請使用其真實名稱覆蓋所有攜帶該顏色的欄位,並在渲染幀上確認。

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

相關技能