Corso
Sora 2 è stato rilasciato a fine settembre con la promessa che presto sarebbe stato disponibile atraverso l'API di OpenAI. Quel momento è finalmente arrivato, e io sono qui per mostrarti come usarla al meglio.
In questo tutorial, ti guiderò nell'uso di Python per generare video con l'IA. Se vuoi saperne di più su Sora 2 e su come usarlo direttamente su OpenAI, ti consiglio di leggere questo articolo su Sora 2. Per dare un'occhiata agli strumenti concorrenti, ti suggerisco la nostra guida a Seedance 2.0 e il nostro tutorial su Veo 3.1.
Ecco un esempio del tipo di video che sarai in grado di creare alla fine di questo tutorial:
Primi passi con l'API di OpenAI
Per iniziare, dobbiamo creare un account OpenAI e una chiave API. Per farlo, vai alla loro pagina delle chiavi API e fai clic su "Create new secret key" in alto a destra.
Questa chiave serve per effettuare richieste all'API di OpenAI. La salviamo in un file chiamato .env nella cartella in cui scriviamo i nostri script Python. Assicurati di tenerla segreta, perché chiunque potrebbe usarla per interagire con l'API tramite il tuo account.
Incolla la chiave API nel file .env con il seguente formato:
OPENAI_API_KEY=<paste_api_key_here>
Nota che usare l'API non è gratuito, quindi è necessario ricaricare il tuo account prima di poter generare video con Sora 2. Per riferimento, ecco il costo al secondo di Sora 2:
Generare un video con Sora 2 usando Python
Tutto il codice di questo tutorial si può trovare in questa repository GitHub.
Per comunicare con l'API di OpenAI usando Python, useremo il pacchetto openai. Nota che, poiché Sora è nuova nell'API, serve una versione recente del pacchetto.
Possiamo usare questo comando per installarlo (o aggiornare la versione attuale se è già installato):
pip install --upgrade openai
Crea un nuovo script chiamato generate_video.py nella stessa cartella del file .env che abbiamo creato prima.
Il primo passo è importare i pacchetti necessari. Ecco quelli che useremo:
os: un pacchetto integrato per interagire con il sistema operativo;openai: il pacchetto ufficiale di OpenAI per interagire con la loro API;dotenv: un pacchetto che facilita il caricamento delle variabili d'ambiente dal file.env. In questo caso, lo usiamo per caricare la chiave API di OpenAI.
import os
from openai import OpenAI
from dotenv import load_dotenv
Poi carichiamo il file .env:
load_dotenv()
API_KEY = os.getenv("OPENAI_API_KEY")
Con la chiave API in memoria, possiamo inizializzare il client OpenAI, che ci permette di effettuare richieste all'API di OpenAI. Usiamo la libreria os per caricare la chiave API:
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
Infine, usiamo la funzione videos.create del client per generare un video:
video = client.videos.create(
prompt="A cat and a dog dancing",
)
print(video.id)
Quando richiediamo la generazione del video, non lo riceviamo subito perché la creazione richiede un po' di tempo. Questo significa che la variabile video non è il video in sé, ma un oggetto che contiene le informazioni sul job di generazione.
Ecco perché abbiamo stampato l'identificatore del video. È l'informazione di cui avremo bisogno per:
- Monitorare l'avanzamento della generazione.
- Recuperare il video.
Spiegheremo nel dettaglio entrambi i passaggi qui sotto.
Ecco il risultato che ho ottenuto:
Monitorare l'avanzamento del video
Possiamo recuperare lo stato di un job passando l'identificatore del job alla funzione videos.retrieve(), così:
job = client.videos.retrieve(job_id)
status = job.status
progress = job.progress
print(f"Status: {status}, {progress}%")
Dobbiamo attendere che l'avanzamento raggiunga il 100% per poter scaricare il video. Per comodità, costruiamo una funzione, wait_for_video_to_finish(), che monitora lo stato di un job finché non viene completato:
def wait_for_video_to_finish(video_id, poll_interval=5, timeout=600):
"""
Poll status until the video is ready or timeout is reached.
Returns the final job info.
"""
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
elapsed = 0 # Keep track of the elapsed time
while elapsed < timeout:
job = client.videos.retrieve(video_id)
status = job.status
progress = job.progress
print(f"Status: {status}, {progress}%")
if status == "completed":
return job
if status == "failed":
raise RuntimeError(f"Failed to generate the video: {job.error.message}")
time.sleep(poll_interval)
elapsed += poll_interval
raise RuntimeError("Polling timed out")
La funzione ha tre parametri:
video_id: l'identificatore del video che vogliamo tracciare.poll_interval: quanti secondi attendiamo tra una richiesta di stato e la successiva.timeout: il numero massimo di secondi da attendere.
Questa funzione controlla periodicamente lo stato del video finché non viene completato o finché non scade il tempo di polling.
Scaricare il video
Ora che possiamo tracciare il processo di generazione, ci serve solo un modo per scaricare il video quando è pronto. Possiamo farlo usando la funzione videos.download_content().
Ecco una funzione che lo fa:
def download_video(video_id):
client = get_client()
response = client.videos.download_content(
video_id=video_id,
)
video_bytes = response.read()
with open(f"{video_id}.mp4", "wb") as f:
f.write(video_bytes)
Workflow completo per la generazione di video con Sora
Possiamo unire questi passaggi per creare un workflow di generazione video con Sora:
prompt = "A cat and a dog dancing"
video = client.videos.create(
prompt="A cat and a dog dancing",
)
video_id = video.id
print(f"Started generating video with id {video_id}")
wait_for_video_to_finish(video_id)
download_video(video_id)
Impostare dimensioni e durata del video
Lo script sopra usa solo un prompt testuale per generare il video. Tuttavia, l'API OpenAI Sora 2 offre altre opzioni, come:
model: il modello usato per generare il video. Per impostazione predefinita, èsora-2.resolution: la dimensione del video. Per impostazione predefinita, è720x1280.duration: la durata in secondi del video. Per impostazione predefinita, è di 4 secondi.
Ecco una tabella con tutti i valori possibili a seconda della modalità (in grassetto i valori predefiniti):

Per rendere lo script più comodo, possiamo usare il pacchetto integrato argparse per permettere all'utente di specificare il valore di ogni parametro.
Ecco un esempio di come impostare gli argomenti prompt e model con argparse:
parser = argparse.ArgumentParser()
parser.add_argument(
"--prompt", # Name of the argument
required=True, # Specify that the argument is required
help="The video prompt.", # Helper text
)
parser.add_argument(
"--model",
default="sora-2", # Specify a default value for the argument
choices=["sora-2", "sora-2-pro"], # Specify a list of possible values for the argument
help="Model to use (sora-2 or sora-2-pro).",
)
Per caricare gli argomenti, chiamiamo il metodo parse_args(), così:
args = parser.parse_args()
prompt = args.prompt
model = args.model
Lo script generate_video_pipeline.py nella repository GitHub mette insieme tutti i pezzi che abbiamo visto in uno script in grado di generare video con Sora 2.
Ecco un esempio di come eseguirlo nel terminale con parametri specifici:
python generate_video_pipeline.py --prompt "A family of dogs driving a car" --model sora-2-pro --size 1280x720 --seconds 8
Questo è stato il risultato:
Consigli per i prompt dell'API Sora 2
OpenAI fornisce una guida completa ai prompt per Sora 2.
Le idee fondamentali per costruire un buon prompt per Sora 2 sono:
- Bilanciare dettaglio e libertà: prompt specifici danno controllo; quelli semplici stimolano la creatività.
- Impostare i parametri nell'API: definisci esplicitamente modello (sora-2 o sora-2-pro), risoluzione e durata della clip.
- Pensa per inquadrature: descrivi inquadratura, luce, soggetto e un'azione chiara per ogni shot.
- Sii visivo e concreto: “asfalto bagnato sotto luci al neon” batte “una strada bellissima”.
- Mantieni i movimenti semplici: una sola azione del soggetto + un solo movimento di camera funziona meglio.
- Luce: definisci qualità, direzione e palette dei colori per coerenza.
- Usa riferimenti visivi: aggiungi un input visivo per ancorare stile e composizione.
- Dialoghi: battute brevi e naturali; etichettate chiaramente; poche per clip.
- Itera con Remix: modifica un elemento alla volta (illuminazione, lente, palette) per un controllo preciso.
Hanno raccolto queste idee nel seguente template di prompt:
[Prose scene description in plain language. Describe characters, costumes, scenery, weather and other details. Be as descriptive to generate a video that matches your vision.]
Cinematography:
Camera shot: [framing and angle, e.g. wide establishing shot, eye level]
Mood: [overall tone, e.g. cinematic and tense, playful and suspenseful, luxurious anticipation]
Actions:
- [Action 1: a clear, specific beat or gesture]
- [Action 2: another distinct beat within the clip]
- [Action 3: another action or dialogue line]
Dialogue:
[If the shot has dialogue, add short natural lines here or as part of the actions list. Keep them brief so they match the clip length.]
Fornire prompt lunghi nel terminale è scomodo. Per migliorare l'esperienza, possiamo modificare il nostro script in modo che, se il prompt termina con .txt, lo script presuma che l'utente stia fornendo il percorso di un file di testo contenente il prompt.
Ecco come possiamo aggiornare lo script per supportarlo:
...
args = parser.parse_args()
prompt = args.prompt
if prompt.endswith(".txt"):
with open(prompt, "rt") as f:
prompt = f.read()
video_id = generate_video(prompt, args.model, args.size, args.seconds)
...
Per testarlo, ho creato un file nella stessa cartella chiamato prompt.txt con il seguente prompt:
A polite green alien wearing a beret struggles to order croissants in broken French at a bustling Paris café.
Cinematography:
Camera shot: eye-level shot, warm morning light
Mood: whimsical and awkward
Actions:
The alien studies the pastry display, fascinated.
It points to the baguette, then accidentally eats the napkin.
The waiter shrugs, unfazed, and brings it another napkin.
Dialogue:
Alien (content): “Très… chewy.”
Per generare il video, forniamo prompt.txt nel parametro --prompt:
python generate_video_pipeline.py --prompt prompt.txt --model sora-2-pro --size 1280x720 --seconds 8
Ecco il video:
Si vede che non ha seguito del tutto il prompt. Dalla mia esperienza con i modelli video IA, ho sempre ottenuto risultati migliori creando più video semplici e unendoli in seguito.
Per farlo, però, dobbiamo renderli coerenti tra loro. Possiamo riuscirci fornendo un'immagine di riferimento al modello. È ciò che impariamo ora.
Generare video Sora 2 a partire da immagini
Per generare un video partendo da un'immagine, usiamo il parametro input_reference.
Ecco un esempio di come caricare un'immagine e fornirla al modello come riferimento:
f = open("image_reference.jpeg", "rb")
# Generate the video
video = client.videos.create(
prompt="The two people walk away from each other.",
input_reference=f
)
f.close()
wait_for_video_to_finish(video.id)
download_video(video.id)
Lo script generate_video_with_reference.py nella repository GitHub fornisce un esempio completo e funzionante. Eseguendolo sull'immagine di riferimento, abbiamo ottenuto questo:
Perché l'immagine di riferimento funzioni, deve avere le stesse dimensioni di quelle richieste per la generazione del video.
Possiamo usare il pacchetto Pillow per ridimensionare automaticamente l'immagine di riferimento prima di fornirla al modello. Nota, però, che se il rapporto d'aspetto dell'immagine originale è molto diverso, l'immagine verrà distorta e il video probabilmente non sarà di buona qualità.
Per installarlo, usa il comando:
pip install Pillow
Lo script sora.py fornisce un'implementazione della funzione generate_video() che adatta il codice scritto prima per ridimensionare l'immagine se ne viene fornita una.
Lo script generate_video_pipeline_reference.py mostra come possiamo aggiungere il parametro di riferimento allo script di generazione del video.
Ecco un esempio generato da una foto usando la funzione di ridimensionamento automatico appena implementata:
Usare riferimenti video
Lo script che abbiamo costruito è pronto a gestire riferimenti sia video che immagine. Tuttavia, ogni volta che ho provato a generare un video fornendo un altro video come riferimento, ho ottenuto un errore:
Video inpaint is not available for your organization
Secondo il loro forum, sembra che sia un problema comune, il che lascia intendere che questa funzione non sia ancora disponibile via API per tutti. Dovremo aspettare ancora un po' per poterla usare.
Altre limitazioni
Mentre lavoravo con Sora 2, mi sono spesso imbattuto in casi in cui Sora rifiutava di generare il video, affermando che la richiesta era stata bloccata dal sistema di moderazione:
RuntimeError: Video generation failed: Your request was blocked by our moderation system.
Capisco che questi sistemi richiedano una moderazione rigorosa, perché si possono fare molti danni se agli utenti è permesso generare qualsiasi tipo di video. Tuttavia, ritengo che l'algoritmo di moderazione debba essere perfezionato, perché ha bloccato la maggior parte delle mie richieste, costringendomi ad abbandonare l'idea originale.
Le foto che ho provato a trasformare in video non avevano contenuti sensibili o problemi di copyright, dato che le immagini sono tutte mie. Inoltre, l'errore non fornisce alcuna informazione sul motivo del blocco.
Questo problema si è presentato molto spesso, rendendo impossibile creare qualcosa di significativo.
Conclusione
Sora 2 apre nuove possibilità entusiasmanti per la generazione di video con l'IA e, grazie alla sua disponibilità tramite l'API di OpenAI, integrare questi strumenti all'avanguardia nel tuo workflow Python è ora alla portata di sviluppatori di ogni livello.
Seguendo questo tutorial, ora hai una solida base per creare video personalizzati con prompt semplici, perfezionare i risultati con parametri avanzati e sfruttare immagini di riferimento per una maggiore coerenza. Man mano che l'API evolve, saranno disponibili ancora più funzionalità — incluse robuste capacità video-to-video — ampliando la tua cassetta degli attrezzi creativa.
Che tu stia sperimentando con prompt giocosi, costruendo storyboard complessi o sviluppando app multimediali di nuova generazione, Sora 2 offre un modo potente per dare vita alle tue idee. Ti consiglio anche di leggere la nostra guida al nuovo modello SAM3 di Meta.
FAQ sull'API Sora 2
L'API di Sora 2 è gratuita?
No. A seconda del modello, ogni secondo di video costa tra 0,1 $ e 0,3 $.
È possibile generare un video a partire da un'immagine?
Sì, possiamo fornire un'immagine di riferimento usando il parametro input_reference. Tuttavia, l'immagine deve avere le stesse dimensioni del video.
È possibile modificare un video esistente tramite l'API?
Anche se Sora 2 può modificare i video, la funzione non è ancora disponibile per tutti.
Quanto tempo serve per generare un video con Sora 2?
Per esperienza, sembra richiedere al massimo 2 minuti.
Sora 2 può generare audio?
Sì. A meno che non sia specificato diversamente nel prompt, i video generati da Sora 2 includono un audio coerente con il contenuto. Possiamo anche indirizzare l'audio tramite il prompt e includere dialoghi.



