AI 影片生成:文字轉影片、圖片轉影片、影片轉影片、模型選擇。 當需要根據提示或參考素材生成短影片時使用(例如:5 秒的雨中貓咪短片、將這張照片動畫化、重新風格化這段影片)。
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) EOFheredoc(
<<'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。
唯一可靠的使用者端傳遞方式是已下載的本地檔案:
- 使用
result["local_path"](例如output/videos/xxx.mp4)—generate_video成功時一定會下載。 - 告知使用者檔案已儲存到
output/videos/<filename>,可在工作區檔案面板/檔案瀏覽器中檢視。 - 在 Web 頻道上,也將其內嵌顯示,讓使用者可以在聊天中預覽:
(或連結為[video](output/videos/<filename>.mp4)— 工作區會直接提供這些檔案,並帶有正確的標頭)。 - 在 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 預覽來公開素材。
標準流程
- 使用
publish_asset.py將素材放入或複製到output/fal_assets/。 - 確保名為
fal-assets的預覽正在執行且已發布(一次性設定,請參閱 §3)。 - 建構公開 URL 為
<preview_base>/<filename>。 - 呼叫
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_error 在 COMPLETED 之後 |
參考素材主機在渲染過程中失敗 — 重新編碼/調整為 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-proxy→queue.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_cost和transparent-proxy/apis/falai.py::_VIDEO_PRICING中註冊價格。 - 此技能刻意不使用 fal 儲存上傳來託管素材:生產環境的
FAL_KEY缺少 Serverless 權限。在情況改變之前,請繼續使用基於預覽的方法。






