Fish Video Skill v2
你從一次對話中製作一支影片。它必須達到在參考分析中剖析的頂尖 Short 的品質:
- 每 ~1 秒螢幕上出現新內容
- 具有深度(紋理、接觸陰影、發光)的真實素材
- 具有 3 倍主詞對比度的文字
- 物件作為門的轉場
- 在每次移動 之前 落地的一個嗖聲,在揭露時 結束 的漸強音,以及在閃切時的撞擊聲
- 位於可聽見的音樂層之上的語音
即使通過品管,帶有通用語音的幻燈片仍是失敗品。
路由器:任務到達時載入指南
只讀取目前步驟所需的內容:
- 使用者只給了一個詞,或想要主題點子,或你在編寫腳本 → 主題到影片
- 選擇風格、調色板或外觀 → 風格配方,
config/styles.yaml - 需要解釋某個想法,或按心情選擇顏色 → 圖表設計
- 編寫任何場景 → 場景目錄,包括動態規則和攝影機
- 任何關於音樂、音效或音量的事,或「我在手機上聽不到音樂」 → 聲音設計
- 選擇或指導語音 → 語音指導
- 字幕和文字 → 字幕與排版
- 螢幕上的網站或應用程式 → 網站導覽捕捉
- 要匹配的參考影片 → 參考分析, 參考影片分析, 趨勢分析
- 平台尺寸和限制 → 平台規格
- 該選用哪個開源工具 → 實地指南
不可協商的工作流程
0 醫生 ─▶ 1 訪談 (所有問題,一次) ─▶ 確認 ─▶ 2 研究 + 趨勢 + 參考 (並行)
─▶ 3 素材 + 螢幕捕捉 + 語音 (並行) ─▶ 4 故事板 (你撰寫每個字) ─▶ 閘門
─▶ 5 靜態稿 (外觀) ─▶ 6 渲染 ─▶ 7 品管 + 審查循環 (修正,重新渲染,重複) ─▶ 8 打包 ─▶ 9 最終審查 ─▶ 10 清理 (詢問)
規則:
-
一次訪談,在開始時。 所有需要使用者回答的問題都在步驟 1 中提出,包括語音和語氣、顏色、螢幕步驟、API 金鑰(以及如何取得每一項)以及要安裝的選用擴充套件。在
fishvideo interview <dir> --confirm之後,你不再提問。根據答案和風格配方做出決定。僅在以下情況再次聯絡使用者:- (a) 他們在
checkpoints中選擇的可選停止點 - (b) 他們必須執行的桌面錄製;他們在訪談中同意,你告訴他們何時開始
- (c) 最終審查
- (d) 清理許可
如果使用者後來說了不同的話,遵循使用者。
- (a) 他們在
-
在訪談確認之前,絕不編寫腳本。
fishvideo script,all和完整render在fishvideo gate通過之前拒絕執行。 -
絕不輸出範本文字。 骨架是一個充滿 TODO 的輪廓。你為這支影片全新撰寫每個螢幕上的字和每句旁白,因此閘門會阻止 TODO、v1 慣用語(「X,解釋」、「60 秒內」、「感謝觀看」)以及任何從
examples/複製的行。範例展示結構,絕非內容。 -
解說影片必須有圖表。 任何
goal: explain影片需要至少一個diagram、whiteboard、neonline或split揭示機制場景。專案符號清單不是解釋。
步驟 0:醫生
設定(僅首次)在 README.md 中:npm install,一個虛擬環境,以及 pip install -r requirements.txt。然後執行:
.venv/Scripts/python scripts/fishvideo.py doctor --keys # Windows (macOS/Linux:.venv/bin/python)
注意哪些金鑰和擴充套件缺失。你在訪談第 8 輪中只詢問這些。
為獲得最佳結果進行設定(請執行此操作,不要跳過):
- 自行安裝擴充套件。 如果
doctor顯示缺少擴充套件,將其安裝到技能虛擬環境中,而無需讓使用者操作:pip install "rembg[cpu]"(去背),pip install kokoro soundfile(自然本地語音)和pip install faster-whisper(對齊使用者自己的旁白)。如果 SFX 庫缺失,也執行一次fishvideo assets sfx-pack。用一句話告訴使用者你在安裝什麼以及原因。僅跳過使用者在第 8 輪中拒絕的擴充套件。- 索取 API 金鑰。 它們是選用的:所有功能皆可透過免費備援運作,無需金鑰。它們確實能帶來最佳結果:ElevenLabs 提供最自然的語音,Pexels/Pixabay 提供最多的圖庫照片和影片,Freesound 提供最多的音效,YouTube Data API 提供趨勢圖表。在第 8 輪中,索取對這支影片重要的金鑰,說明如何取得每一項(免費註冊連結在
doctor --keys中),並接受「不」或「稍後」,不要強求。僅在訪談中進行此操作,創作開始後絕不再提。
步驟 1:訪談(嚴格)
fishvideo new projects/<slug> --prompt "<使用者的請求,逐字"
fishvideo interview projects/<slug> # JSON:開放問題,分為 8 輪
問題庫在 config/interview.yaml 中。它有 8 輪,約 30 個問題:
| 輪次 | 涵蓋範圍 |
|---|---|
| 1 | 目的 |
| 2 | 形狀和風格 |
| 3 | 顏色、字體、紋理 |
| 4 | 語音、表達、音樂、音效 |
| 5 | 真實素材和螢幕錄製 |
| 6 | 內容、事實、CTA、語言 |
| 7 | 字幕、縮圖、核准 |
| 8 | API 金鑰和擴充套件 |
只有一個詞或一個領域? 在第 1 輪之前,生成 5 個趨勢角度:yt suggest、yt search --recent-days 30 和 trends(俳句子代理,並行),遵循主題到影片。將它們作為 topic 問題提供。選擇的角度驅動後續一切。
如何提問:
- 每次
AskUserQuestion呼叫詢問一輪(最多 4 個問題),完全按照列出的選項進行。建議選項優先。「其他」始終可用。 - 自由文字問題 (
free_text: true) 在該輪的正常訊息中發送,與該輪的選擇題呼叫一起。 - 僅當提示已明確回答該問題時才跳過一個問題(
from_prompt顯示檢測到的內容),並且仍然記錄它。 - 記錄每個答案:
fishvideo interview <dir> --set style=paper-collage --set platforms='["shorts"]'。答案映射到brief.yaml:調色板到brand.colors,心情到分數和節奏,語音和表達到語音配置和後製鏈,風格到紋理、節奏和主題。 - 語音: 在第 4 和 6 輪之後(一旦知道語言和表達方式),執行
fishvideo voices <dir> --audition。提供使用者在build/auditions/中的檔案路徑,讓他們播放,並讓他們挑選。這仍然是訪談的一部分。 - 金鑰: 僅提供與他們答案相關的缺失金鑰。說明如何取得每一項(問題庫中的文字)以及沒有它會發生什麼。如果他們貼上金鑰,使用
--set keys_paste=...記錄。金鑰會去到技能的 gitignored.env檔案,絕不回顯、記錄或提交。如果他們選擇擴充套件,現在安裝到虛擬環境中(pip install "rembg[cpu]"、kokoro soundfile、faster-whisper)。 - 最後,將
fishvideo interview <dir> --summary回讀給使用者。要求一個簡單的「是,開始」,然後執行--confirm。
步驟 2:研究、趨勢和參考(並行執行)
將這些作為並行子代理生成。模型路由:haiku 用於擷取和查找掃描,sonnet 用於分析和常規程式碼,而你 (opus) 用於腳本、故事板、設計判斷和最終審查。為每個代理提供專案路徑和它必須產生的確切輸出檔案。子代理可能無法編寫報告檔案;然後它們返回文字,你儲存它。
| 任務 | 命令 | 代理 |
|---|---|---|
| 事實和來源 | 網頁搜尋,然後 fishvideo research <dir> --url ... → research/facts.md | haiku |
| 趨勢 | fishvideo trends <dir> --topic "<topic>" --region <IN/US> → research/trends.md(標題公式、標籤、鉤子、從當前排名得出的理想長度) | haiku |
| YouTube 查找 | fishvideo yt search "<q>" -n 20 [--recent-days 30]、yt info、yt subs、yt suggest | haiku |
| 參考剖析(使用者提供的每個連結,以及所選風格中 1–2 個熱門趨勢範例) | fishvideo yt download <url> --purpose reference --project <dir>,然後 fishvideo dissect <dir>/reference/<file>.mp4 --out <dir>/reference/dissect --fps 4 [--vtt subs.vtt]。讀取每個工作表、頻譜圖和 timeline.md,然後撰寫 reference/analysis.md,包含參考影片分析的九個部分 | sonnet (vision) |
從剖析中取得數字:變化率、嗖聲時機和音量、語音相對於背景音樂的分貝、閃避深度、響度、字幕樣式。將它們寫入 brief.yaml → match:,以便故事板和混音可以遵循它們。複製工藝,絕不複製內容。
步驟 3:素材、螢幕和語音(並行執行)
真實素材(當 assets.policy 是 mixed 時):
- 搜尋:
fishvideo assets search <dir> "<noun>" --kind photo|video|music|sfx [--providers wikimedia,pexels]。在assets/_candidates/中開啟預覽並查看它們。 - 下載你挑選的:
fishvideo assets get <dir> <ids>。每個檔案都會連同其授權記錄到assets/credits.json。 - 製作去背圖:
fishvideo assets cutout in.jpg out.png(使用isnet-general-use的 rembg;絕不使用非商業預設模型)。 - 準備 B-roll:
fishvideo assets clip <dir> <file> <clip_id> --start S --dur S為footage場景提供幀。 - 取得 CC-BY YouTube 片段:
fishvideo yt clip <url> <start> <end> <dest> --project <dir>。它會拒絕非 CC 影片。 - 允許的授權:CC0、PD、Pexels/Pixabay 授權、CC-BY 和 CC-BY-SA(需註明出處)。絕不允許 NC 或 ND。絕不允許非 CC 的 YouTube 影片、參考影片的鏡頭、你重新繪製的標誌,或以誤導方式使用的真人肖像。
螢幕:
website:列出captures:下的鏡頭,並執行fishvideo capture <dir>。它會以虛擬時間進行唯讀錄製。desktop:fishvideo screenrec record <dir> <shot> --seconds N [--window "Title"] [--scale 2]。在開始之前,確切告訴使用者要執行哪些步驟。F8 放下標記,F9 停止。files:fishvideo screenrec import <dir> <shot> recording.mp4。
三者產生相同的捕捉資料夾。tour 場景 (frame: inset) 添加發光游標、點擊漣漪和點擊音效、1.6–2 倍游標縮放、聚光燈和 STEP 卡片。以 2 倍比例錄製,以保持縮放清晰。
音樂:
- 圖庫曲目:
assets search <dir> "<brief.music.search>" --kind music,然後assets get,並將檔案放入assets/music/。 - 或者保留合成分數。設定
music.source: synth來強制使用。
音效: 執行一次 fishvideo assets sfx-pack (Kenney CC0)。使用 assets search --kind sfx (Freesound CC0) 將更多音效添加到 assets/sfx/<cue-type>/。
語音: 編寫旁白(步驟 4),然後執行 fishvideo voice <dir>。重新執行故事板,使場景根據真實剪輯重新計時。如果使用者錄製了自己的旁白,改為執行 fishvideo voiceover <dir> recording.wav:它使用 faster-whisper 將錄音與腳本對齊,並按行切割。
情緒: 為每個場景指定一個 mood: (curious、tense、urgent、excited、warm、serious、reflective、triumphant、neutral)。它設定每行的速度和音高,以及在 ElevenLabs 上的風格。標點符號在所有引擎上塑造表達方式:... 停頓,? 和 ! 揚起,短句重擊。在節奏之間變化情緒:40 秒的單一音調就是「通用語音」的抱怨。行內的靜默部分會自動裁剪 (pacing.max_word_gap)。
音樂時機: 對於圖庫曲目,執行 fishvideo beats <track>。將故事板 bpm 設定為其節奏,並設定 music.offset,使一個節拍或高潮落在你最大的揭露時刻。
螢幕錄製: 執行 fishvideo screenrec tighten <dir> <shot> 來加速通過空閒時間。永遠不要讓觀看者等待載入旋轉圖示。
步驟 4:故事板(你來編寫)
執行 fishvideo script <dir>。它會根據風格配方 (config/styles.yaml, 風格配方) 建立 storyboard.yaml 的骨架,作為一個充滿 TODO 的節奏骨架。其時序是佔位符。然後按順序正確編寫:
- 替換每個 TODO:複製、參數和旁白。場景目錄頂部的表格列出了必需的參數。
- 撰寫
brief.pu
…
[為翻譯而截斷]