Legenda Simples — 短句,無動畫,與語音同步
一次一句,白色粗體文字,小寫但開頭大寫(如轉錄內容),無背景,柔和陰影,位於下方三分之一處,無紅色且無入場動畫。例如:「問題是」/「沒有練習」。
前置需求
- Premiere Pro(已在 2027/27.0 版本測試;ExtendScript)與 Python 3.9+,並執行
pip install -r requirements.txt(Pillow)。 - 一種在 Premiere 中執行 ExtendScript 的方法(MCP 搭配
execute_extendscript或基於檔案的 CEP bridge)——請參閱儲存庫根目錄中的docs/PREMIERE-BRIDGE.md。 - 已安裝 Montserrat Bold 字型(免費,Google Fonts)。如果找不到,請設定
CAPTION_FONT_DIR或將.ttf檔案放入技能內的fonts/資料夾中。 - 預設模式(PNG)不需要
.mogrt。只有.mogrt替代方案需要assets/Simple_Text_WbW.mogrt(請參閱assets/LEIA-ME.md)。
參數(最終依據:style.json 和 scripts/plan_phrases.py 中的 RULES)
- 9x16(1080x1920)。Montserrat Bold 66 px,白色,柔和陰影(模糊 6,dy 4,55%)。
y_center0.70。 - 無入場動畫:每句字幕都是一個透明 PNG 1080x1920(由
make_stills.py產生),在第一影格完整出現,並在硬切時消失。逐字.mogrt不適用:其入場是內建的(只有「離場動畫」和「動畫速度」50-500,沒有「入場動畫」)。PNG 的缺點:文字在 Premiere 中不可編輯——要修正,請編輯blocks.json並重新產生(只需幾秒鐘)。 - 每句 3-4 字,透過動態規劃實現:避免 1-2 個單獨的字,不以「的/了/在/是...」結尾,優先在有逗號或停頓處裁切;逗號僅在至少有 3 個字時才裁切。在快速說話時(一句話在 < 0.9 秒內跨過),合併最多 5 個字,但不跨過句子結尾(. ? !)。
- 安全框:所有內容都在 Premiere 的標題安全框內(80% x 80%);有效寬度 78%(1080 中為 842 px),區塊在高度 10%-90% 內。文字會縮小直到
min_scale,如果仍放不下,則換行;大小向下取整。使用check_margins.py確認(應顯示「超出邊界:0」)。 - 交付:直接在指定的序列上編輯(不複製),除非使用者要求複製。
螢幕時間 = 語音時間(sync 模式,預設)
- 字幕在說出第一個字時開始(零延遲),並在最後一個字結束後加上
tail0.3 秒時消失,僅在之後有靜音時延長至min_dur0.8 秒(絕不侵入下一句)。如果字幕停留時間 < 0.5 秒,則僅在能容納在 5 個字內且前一句未結束時,才與前一句合併。 - 專案備註:也存在
schedule_mode: "lag"模式(閱讀時間:每句至少停留 ~0.9 秒,如果語音更快,下一句會延後進入,最多 0.9 秒)。這會使字幕與語音脫鉤(開始和結束不再一致,持續時間與所說的內容無關),因此預設為sync。僅在使用者要求更慢的閱讀速度時才使用lag(使用--config搭配{"schedule_mode":"lag"})。 - 誠實的限制:非常密集的語音(~3.6 字/秒,峰值 6 字/秒)會導致某些句子很短(0.36-0.8 秒)。這是語音的問題,不是字幕的問題。
選項 A — 僅在已編輯的序列上加入字幕
- 與使用者確認專案/序列,並使其保持作用中。
- 轉錄:從 Premiere 匯出的 JSON(文字 > 轉錄 > ... > 匯出;會放在文件「<序列名稱>.json」)。
PYTHONIOENCODING=utf-8 python -I <skill>/scripts/plan_phrases.py <transcricao.json> <pasta>/blocks.json;顯示列表和需要[確認]的字詞。python -I <skill>/scripts/make_stills.py <pasta>/blocks.json <pasta>/png --track 1(產生 PNG + JSX;每次產生使用新資料夾——Premiere 會鎖定已匯入的 PNG)和python -I <skill>/scripts/check_margins.py <pasta>/png/stills_clips.json。- 在 Premiere 中,保持序列作用中:執行
stills_import.jsx(將 PNG 匯入到一個 bin 中),然後依序執行stills_01.jsx...,一次一個(ok=20/20)。時間已直接設定在影格網格上(--fps,預設 30)。
選項 B — 完整動態剪輯(裁切 + 縮放 + 字幕)
- 將影片匯入專案,並從 Premiere 取得轉錄。
python -I <skill>/scripts/plan_edit.py <transcricao.json> <pasta>:移除 > 0.3 秒的停頓和猶豫(空白文字),在標點處進行約 3 秒的子裁切,交替執行 100%/116% 的縮放,並寫入clips.json和已在裁切時間上的blocks.json。在腳本頂部調整(GAP、ZOOM_ALT、SUB_MIN/MAX)。python -I <skill>/scripts/build_cut_script.py <pasta>/clips.json <pasta> --item <專案中的檔案名稱> --name "<名稱> 已編輯 9x16"->montar.jsx;在 Premiere 中執行(原始序列不會被修改)。- 字幕:使用此資料夾中的
blocks.json執行選項 A 的步驟 4 和 5。 - 儲存專案並列出交付內容:裁切、縮放、可疑字詞以及未檢查的項目。
替代方案 .mogrt(可編輯文字,含逐字入場動畫)
python -I <skill>/scripts/make_graphics_script.py <pasta>/blocks.json <pasta>/lote.js --track 1(使用 assets/Simple_Text_WbW.mogrt;動畫速度在 style.json 中),然後執行批次檔 lote_NN.js。僅在使用者接受動畫時使用。
Premiere 技巧(實務中發現)
importFiles需要絕對路徑(new File(...).fsName);createNewSequenceFromClips會從垂直影片繼承 1080x1920。- 渲染:
app.encoder.encodeSequence(...)+startBatch()可能無法進入 Media Encoder 佇列。有效的方法是:seq.exportAsMediaDirect(saida, preset, app.encoder.ENCODE_ENTIRE)(在 Premiere 內渲染,90 秒影片約需 5 分鐘)。預設檔:<Premiere 資料夾>/MediaIO/systempresets/.../H264 Match Source - High bitrate.epr(使用 glob 搜尋;位於安裝目錄內)。「MooV」預設會產生 .mov/.mp4 中的 PCM 音訊;如果要上傳,請使用ffmpeg -c:v copy -c:a aac重新封裝。 - 匯出影格(透過 QE 使用
exportFramePNG)可能會失敗;字幕的 PNG 不需要這樣做:PNG 中看到的內容就是影片中會出現的內容。
快速調整
| 我想要 | 調整位置 |
|---|---|
| 字型/大小/位置/陰影 | style.json(font_path、mogrt_font、mogrt_size、y_center、shadow_*) |
| 更長的螢幕時間 | RULES 中的 min_dur、tail(在 sync 模式下僅會因靜音而延長) |
| 3 個字而非 4 個 | 透過 --config 使用 {"max_words": 3} |
| 更多/更少的裁切和縮放 | plan_edit.py 中的 GAP、ZOOM_ALT、SUB_MIN/SUB_MAX |
已知限制
- PNG 不是可編輯文字(修正方法 = 編輯
blocks.json並重新產生)。 - Premiere 的轉錄可能出錯;請在套用前檢查
blocks.json。 - 參考字型似乎是 Proxima Nova Bold(較窄);實際使用 Montserrat Bold(免費)。