video

video

AI 影片生成:文字轉影片、圖片轉影片、影片轉影片、模型選擇。 當需要根據提示或參考素材生成短影片時使用(例如:5 秒的雨中貓咪短片、將這張照片動畫化、重新風格化這段影片)。

19星標
10分支
更新於 2026/7/28
SKILL.md
readonlyread-only
name
video
description

AI 影片生成:文字轉影片、圖片轉影片、影片轉影片、模型選擇。 當需要根據提示或參考素材生成短影片時使用(例如:5 秒的雨中貓咪短片、將這張照片動畫化、重新風格化這段影片)。

version
3.4.2

video

在 Starchild 上,所有影片生成請求都使用此技能。

核心原則: 呼叫提供的腳本。不要重新實作代理/計費/上傳等底層邏輯。


1. 文字轉影片(最常見)

⚠️ 執行環境 — 請先閱讀此說明。
下方的程式碼區塊是 Python,不是 shell 指令。Starchild 的 bash 工具
執行 /bin/bash -c,無法解析 exec(open(...)) — 直接貼到 bash 指令中會失敗,出現 syntax error near unexpected token 'open'
此外,在 python3 -c 中使用 exec(open(...)) 會因為腳本使用 __file__ 進行路徑解析而失敗,出現 NameError: __file__

透過 bash 工具呼叫時,請使用 python3 - <<'EOF' 搭配 from exports import

python3 - <<'EOF'
import sys
sys.path.insert(0, "skills/video")
from generate_video import generate_video
result = generate_video(
    prompt="A cinematic drone shot over snowy mountains at sunrise",
    model="balanced",
    duration=5,
)
print(result)
EOF

heredoc(<<'EOF')會保留所有引號和換行 — 無需跳脫。
注意:video 技能沒有 exports.py — 直接從 generate_video 匯入。

exec(open('skills/video/generate_video.py').read())
result = generate_video(
    prompt="A cinematic drone shot over snowy mountains at sunrise",
    model="balanced",   # "budget" | "balanced" | "premium"
    duration=5,
)
# result -> {"success": True, "cost": 0.70, "video_url": "...", "local_path": "output/videos/..."}

generate_video 會自動:提交 → 輪詢 → 取得結果 → 下載 mp4 到 output/videos/

將結果傳遞給使用者 — 重要

絕對不要將原始 video_url(例如 https://*.fal.media/.../*.mp4)直接交給使用者。 fal 提供的這些檔案帶有 Content-Security-Policy: sandbox; default-src 'none',這表示:

  • 在瀏覽器中開啟連結會顯示空白頁面(不會觸發內嵌播放器)。
  • 透過 <video> / <iframe> 嵌入會被 CSP 封鎖。
  • 沒有 Content-Disposition: attachment 標頭,因此瀏覽器也不會自動下載。
  • 修改 URL(查詢參數、?download=1 等)無法解決此問題 — 只有伺服器端修改標頭才行,而我們無法控制 fal 的 CDN。

唯一可靠的使用者端傳遞方式是已下載的本地檔案

  1. 使用 result["local_path"](例如 output/videos/xxx.mp4)— generate_video 成功時一定會下載。
  2. 告知使用者檔案已儲存到 output/videos/<filename>,可在工作區檔案面板/檔案瀏覽器中檢視。
  3. 在 Web 頻道上,也將其內嵌顯示,讓使用者可以在聊天中預覽:
    ![video](output/videos/<filename>.mp4)
    
    (或連結為 [video](output/videos/<filename>.mp4) — 工作區會直接提供這些檔案,並帶有正確的標頭)。
  4. 在 Telegram / WeChat 上:透過 send_to_telegram(file_path="output/videos/...", message_type="video")send_to_wechat(file_path="output/videos/...", message_type="video") 傳送檔案。

如果下載失敗(local_path 遺失)— 使用以下指令重新取得:

curl -L -o output/videos/<filename>.mp4 "<video_url>"

然後傳遞本地路徑。仍然不要將原始 fal URL 作為主要交付物提供給使用者。


2. 圖片轉影片 / 影片轉影片(參考素材)

fal.ai 需要參考素材作為公開的 https URL。fal 儲存上傳需要您的金鑰目前不具備的 Serverless 權限。可靠的途徑是透過已發布的 Starchild 預覽來公開素材。

標準流程

  1. 使用 publish_asset.py 將素材放入或複製output/fal_assets/
  2. 確保名為 fal-assets 的預覽正在執行且已發布(一次性設定,請參閱 §3)。
  3. 建構公開 URL<preview_base>/<filename>
  4. 呼叫 generate_video(... image_url=public_url)
# 步驟 1:將本地圖片發布到素材資料夾
exec(open('skills/video/publish_asset.py').read())
asset = publish_local('/path/to/your/photo.jpg')
# 或:publish_from_url('https://example.com/photo.jpg')

filename = asset['filename']

# 步驟 2:結合預覽的公開基礎 URL(請參閱 §3)
public_url = f"https://community.iamstarchild.com/<user_slug>-fal-assets/{filename}"

# 步驟 3:圖片轉影片
exec(open('skills/video/generate_video.py').read())
result = generate_video(
    prompt="gentle cinematic camera push-in",
    model="balanced",
    duration=5,
    image_url=public_url,
)

當提供 image_url 時,generate_video 會自動將模型路徑從 */text-to-video 改寫為 */image-to-video。相同方法也適用於影片轉影片模型 — 改傳送 mp4 URL。

素材限制(由 publish_asset.py 強制執行)

  • 圖片:.jpg .jpeg .png .webp .gif .bmp,最大 10 MB
  • 影片:.mp4 .mov .webm .mkv .m4v,最大 100 MB
  • 超出這些範圍的內容在發布前會被拒絕

3. 一次性 fal-assets 公開預覽設定

每個工作區執行一次。預覽會跨工作階段持續執行。

# 3.1 確保素材資料夾存在,並包含一個佔位索引檔
import os, pathlib
pathlib.Path('output/fal_assets').mkdir(parents=True, exist_ok=True)
if not os.path.exists('output/fal_assets/index.html'):
    open('output/fal_assets/index.html', 'w').write(
        '<!doctype html><html><body><h1>fal asset host</h1></body></html>'
    )

# 3.2 啟動預覽
preview(action='serve', dir='output/fal_assets', title='fal-assets')

# 3.3 發布到公開 URL
preview(action='publish', preview_id='<id from step 3.2>', slug='fal-assets', title='fal-assets')
# → 公開基礎 URL:https://community.iamstarchild.com/<user_slug>-fal-assets/

發布後,公開基礎 URL 可重複用於所有未來的圖片轉影片 / 影片轉影片任務。放入 output/fal_assets/ 的檔案會立即以 <base>/<filename> 的形式存取 — 無需重新發布。

使用以下指令驗證:

curl -sI https://community.iamstarchild.com/<user_slug>-fal-assets/<filename>
# 預期:HTTP/2 200, content-type: image/* or video/*

如果 preview(action='serve') 回傳 No available ports in pool,請詢問使用者可以停止哪個現有預覽以釋放連接埠 — 切勿自動終止任何預覽。


4. 模型選擇

層級 模型 每 5 秒費用 備註
budget fal-ai/wan/v2.5/text-to-video $0.25 最快、最便宜;適合提示迭代
balanced alibaba/happy-horse/text-to-video $0.70 預設;最佳唇形同步,適用於大多數使用案例
premium bytedance/seedance-2.0/fast/text-to-video $1.20 最佳動態 + 鏡頭方向
mini bytedance/seedance-2.0/mini/text-to-video $0.36 (480p) / $0.77 (720p) 最便宜的 Seedance;解析度分級,無 1080p。duration 必須是字串"5",不是 5"5s")— 請參閱下方的陷阱
xai/grok-imagine-video/v1.5/image-to-video 每 5 秒 $0.41 (480p) / $0.71 (720p) 僅限圖片轉影片(單一必填 image_url,無 image_urls);+$0.01 輸入圖片附加費已包含在估算中。⚠️ resolution="1080p" 在上游 schema 有效但沒有公布的價格 — 代理會以 400 錯誤拒絕
fal-ai/kling-video/v3/turbo/standard/text-to-video 每 5 秒 $0.56 Kling v3 Turbo Standard,固定 $0.112/s;.../turbo/pro/... = $0.14/s ($0.70/5s);.../v3/4k/... = $0.42/s ($2.10/5s)。所有變體都有 i2v 版本
alibaba/happy-horse/v1.1/text-to-video 每 5 秒 $0.70 (720p) / $0.90 (1080p) v1.1 有自己的 1080p 層級 $0.18/s(不是 v1.0 的 2 倍規則);也有 /image-to-video/reference-to-video

⚠️ Happy Horse 預設解析度上游為 1080p(v1.0 和 v1.1):省略 resolution 會以 1080p 層級計費(v1.1 5s = $0.90;v1.0 ref2v 5s = $1.40)。明確傳遞 resolution="720p" 以獲得較低費率。無效的解析度值會被代理以 400 拒絕。

參考轉影片alibaba/happy-horse/reference-to-video.../v1.1/reference-to-video):傳遞 image_urls=[...](1–9 個公開 HTTP(S) URL 的清單)— 不是單一的 image_url 參數。generate_video() 會驗證數量與 URL 格式,並提交 image_urls 酬載欄位。

若要覆蓋模型,請將完整的模型 ID 傳遞給 generate_video(model=...)。圖片轉影片變體會透過將 text-to-video 取代為 image-to-video 自動衍生。

定價詳細資訊和模型註冊表位於 generate_video.py::estimate_cost


5. 輪詢現有請求

exec(open('skills/video/poll_status.py').read())
result = poll_video("019ded6c-d871-7290-bbf1-ddc6993f8958")

當先前的 generate_video 呼叫逾時,或您只有 request_id 時使用此方法。


6. 提供的腳本

  • generate_video.py — 提交 → 輪詢 → 下載。處理文字轉影片和圖片轉影片。
  • publish_asset.py — 將本地檔案(或下載遠端 URL)複製到 output/fal_assets/,以便透過 fal-assets 預覽提供服務。
  • poll_status.py — 透過 request_id 繼續輪詢,完成時下載結果。

7. 疑難排解

問題 解決方法
image_url must be a public HTTP(S) URL 使用 publish_asset.py + fal-assets 預覽,然後傳遞公開 URL
No available ports in pool(預覽 serve) 詢問使用者要停止哪個預覽;不要自動終止
downstream_service_errorCOMPLETED 之後 參考素材主機在渲染過程中失敗 — 重新編碼/調整為 16:9,重新發布,重試
HTTP 402 insufficient_credits 充值餘額;提交時預先扣款
HTTP 403 endpoint_not_allowed sc-proxy 只允許已核准的 fal 影片端點;從模型表中選擇一個
上游生成 FAILED 縮短提示,移除不常見的 token,在更換模型前重試一次
HTTP 422 literal_error 關於 duration(Seedance Mini) Mini 要求 duration字串"5""10""auto"),不是整數也不是 "5s"。當 model 包含 seedance-2.0/mini 時,generate_video() 會自動編碼 — 只有當您手動建構請求主體時才會遇到此問題。其他 Seedance 變體仍接受整數/"5s"
工作卡在 IN_PROGRESS 超過 15 分鐘 儲存 request_id,稍後使用 poll_status.py 繼續
使用者回報 fal.media 連結「顯示空白」/「空白頁面」 這是預期行為 — fal 使用 CSP: sandbox; default-src 'none' 提供服務。改為傳遞 result["local_path"] 的本地檔案,而不是原始 URL(請參閱 §1)。

8. 基礎架構(參考)

  • 呼叫端 → sc-proxyqueue.fal.run(和 api.fal.ai)→ fal 模型提供者
  • 所有請求必須包含 Authorization: Key fake-falai-key-12345(代理會注入真實的 FAL_KEY
  • 提交時預先扣款。輪詢/結果呼叫免費。
  • 允許的端點:已註冊模型的影片文字轉影片 / 圖片轉影片 / 影片轉影片 / 編輯影片。其他端點會回傳 403 endpoint_not_allowed
  • 最終 mp4 位於 https://*.fal.media/... — 公開 CDN,下載無需驗證。

9. 維護

  • 新增模型 → 在 generate_video.py::estimate_costtransparent-proxy/apis/falai.py::_VIDEO_PRICING 中註冊價格。
  • 此技能刻意使用 fal 儲存上傳來託管素材:生產環境的 FAL_KEY 缺少 Serverless 權限。在情況改變之前,請繼續使用基於預覽的方法。