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.

Spis treści 7
👁 180 przeczytań
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.
Mój serwis
Model Wan 3.0 jest w moim serwisie Jantaris, w złotówkach: 4,52 zł za klip 5 s w 720p. BLIK albo karta, faktura VAT, bez abonamentu, a nieudana generacja kosztuje 0 zł.
Wypróbuj Wan 3.0 w Jantarisie →
Cena z VAT z publicznego katalogu Jantarisa, stan na 10.11.2026. Jantaris to mój projekt, dlatego piszę o nim wprost.
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
- 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.
Czytasz Promptowego częściej? Dodaj go do preferowanych źródeł w Google, a nowe teksty będą wyżej w Twoich wynikach.
Ź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
Podstawy sztucznej inteligencjiArtykuły
Czy przez AI stracimy pracę?Artykuły
Zastosowanie sztucznej inteligencji w rolnictwie: precyzyjne rolnictwo i monitorowanie plonówArtykułyCały tydzień w AI, w jednym mailu
Wybrane premiery, narzędzia i analizy. Raz w tygodniu, prosto do skrzynki.
Zapisz się za darmo →
Piotr OlszewskiPiotr Olszewski - twórca i autor Promptowego, polskiego serwisu o sztucznej inteligencji. Codziennie śledzi premiery modeli, narzędzia i regulacje AI, i tłumaczy je prostym, konkretnym językiem.
O mnie →- generatornia.plAndrzejki AI: wróżby, lanie wosku i zdjęcia krok po kroku
- dobieracz.plAI do montażu wideo - CapCut, DaVinci Resolve, Filmora, Riverside, Submagic i Clipchamp
- przelomowy.plLaboratorium AutoDNA w Szanghaju: agenci AI sami prowadzą eksperymenty z DNA
- jutropis.plUstawa o AI podpisana. Skargi do KRiBSI i testy dla firm

