高棉語金錢解說影片
每支影片會追蹤兩個普通人面對相同的金錢決策,當眾計算數字,讓觀眾能自己判斷。觀眾會因為數字誠實而留下來,並信任這個頻道。
工作範例是 templates/project/ 中的「互助會 vs 銀行」影片(位於 src/story/)。
保護頻道的規則
- 僅限原創作品。 風格研究可以參考其他頻道,但絕不能抄襲它們的腳本、角色、縮圖、標誌或畫面,也絕不能在影片或說明中提及它們。我們自己的演員陣容、故事和視覺識別(包括戴水布的角色)都是我們的原創。
- 誠實的金錢。 在畫面上顯示假設。給予雙方的觀點,包括看起來最佳選項的風險。提供可供觀眾提問的問題,而不是個人建議。每個影片說明都以「非財務建議」的免責聲明結尾,並表明角色是虛構的。
- 真實人物要保持距離。 對指名道姓的個人或公司提出詐欺指控並非本格式的職責。應描述來自已報導案例的模式,並在說明中附上連結。
- 花費: 配音會消耗 KiriTTS 點數:1,100 字的試播片使用了 433 點,因此一支 9 分鐘的影片大約需要 3,000-3,500 點。在配音前檢查
get_usage,告知使用者估算值,並先取得腳本核准。
生產流水線
1. 主題
如果使用者沒有提供主題,請提出 3 個建議,每個附上一行說明。一個好的主題是 柬埔寨每個人都認識的分岔路、有數據可供查證,而且 有轉折點,讓顯而易見的答案是錯誤或不完整的。在提出建議前,先搜尋一下當前熱門話題。
一開始就要確定主題,並且只詢問還不知道的資訊:主題、配音(預設為 Maly;帳戶可能已有複製的聲音,請參閱 list_voices),以及頻道名稱(story.tsx 中的 CHANNEL;若為空白則隱藏徽章)。
2. 研究與計算
- 儘可能使用柬埔寨的原始資料來源:柬埔寨國家銀行、國家統計局、銀行利率表、律師事務所的稅務備忘錄、信譽良好的新聞媒體。請注意發布日期:利率和稅務規定會變動。
- 根據主題改寫
scripts/calc.py。畫面和旁白中的每個數字都來自此脚本,並寫入src/story/numbers.json。加入合理性斷言。執行多種情境,包括「贏家」輸掉的那一種。 - 區分 有來源 的資料和 假設 的資料,並在畫面上以
<Note>標記假設值。如果某個事實無法找到來源,可以將其明確標示為假設,或者直接捨棄,並告知使用者。
3. 腳本
約 7,000-9,000 個高棉文字元,對應 8-10 分鐘;試播片的語速約為每秒 15 個字元。一個節拍大約是一到兩個句子,約 70 個字元,所以一支 9 分鐘的影片大約有 100-120 個節拍。請閱讀 references/script-formula.md 了解結構和高棉文寫作規則。
將其寫入 src/story/script.json(場景包含節拍;格式如下),並向使用者顯示包含來源和假設的完整高棉語腳本。在配音前等待核准。 使用者是高棉語措辭和術語的權威。
4. 設定專案
將 templates/project/ 複製到一個新資料夾,執行 npm install,然後取代 src/story/script.json、src/story/story.tsx 和 scripts/calc.py。除非要加入可重複使用的內容,否則請勿更動 src/engine/。使用簡短的路徑(參閱注意事項)。
5. 在花費點數前進行預覽測試
python scripts/calc.py
python scripts/build_timeline.py --placeholder
python scripts/check_numbers.py
npx tsc --noEmit
node scripts/stills.mjs out/look/x_ 100,400,900 0.5
自己查看這些畫面,對照 references/visual-style.md 中的檢查清單。配音完成後,每個台詞檢查兩次,靠近其開始和結束處:只在結束時拍攝靜止畫面會隱藏那些在聲音逐步建立數字時仍然空白的卡片。逐一撰寫場景並逐一檢查,因為現在修正佈局問題的成本遠低於之後。
6. 配音
python scripts/tts_todo.py
這只會列出新的或已更改的節拍。對於每個節拍,使用該節拍的 tts 欄位(或 text)和一個一致的聲音來呼叫 KiriTTS text_to_speech,不設定傳遞設定。將音訊下載到 voice/<id>.mp3(連結約在一天內過期),並使用 python scripts/tts_todo.py --done <id> <speech_id> 記錄。每個節拍一個音訊片段意味著,一個錯誤的單字只需修正一個句子。
逐字時間戳記是可選的:將 get_word_timestamps 的輸出儲存為 voice/<id>.words.json,然後使用 at('b03', 'word')。像 at('b03', .5) 這樣的分數通常就足夠了。請聆聽數字、名稱和外語單字;如果 KiriTTS 誤讀了某個內容,請為該節拍加入 tts 拼寫。
7. 時間軸、音效、渲染
python scripts/build_timeline.py
python scripts/make_audio.py
npx remotion render src/index.ts Main out/video.mp4 --codec h264 --crf 18 --muted
ffmpeg -y -i out/video.mp4 -i out/mix.wav -map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -b:a 192k -shortest out/final.mp4
python scripts/qa.py out/final.mp4 out/qa
npx remotion still src/index.ts Thumbnail out/thumb.png
長影片需要一些時間,所以在背景執行渲染。在進行完整影片製作前,為使用者渲染一個包含前幾個場景的短試播片,以供審查。特別是當畫面或配音是新的時候。
8. 品質檢查
閱讀 out/qa/report.md,並查看每一張連拍圖。調查黑色或凍結畫面,以及音量遠離 -15 LUFS 的情況。確認畫面上的每個數字都與 numbers.json 相符,並且沒有高棉文字被截斷或重疊。
9. 交付
使用 SendUserFile 發送 mp4 和縮圖。同時在高棉語中撰寫 out/description.md,包含:吸引人的開頭、包含假設、風險、供觀眾自問的問題、虛構角色和非財務建議免責聲明的工作摘要、評論提示、來自 timeline.json 的實際時間戳章節、來源連結和主題標籤。未經使用者要求,絕不自行上傳或發布。
script.json 格式
{ "gap": 0.3, "scene_gap": 0.7, "tail": 1.5,
"scenes": [{ "id": "Hook", "chapter": 0, "music": "light", "beats": [
{ "id": "h1", "text": "高棉語句子", "tts": "可選的語音拼寫", "sfx": [{"at": 0.75, "type": "coin"}] }
]}]}
- 場景的
id必須與story.tsx中SCENES的一個元件匹配。 chapter索引CHAPTERS;0 是開場鉤子,並隱藏進度條。music:light(輕快)、tense(緊張)或resolve(解決)。sfx類型:pop、whoosh、coin、cash、ding、thud、tick、paper、sad、tada、alarm。at是節拍內的分數。只在揭露資訊時使用,而不是每句台詞都用。
撰寫場景
請閱讀 src/story/story.tsx:它是場景撰寫方式的參考。簡而言之,const {f, at} = useScene() 提供了影格和節拍時間,每個元素透過 <Show at={...} out={...} x y> 進入。沒有任何東西是以秒為單位計時的,因此重新配音永遠不會破壞場景。
可用的零件:
engine/Figure:臉部、姿勢、走路和手中的道具。在故事檔案頂部定義每個角色一次。engine/Props:Title、Label、Chip、Tag、Bubble、ThoughtCloud、Jar、Coin、Bill、MoneyBag、Calendar、Bank、House、Stall、Notebook、Phone、Rock、Umbrella、StormCloud、CheckMark、VsBadge、Arrow、FlyingMoney、Note、Moto、NameChip。engine/Charts:Card、Counter、Bars、LineChart、MonthGrid 和money()。engine/Stage:mood、tint、zoom、focus。
如果某個主題需要新的道具,請以相同的墨線風格在故事檔案中繪製,如果可重複使用,則將其移至 engine/Props.tsx。
注意事項(以下情況都發生過)
- Windows 路徑限制。 當專案路徑過長,導致
node_modules內部的檔案超過 260 個字元時,Remotion 會失敗:靜止畫面會出現Failed to launch the browser process/spawn ... chrome-headless-shell,完整渲染則會出現getExecutableDir錯誤。指向不同的瀏覽器無法解決第二個問題。請將專案放在較短的路徑,例如D:/videos/<name>(約 100 個字元以內),並在那裡執行npm install。 - 暫存空間。 每個 bundle 都會複製到暫存資料夾,且不會被移除。如果 C: 槽空間不足,請為
stills.mjs設定RENDER_TMP,並為 CLI 設定TEMP/TMP,指向空間更大的磁碟機。 <Show>預設為 x=0, y=0,這會使置中的標題半個畫面消失在螢幕外。對於置中元素,務必傳遞x={960}。- Koulen 字體的数字顯示不佳("12" 看起來像 "I2")。
Title已經設定了正文字體中的數字和符號;請不要繞過它。 - 標籤覆蓋在臉上。 站立角色的頭部大約到達 y=470,而舉起的手會更高。請將標籤放在角色上方約 y=300-350 的位置。
- Remotion 使用
--muted時不會寫入可用的音訊, 因此務必按照指示在事後混入mix.wav。 - 包含大量 TSX 的 Bash heredoc 在某些 Windows shell 中可能無法解析。請使用檔案工具撰寫原始碼檔案。