Wan 3.0: obraz do wideo - ożywiłem zdjęcia, skrypt i koszt
Dwa obrazy z lokalnego generatora zamienione w klipy z dźwiękiem: targ i górskie jezioro. Filmy, polecenia, koszt i gotowy skrypt w Pythonie.

👁 113 przeczytań
- Wan 3.0 zamienia gotowe zdjęcie w klip wideo, przyjmując obraz jako pierwszą klatkę i generując ruch zgodny z poleceniem tekstowym.
- Koszt klipu 5-sekundowego w 720p przez OpenRouter wynosi 0,425 USD niezależnie od tego, czy podajesz obraz startowy, czy sam tekst.
- Krótszy klip 2-sekundowy w 480p kosztował 0,2125 USD, czyli tyle samo co 5-sekundowy, więc zamawianie krótszych klipów nie obniża ceny.
Wan 3.0 z obrazu do wideo ożywia gotowe zdjęcie: podajesz pierwszą klatkę i opisujesz, co ma się wydarzyć. 26 września 2026 roku sprawdziłem to na dwóch obrazach, które wcześniej wygenerowałem lokalnie w Z-Image Turbo: sprzedawczyni na targu i jezioro w górach. Oba klipy zachowały każdy szczegół zdjęcia i zrobiły dokładnie to, o co prosiłem. Poniżej filmy, obrazy wyjściowe, koszt i gotowy skrypt.
W skrócie
Obraz do wideo w Wan 3.0 działa lepiej niż generowanie od zera, bo model nie musi wymyślać wyglądu sceny. Sprzedawczyni podała klientce koperek, a za nią przeszli przechodnie. Nad jeziorem przesunęła się mgła, a światło zeszło po szczytach. Koszt ten sam co bez obrazu: 0,425 USD za 5 sekund 720p. Czas: 159 i 321 sekund. Tak można tanio zrobić własną scenę: obraz za 0,04 grosza lokalnie, a ruch za 1,64 zł w chmurze.
Test 1: targ

The elderly woman picks up a bunch of dill and hands it to a customer outside the frame, smiling; people walk past in the background of the market, natural market sounds, handheld documentary camera.Test 2: jezioro w górach

Morning mist drifts slowly across the mountain lake, the first sunlight moves down the granite peaks, a light breeze ripples the water, static camera on a tripod, calm ambient sound.Jak to zrobić: skrypt jednym poleceniem
Przygotowałem skrypt w Pythonie, który wysyła zadanie do OpenRoutera, czeka na wynik i zapisuje MP4. Obraz startowy podajesz opcją --obraz, jako plik z dysku albo adres https. Przed wysłaniem skrypt pokazuje szacowany koszt i pyta o zgodę. Sprawdziłem go 26.09.2026 i przy okazji wyszła ciekawostka: klip 2-sekundowy w 480p kosztował 0,2125 USD, czyli tyle, ile 5 sekund. Krótsze klipy nie są tańsze.
- Pobierz: generuj-wan3.py (licencja MIT). Potrzebujesz klucza OpenRoutera i biblioteki requests.
- Z obrazu:
python generuj-wan3.py "mist drifts over the lake, static camera" --obraz jezioro.png - Tani podgląd:
--rozdzielczosc 480p, pion do rolek:--proporcje 9:16, dłuższy klip:--sekundy 10.
Zanim uruchomisz skrypt z internetu, przeczytaj go. Pełny kod:
"""
generuj-wan3.py - klip z Wan 3.0 przez API OpenRouter, z dźwiękiem, także z obrazu startowego (promptowy.com/wan-ai/)
Autor: Piotr Olszewski, promptowy.com. Licencja skryptu: MIT. Sprawdzone 26.09.2026 (OpenRouter, alibaba/wan-3.0).
Potrzebujesz: klucza OpenRouter w zmiennej środowiskowej OPENROUTER_API_KEY i biblioteki requests (pip install requests).
Koszt: cennik OpenRouter podaje 0,05 / 0,10 / 0,20 USD za sekundę (480p / 720p / 1080p), a faktycznie naliczył mi
0,085 USD za sekundę w 720p (5 s = 0,425 USD) i 0,2125 USD za klip 2 s w 480p - czyli minimum jak za 5 sekund.
Skrypt przed wysłaniem pokazuje szacunek i pyta o zgodę.
Przykłady (PowerShell: najpierw $env:OPENROUTER_API_KEY = "sk-or-..." ):
python generuj-wan3.py "a yellow tram passing a rainy street at dusk, static camera"
python generuj-wan3.py "mist drifts over the lake, static camera" --obraz jezioro.png --sekundy 8
python generuj-wan3.py "szkic ujęcia" --rozdzielczosc 480p --sekundy 3 --tak (tani podgląd, bez pytania)
"""
import argparse, base64, json, mimetypes, os, sys, time
try:
import requests
except ImportError:
sys.exit("Brak biblioteki requests. Zainstaluj: pip install requests")
MODEL = "alibaba/wan-3.0"
CENA = {"480p": 0.0425, "720p": 0.085, "1080p": 0.17} # USD za sekundę faktycznie naliczane przez OpenRouter 26.09.2026
MIN_SEKUND = 5 # w moim teście klip 2 s kosztował tyle co 5 s
def main():
a = argparse.ArgumentParser(description="Klip z Wan 3.0 przez OpenRouter")
a.add_argument("polecenie", help="opis ujęcia; dialog po polsku wpisz w cudzysłowie w treści polecenia")
a.add_argument("--obraz", help="obraz startowy (pierwsza klatka): plik PNG/JPG albo adres https")
a.add_argument("--sekundy", type=int, default=5, choices=range(2, 31), metavar="2-30")
a.add_argument("--rozdzielczosc", default="720p", choices=list(CENA))
a.add_argument("--proporcje", default="16:9", choices=["16:9", "4:3", "1:1", "3:4", "9:16"])
a.add_argument("--bez-dzwieku", action="store_true")
a.add_argument("--seed", type=int)
a.add_argument("--tak", action="store_true", help="nie pytaj o zgodę na koszt")
a.add_argument("--wyjscie", default="wan3")
x = a.parse_args()
klucz = os.environ.get("OPENROUTER_API_KEY")
if not klucz:
sys.exit("Ustaw klucz: $env:OPENROUTER_API_KEY = \"sk-or-...\" (PowerShell) albo set OPENROUTER_API_KEY=... (cmd)")
szac = CENA[x.rozdzielczosc] * max(x.sekundy, MIN_SEKUND)
print(f"Wan 3.0: {x.sekundy} s, {x.rozdzielczosc}, {x.proporcje}, dźwięk: {'nie' if x.bez_dzwieku else 'tak'}. Szacowany koszt: {szac:.2f} USD")
if not x.tak and input("Wysłać? [t/N] ").strip().lower() not in ("t", "tak", "y"):
sys.exit("Anulowano.")
body = {"model": MODEL, "prompt": x.polecenie, "duration": x.sekundy, "resolution": x.rozdzielczosc,
"aspect_ratio": x.proporcje, "generate_audio": not x.bez_dzwieku}
if x.seed is not None:
body["seed"] = x.seed
if x.obraz:
if x.obraz.startswith("https://"):
url = x.obraz
else:
typ = mimetypes.guess_type(x.obraz)[0] or "image/png"
url = f"data:{typ};base64," + base64.b64encode(open(x.obraz, "rb").read()).decode()
body["frame_images"] = [{"type": "image_url", "image_url": {"url": url}, "frame_type": "first_frame"}]
H = {"Authorization": "Bearer " + klucz, "Content-Type": "application/json"}
t0 = time.time()
r = requests.post("https://openrouter.ai/api/v1/videos", headers=H, json=body, timeout=120)
if r.status_code >= 300:
sys.exit(f"OpenRouter odrzucił zadanie ({r.status_code}): {r.text[:500]}")
zad = r.json()
url = zad.get("polling_url") or f"https://openrouter.ai/api/v1/videos/{zad['id']}"
print(f"Zadanie {zad.get('id')} przyjęte. Generowanie trwa zwykle 2-4 minuty...")
while True:
time.sleep(15)
s = requests.get(url, headers=H, timeout=60).json()
st = s.get("status")
print(f"\r {st}, {time.time() - t0:.0f} s", end="", flush=True)
if st == "completed":
break
if st in ("failed", "cancelled", "expired"):
print(); sys.exit("Nie udało się: " + json.dumps(s, ensure_ascii=False)[:600])
print()
os.makedirs(x.wyjscie, exist_ok=True)
plik = os.path.join(x.wyjscie, f"wan3_{time.strftime('%Y%m%d_%H%M%S')}.mp4")
v = requests.get(s["unsigned_urls"][0], headers=H, timeout=300)
open(plik, "wb").write(v.content)
koszt = (s.get("usage") or {}).get("cost")
print(f"Gotowe: {plik} ({len(v.content) / 1e6:.1f} MB), {time.time() - t0:.0f} s, koszt: {koszt} USD")
if __name__ == "__main__":
main()
Wskazówki
Nie przepłacaj za te subskrypcje
Prowadzę sklep z rocznymi dostępami do narzędzi AI - te same konta, o których piszę wyżej, tylko taniej niż w cenniku producenta.
- Opisuj ruch, nie wygląd. Wygląd jest już na obrazie. Polecenie ma mówić, co się dzieje i jak zachowuje się kamera.
- Obraz w tych samych proporcjach co klip. Moje obrazy miały 1344×768, czyli prawie 16:9, i nic nie zostało ucięte.
- Własne zdjęcia ludzi tylko za zgodą. Ożywianie zdjęć prawdziwych osób bez ich wiedzy to prosta droga do deepfake’a. Zasady opisuję w tekście o deepfake’ach.
Najczęstsze pytania
Czy Wan 3.0 zrobi film ze zdjęcia?
Tak, obraz podajesz jako pierwszą klatkę. W moim teście dwa obrazy zamieniły się w 5-sekundowe klipy 720p z dźwiękiem, bez zmiany wyglądu sceny, po 0,425 USD za klip.
Czy obraz do wideo kosztuje więcej?
Nie. Przez OpenRouter klip z obrazem startowym kosztował tyle samo co z samego tekstu: 0,425 USD za 5 sekund 720p.
Jak długo trwa generowanie?
W moim teście 159 i 321 sekund na 5-sekundowy klip.
Źródła i data sprawdzenia
Test własny 26.09.2026: Wan 3.0 przez OpenRouter: Wan 3.0 (frame_images, first_frame), obrazy startowe z Z-Image Turbo lokalnie. Dokumentacja API wideo: OpenRouter. Sprawdzone 26 września 2026.
Cały tydzień w AI, w jednym mailu
Wybrane premiery, narzędzia i analizy. Raz w tygodniu, prosto do skrzynki.
Zapisz się za darmo →Najczęstsze pytania
Ile kosztuje generowanie wideo z obrazu w Wan 3.0 przez OpenRouter?
Klip 5-sekundowy w 720p kosztuje 0,425 USD, niezależnie od tego, czy podajesz obraz startowy. Stawka wynosi 0,085 USD za sekundę w 720p, a minimalna opłata odpowiada 5 sekundom - klip 2-sekundowy w 480p kosztował tyle samo, czyli 0,2125 USD.
Jak długo trwa generowanie klipu z obrazu w Wan 3.0?
W teście z 26 września 2026 roku dwa klipy 5-sekundowe wygenerowały się w 159 i 321 sekund. Czas generowania może się różnić w zależności od ujęcia.
Jak uruchomić skrypt generuj-wan3.py, żeby stworzyć klip z obrazu?
Podajesz opis ujęcia i dodajesz opcję --obraz z nazwą pliku PNG lub JPG, np. python generuj-wan3.py "mist drifts over the lake, static camera" --obraz jezioro.png. Skrypt wymaga klucza OpenRouter w zmiennej środowiskowej OPENROUTER_API_KEY oraz biblioteki requests.
Czy klip wideo z Wan 3.0 zachowuje wygląd oryginalnego zdjęcia?
Tak, w obu testach twarz, ubranie i szczegóły sceny pozostały bez zmian w porównaniu z obrazem startowym. Model generuje tylko ruch opisany w poleceniu, a nie wymyśla wyglądu sceny od nowa.
