Communitygithub.com

AI 影片生成管線(短影音聯盟行銷)

用於自動化 AI 影片生成(UGC / TikTok 聯盟行銷),整合腳本製作、多引擎生成、自動上傳與排程。

AI 影片生成管線(短影音聯盟行銷) 是什麼?

這個技能實現了一個完整的 AI 影片生成管線,專為短影音平台(如 TikTok)與聯盟行銷優化。它支援多種生成引擎,包括 SnapGen API(首選)和 Google Flow,並整合了腳本旋轉系統(`script_rotation.py`)以確保內容多樣性、避免重複。核心功能包含:從產品截圖自動生成故事板提示、使用主提示 v2.2 強制執行電影級運鏡與燈光規則、透過 TikTok Studio 網頁上傳(間隔 10 分鐘)或 CDP 路徑自動發布、以及透過 Telegram 機器人即時狀態通知。技能還實現了崩潰後恢復機制(保留 UUID 避免重複花費點數)、無聲片段修剪(`trim_dead_air.py`)與影片拼接(`stitch_videos.py`,含自動編輯與字幕)。支援 `snapgen_client.py`(Omni Flash 模型)與 `snapgen_veo_client.py`(Veo 3.1 快速模型)兩種客戶端,並透過 `systemd-run` 實現分離執行模式。**警示:本技能高度依賴特定本地路徑與環境變數(如 `SNAPGEN_API_KEY`),且包含近期(2026 年 8 月)的實測修補。**

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/koyawel0694/Ultra-Prompting/tree/main/skills/media/ai-video-pipeline

在你喜歡的 AI 中提問

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

說明文件

AI 影片生成管線(UGC / TikTok 聯盟行銷)

John 的生產線:產品截圖 → 故事板提示(First Frame UGC Hub 策略)→ Google Flow 生成 → TikTok Studio 網頁上傳(間隔 10 分鐘)→ Telegram 狀態通知 → John 在應用程式內附加商品。反重複 + 電影級修正(2026 年 8 月 6 日):主提示 v2.2 已整合至管線。 每次腳本生成現在必須:(1) 讀取 /home/john/google-flow-automation/master_prompt_v2.2.txt(A-J 部分),(2) 執行 python3 /home/john/google-flow-automation/script_rotation.py pick 並僅從 allowed_strategies/allowed_hooks/allowed_ctas/allowed_personas/allowed_cameras/allowed_lighting 中選取,(3) 在 prompt.json 中寫入額外欄位 strategy/hook_type/persona/cta_line/camera_movement/lighting,(4) 之後執行 script_rotation.py record --strategy N --hook ... --cta ... --persona ... --camera ... --lighting ... --starters ...。旋轉狀態持久化在 rotation_state.json 中(最近 10 個腳本:不重複策略/鉤子/CTA/人物/運鏡/燈光,不重複最近 10 個列表中的句子開頭,'yellow basket' CTA 最多每 3 部影片出現 1 次)。v2.2 新增(John 於 8 月 6 日要求):每個 videoPrompt 必須指定恰好一種運鏡(bank I.1:緩慢推近、溫柔拉遠、橫向滑軌、手持漂移、俯視揭示、低角度推近、環繞、焦點轉移、靜態微動、POV 步入——一個連續 10 秒的運動,從不靜止) + 一種燈光/氣氛(bank I.2:黃金時刻、柔和窗戶日光、舒適傍晚、電影感氛圍、乾淨攝影棚、晨間清新、溫馨咖啡館散景、霓虹夜晚) + 無臉構圖規則(I.3:絕不顯示臉部——僅限手部/POV/過肩從背後/產品特寫;旁白,非螢幕發言者) + 語音時機規格(H:≤20 字 = 約 7-8 秒語音,從第 1 秒開始,拍子之間微停頓,最後 CTA 字在第 8 秒前,結束卡持留 8-10 秒)。主提示副本位於 /home/john/google-flow-automation/master_prompt_v2.2.txt(Downloads/ai_studio_master_prompt.txt 是同步的來源真理——每次編輯後 cp)。截至 2026 年 8 月 6 日的狀態:影子運行完成——管線端到端驗證。TikTok Studio 上傳流程已在同一晚對應(上傳 + AI 切換 + 上傳時商品附加;參考資料中的點擊路徑在 references/tiktok-studio-upload.md)。透過 CDP 的 B 路徑(flow_driver.py,Chrome 151 原生,GOOGLE FLOW 設定檔):上傳 → 附加 → 合規提示 → Omni Flash 10 秒 9:16 x1 生成 → 1080p 升級下載全部成功。早期生成嘗試暫時失敗(一般訊息,未扣點數),但重試成功——請參閱陷阱。

A 路徑——SnapGen API 生成(2026 年 8 月 11 日驗證——新的主要路徑)

snapgen_client.py 現在是首選生成選擇(AUTO_PROMPT 已於 8 月 11 日修補):透過 api.snapgen.ai 進行純 HTTP omni-flash 生成——無需 Chrome/CDP/X11,無需 Flow 點數,無凍結/對話框/雙重生成失敗類別。用法:timeout 400 ~/.venvs/tiktok/bin/python /home/john/google-flow-automation/snapgen_client.py <工作目錄> [--no-upscale] [--max-retries 3]——讀取 prompt.json videoPrompt + product_image*.png,提交 model=omni-flash 10 秒 9:16 1080p(幀模式 ≤2 張圖,ingredient 3),輪詢歷史約 2 分 15 秒,下載簽名 mp4,ffmpeg 升級至 1080x1920(API 返回原生 720x1280——不存在升級端點;--no-upscale 保留 720p),寫入 generated_video.json。退出碼 0 完成 / 1 致命 / 2 暫時。每部影片 30 點;SNAPGEN_API_KEY 在專案 .env 中(John 的帳戶 PP0001)。崩潰後恢復(8 月 12 日——兩個客戶端): UUID 在提交後立即持久化至 <工作目錄>/.snapgen_uuid(omni)/ <分段目錄>/<輸出>.uuid(veo);重新執行時,客戶端在提交新請求前先從歷史記錄輪詢該 UUID(伺服器在客戶端死後繼續生成——8 月 11 日驗證:3 個孤兒 Veo 提交完成並被恢復;重新提交會重複花費點數)。恢復標記在成功時移除;veo 恢復基於缺少的 <輸出>.json 記錄(而非 mp4——未修剪的部分 mp4不得視為完成)。備援鏈:snapgen → flow_batch.py → 手動 CDP。旁白從提示方向即興創作自己的他加祿語混合措辭(相同節奏,非逐字腳本)。影像生成 nano-banana-pro 透過 API 是免費的(5 次請求/分鐘),用於靜態影像客戶端工作——不寫入腳本(John 於 8 月 11 日裁定:Nano Banana 保持僅限瀏覽器)。完整詳情 + 驗證:references/snapgen-api.md + /home/john/google-flow-automation/SNAPGEN_API_ANALYSIS.md。

/generate 互動流程 + Veo 3.1 快速路徑(2026 年 8 月 11 日驗證)

透過 SnapGen API 的 Veo 3.1 快速路徑已驗證(8 月 11 日):4 點數,8.0 秒,9:16 接受(文件說僅支援 16:9——API 寬容),幀到影片含參考圖片,生成遵循腳本的他加祿語混合旁白**(逐字轉錄:「Magaan, komportable, pang araw-araw. Hanapin niyo sa TikTok Shop.」——與 omni-flash 不同,它不太即興創作),原生 720x1280 → ffmpeg 1080p,has_watermark=0,約 2 分 15 秒。機器人命令 /generate(telegram_bot.py,ConversationHandler + 內聯鍵盤,8 月 11 日上線):/generate → [TikTok 聯盟行銷 | 一般影片](存根)→ [Veo 3.1 快速 | Omni Flash] → 腳本風格(CCC/Budol/POV/IRR/電視廣告)→ 數量 1-4 → 寫入 job_orders/generate_<時間戳>.json(product_folder = 最新的 auto- 資料夾,其中包含 product_image.png + product_page.png;如果沒有,機器人會說先發送照片)→ 生成一個全新 agent,使用 GENERATE_PROMPT(--max-turns 400,日誌 job_orders/run_generate_.log)→ agent:OCR 事實 → 將腳本拆分為 N 個片段(Veo ≤16 字/段 8 秒,Omni ≤20/段 10 秒;電視廣告運鏡編排,每段一個動作,跨段連續性)→ Veo 路徑:flow_frame_gen.py 首幀 → N × snapgen_veo_client.py → 如果 >1 則拼接 → 透過 Telegram sendVideo 發送最終 mp4 → 步驟 (9):發送「上傳到 TikTok Studio?」內聯按鈕(genup:yes:<基礎名稱> / genup:no:<基礎名稱>) → 機器人的 gen_upload_choice 處理程序在 ~/tiktok-jobs/ 下解析基礎名稱,並在是時生成一個僅上傳 agent(UPLOAD_PROMPT——final.mp4+prompt.json 已存在,僅上傳/排程:下一個空閒的上午 6 點/下午 6 點時段 → tiktok_studio_upload.py → 驗證 Posts 頁面 → 通知);在否時,影片保留在本機。Omni 路徑:N × flow_batch.py(配料)→ 拼接 → 發送 → 同一步驟 (9)。寫入 GENERATE_PROMPT 的硬性規則(8 月 11 日):/generate agent 絕不觸碰 TikTok Studio——不呼叫 tiktok_studio_upload.py,不進入 Studio 頁面;步驟 (9) 按鈕是上傳的唯一路徑,並且由機器人(而非 agent)執行。 幀生成失敗備援(8 月 11 日):重試一次,然後重用先前成功幀(frame_.png)用於失敗片段;如果所有幀都失敗,則在無 --ref 的情況下執行 Veo 片段,或回退到 Omni——絕不因一個幀而阻塞訂單,絕不即興創作 Studio 上傳。 /generate 目標是最新暫存資料夾——過時產品陷阱(8 月 11 日): latest_product_folder() 選取已包含 product_image.png + product_page.png 的最新 auto-* 資料夾。如果 John 為不同產品發送新照片並在同一分鐘內執行 /generate,則工作可能指向先前產品的資料夾(實際情況:06:17 /generate 抓取了 auto-20260811_054254/Smasher,而他的新照片未暫存在 Product Folder 中——然後他的攝入請求排隊在錯誤產品的生成工作之後,他問「這是為什麼?」)。「⏳ 你的請求已排隊」回應是正確的並發防護行為,而非錯誤——但是當 /generate 訂單排隊時,在讓它執行之前確認它指向哪個 auto-* 資料夾;如果是錯誤的產品,則終止 agent 並刪除其 generate_<時間戳>.json,以便排隊的攝入(暫存新資料夾)成為活動工作。

分離執行模式(8 月 11 日更新——setsid 現在被封鎖): 終端工具拒絕在前景執行 setsid bash -c '...' &(「shell 層級背景包裝器」)。請改用 systemd-run——相同的分離語意,完全在工具的程序組之外:systemd-run --user --unit=<名稱> --collect bash -c '<命令> > <日誌> 2>&1; echo $? > <退出檔案>',然後每約 30 秒輪詢 cat <退出檔案>。使用 systemctl --user is-active <名稱> + tail 日誌驗證啟動。單元使用 --collect 自行清理。已於 8 月 11 日驗證(seg_2 生成 + 拼接均以這種方式運行;崩潰後恢復正常運作)。 崩潰後恢復規則(8 月 11 日,實際情況): 當管線 agent 在訂單中途死亡時,工作資料夾持有已驗證的狀態——在重新生成任何內容之前檢查它。seg_1.mp4 + seg_1.mp4.json(ffprobe 驗證)+ seg_1.json/seg_2.json(腳本已寫入且旋轉已記錄)+ first_frame.png 在崩潰後全部存活。重複使用它們;僅生成缺少的片段。不要重新執行 script_rotation.py record(重複計數會破壞反重複狀態),不要重寫片段 JSON(seg_1.mp4 是根據那個確切提示製作的)。 新腳本(全部已於 8 月 11 日驗證退出碼 0):

  • flow_frame_gen.py <工作目錄> --prompt "<9:16 圖片提示>" [--out first_frame.png]——透過 Flow CDP 的 Nano Banana 2 首幀(僅限瀏覽器——John 的規則,絕不使用影像 API):新專案 → 庫上傳 → attach_smart(僅在庫尚未打開時點擊加號——加號會切換,第二次點擊會關閉它,無聲殺死 Add to Prompt;已驗證修復)→ 設定彈出視窗透過 settings_chip(提示欄晶片在 y~714 底部,文字「Video · 10s crop_9_16 x1」/「🍌 Nano Banana 2 …」——find_btn 的首次匹配擊中頂部欄的齒輪,請使用 y>550 + 最小按鈕探針)→ role=tab 'Image'(標籤文字是字形前綴的:「imageImage」/「videocamVideo」——使用 includes('Image') 匹配,而非 ==)→ 長寬比 crop_9_16 標籤 → Agent 藥丸灰色勾選 → 輸入 + focus+Enter 提交(圖片時箭頭無效)→ 等待圖片卡片 → 透過 cookie+curl 收集器 download_frame(dump_cdp_cookies.py + flow_collect_media.py;選取 9:16 圖片;網格渲染約 768x1376——作為 Veo 參考已足夠;不點擊檢視器——檢視器的下載選單是地雷:只顯示「1K 原始大小」,時機錯誤的點擊會擊中相鄰的垃圾桶圖示(「1 個項目已移至垃圾桶」——從庫的垃圾桶檢視還原 → 全部還原)。收集器修復於 8 月 12 日:角色表(1536x2752)也是 9:16,因此舊的僅長寬比選擇器抓取了角色表而不是生成的幀(08:27 運行的 frame_1 + frame_3——agent 必須手動修復)。download_frame 現在排除角色表的確切尺寸,並優先選擇 (768,1376)。 新專案預設已是 IMAGE 模式(Nano Banana 2 crop_9_16)。
  • snapgen_veo_client.py <工作目錄> --prompt "<片段>" --ref <幀.png> --out seg_<i>.mp4 [--model veo-3.1-fast] [--duration 8] [--aspect 9:16] [--no-upscale]——透過 API 的一個片段(重用 snapgen_client 的已驗證函數;寫入 job-dir/segments/)。退出碼 0/1/2。
  • stitch_videos.py <輸出.mp4> <輸入...> 或 <工作目錄> --out final.mp4(全域匹配 segments/*.mp4 並排序;已於 8 月 12 日修補:*.raw.mp4 原生檔案現在從全域匹配中排除——舊的「先將 raw 移走」規則現在是程式碼防護,不再有影片中插入 720p 的情況)——統一重新編碼(1080x1920 24fps crf18 aac44.1 pad)+ 使用重新編碼拼接(非 -c copy:當輸入時間基準不同時,-c copy 會寫入錯誤的 48/1 r_frame_rate 標頭,例如在 trim_dead_air 的 select/setpts 之後;重新編碼提供乾淨的 24/1——已於 8 月 11 日修補)。已驗證:10 秒 + 8 秒 → 18.0 秒 h264 1080x1920。編輯通道 + 字幕(8 月 15 日): --edit auto 現在是預設值——根據提示感知的每片段運鏡(提示命名了運鏡的片段不獲得額外動作;其他片段根據位置獲得輕微推近/拉遠),輕微調色(對比度 1.03/飽和度 1.05),以及片段之間 0.25 秒交叉淡入淡出(影片 xfade + 音訊 acrossfade,c1=tri:c2=tri——此 ffmpeg 拒絕 'fade')。--caption(Regular/Normal 模式僅——聯盟行銷從不)使用 Groq 轉錄最終拼接影片(免費,~/video-tools/groq_transcribe.py 適配器 → deepcaption build_captions.py → ~/video-tools/burn_ass.py 原生解析度燒錄,樣式最小預設)。缺少金鑰/工具 → 字幕以警告跳過,拼接從不失敗。所有模式已於 8 月 15 日在真實 vox_bf2 片段上驗證(22.97 秒交叉淡入淡出,加字幕的幀視覺確認)。請參閱技能 groq-video-captions 了解完整的免費字幕操作手冊。
  • trim_dead_air.py <輸入.mp4> [--out ...]——靜音修剪(John 的規則 8 月 11 日:「剪掉沒人說話的部分」):Veo/Omni 片段攜帶長長的靜音尾部(已驗證:seg_1 語音 0-3.26 秒,其中 8 秒 = 4.7 秒靜音;第一個拼接測試影片的 43% 是環境噪音)。使用 faster-whisper 單詞時間戳檢測語音(事實來源——能量閾值在此失敗,因為環境尾部高於任何固定的 RMS 截止值),保留 [first_word−0.25s, last_word+0.35s],透過 ffmpeg select/aselect 單通道重建。使用 ~/.venvs/crypto/bin/python 執行(唯一具有 faster-whisper 的 venv)。退出碼 0 已修剪 / 2 無需修剪 / 3 錯誤(保留原始檔——到處都非致命)。自動接入 snapgen_client.py、snapgen_veo_client.py(使用 --no-trim 停用)和 flow_batch.py(下載後)——每個生成的片段在來源處被修剪;/generate agent不得重新生成片段以「恢復」名義上的 8 秒/10 秒長度(已驗證:seg_1 8 秒 → 3.6 秒是正確的)。修剪以 crf 18 重新編碼,以便影格速率/標頭保持乾淨。陷阱(主要在 8 月 12 日修復):snapgen_veo_client 在 segments/ 中留下 <輸出>.raw.mp4(原生 720p)——stitch_videos.py 現在從其全域匹配中排除** .raw.mp4,因此影片中插入 720p 的情況不再可能發生;但將 raw 移至 job-dir/raw_720p/ 仍是良好的衛生習慣。* 此外:--out final.mp4 相對於腳本的 CWD 解析,而非工作目錄——傳遞絕對路徑或先 cd 進入工作目錄(相對 --out 搭配 cwd=google-flow-automation 會無聲地將 final.mp4 寫入那裡)。
  • GENERATE_PROMPT 存在於 telegram_bot.py 中(單一事實來源;.format() 佔位符:config/mode/caption/model/style/count/product_folder/chat_id/duration——模板中無未跳脫大括號,文字 JSON 大括號會使 format 崩潰)。編輯後重新啟動機器人。8 月 15 日: /generate 精靈現在支援兩種模式(一般模式不再無效)——一般模式詢問「添加 wo

Individual skills in this repo

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

相關技能