Kurs
Sora 2, Eylül ayının sonunda OpenAI API üzerinden yakında kullanılabilir olacağı vaadiyle yayımlandı. O an nihayet geldi ve ben de size onu nasıl kullanacağınızı ve en iyi şekilde nasıl yararlanacağınızı göstermek için buradayım.
Bu eğitimde, Python kullanarak yapay zekâ ile nasıl video üreteceğinizi adım adım göstereceğim. Sora 2 hakkında daha fazla okumak ve OpenAI’de doğrudan nasıl kullanıldığını öğrenmek isterseniz, şu Sora 2 makalesine göz atmanızı öneririm. Rakip araçlara bakmak için Seedance 2.0 rehberimize ve Veo 3.1 eğitimimize bakabilirsiniz.
İşte bu eğitimin sonunda yapabileceğiniz türden videolara bir örnek:
OpenAI API ile Başlarken
Başlamak için bir OpenAI hesabı ve bir API anahtarı oluşturmamız gerekiyor. Bunun için API anahtarı sayfalarına gidin ve sağ üst köşedeki "Create new secret key" butonuna tıklayın.
Bu anahtar, OpenAI API’sine istek göndermek için kullanılır. Python betiklerimizi yazdığımız klasörde .env adlı bir dosyada saklarız. Anahtarı gizli tuttuğunuzdan emin olun; çünkü hesabınızı kullanarak API ile etkileşime geçmek için herkes onu kullanabilir.
API anahtarını .env dosyasına şu formatta yapıştırın:
OPENAI_API_KEY=<paste_api_key_here>
API kullanımı ücretsiz değildir, bu yüzden hesabınıza bakiye eklemeniz gereklidir; ancak bundan sonra Sora 2 ile video üretebilirsiniz. Referans olması açısından, Sora 2’nin saniye başına fiyatlandırması şöyledir:
Python ile Sora 2 Videosu Üretme
Bu eğitimin tüm kodlarını bu GitHub deposunda bulabilirsiniz.
Python ile OpenAI API’siyle iletişim kurmak için openai paketini kullanacağız. Sora API’de yeni olduğundan, paketin güncel bir sürümüne ihtiyacımız var.
Kurmak (veya zaten kuruluysa yükseltmek) için şu komutu kullanabiliriz:
pip install --upgrade openai
Aynı klasörde, daha önce oluşturduğumuz .env dosyasının yanına generate_video.py adlı yeni bir betik oluşturun.
İlk adım gerekli paketleri içe aktarmak. Şunları kullanacağız:
os: İşletim sistemiyle etkileşim için yerleşik bir paket;openai: API’leriyle etkileşim için resmi OpenAI paketi;dotenv:.envdosyasından ortam değişkenlerini yüklemeyi kolaylaştıran bir paket. Bu örnekte OpenAI API anahtarını yüklemek için kullanıyoruz.
import os
from openai import OpenAI
from dotenv import load_dotenv
Sonraki adımda .env dosyasını yüklüyoruz:
load_dotenv()
API_KEY = os.getenv("OPENAI_API_KEY")
API anahtarı belleğe yüklendikten sonra, OpenAI API’sine istek göndermemizi sağlayan OpenAI istemcisini başlatabiliriz. API anahtarını yüklemek için os kütüphanesini kullanıyoruz:
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
Son olarak, istemcinin videos.create fonksiyonunu kullanarak bir video üretiyoruz:
video = client.videos.create(
prompt="A cat and a dog dancing",
)
print(video.id)
Video üretimi istediğimizde, üretim zaman aldığı için videoyu hemen alamayız. Bu nedenle video değişkeni videonun kendisi değil, video üretim işi hakkında bilgi içeren bir nesnedir.
Bu yüzden video tanımlayıcısını yazdırdık. Bu bilgi bize şunlar için gerekecek:
- Video üretiminin ilerlemesini izlemek.
- Videoyu indirmek.
Bu iki adımı aşağıda ayrıntılı olarak açıklayacağız.
Benim elde ettiğim sonuç şöyleydi:
Video ilerlemesini izleme
Bir işin durumunu, iş tanımlayıcısını videos.retrieve() fonksiyonuna vererek şu şekilde alabiliriz:
job = client.videos.retrieve(job_id)
status = job.status
progress = job.progress
print(f"Status: {status}, {progress}%")
Videoyu indirebilmek için ilerlemenin %100’e ulaşmasını beklememiz gerekir. Kolaylık sağlaması için, bir iş tamamlanana kadar durumunu izleyen wait_for_video_to_finish() adlı bir fonksiyon yazıyoruz:
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")
Fonksiyonun üç parametresi vardır:
video_id: İzlemek istediğimiz videonun tanımlayıcısı.poll_interval: Her takip isteği arasında beklediğimiz saniye sayısı.timeout: Beklenecek maksimum saniye sayısı.
Bu fonksiyon, video tamamlanana ya da yoklama süresi dolana kadar periyodik olarak durumunu kontrol eder.
Videoyu indirme
Artık video üretim sürecini takip edebildiğimize göre, tek ihtiyacımız olan şey, üretim bittiğinde videoyu indirebilmenin bir yolu. Bunu videos.download_content() fonksiyonuyla yapabiliriz.
Bunu yapan bir fonksiyon örneği:
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)
Tam Sora video üretim iş akışı
Bu adımları bir araya getirerek Sora ile bir video üretim iş akışı oluşturabiliriz:
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)
Video boyutu ve süresini ayarlama
Yukarıdaki betik, videoyu yalnızca bir metin istemiyle üretir. Ancak OpenAI Sora 2 API başka seçenekler de sunar, örneğin:
model: Videoyu üretmek için kullanılan model. Varsayılan olaraksora-2.resolution: Videonun boyutu. Varsayılan video boyutu720x1280.duration: Videonun kaç saniye olacağı. Varsayılan olarak video 4 saniyedir.
Mod’a bağlı olarak tüm olası değerlerin yer aldığı bir tablo aşağıdadır (kalın olan değerler varsayılanlardır):

Betik kullanımını kolaylaştırmak için, yerleşik argparse paketini kullanarak kullanıcının her bir parametrenin değerini belirtmesini sağlayabiliriz.
İşte argparse ile prompt ve model argümanlarını ayarlamaya bir örnek:
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).",
)
Argümanları yüklemek için parse_args() metodunu şu şekilde çağırırız:
args = parser.parse_args()
prompt = args.prompt
model = args.model
GitHub deposundaki generate_video_pipeline.py betiği, öğrendiklerimizin tüm parçalarını bir araya getirerek Sora 2 kullanarak video üretebilen bir betik oluşturur.
Bunu belirli parametrelerle terminalde çalıştırmaya bir örnek:
python generate_video_pipeline.py --prompt "A family of dogs driving a car" --model sora-2-pro --size 1280x720 --seconds 8
Sonuç şöyle oldu:
Sora 2 API İstem İpuçları
OpenAI, Sora 2 için eksiksiz bir istem rehberi sunuyor.
Başarılı bir Sora 2 istemi için temel fikirler şunlardır:
- Ayrıntı ve özgürlüğü dengeleyin: Spesifik istemler kontrol sağlar; basit olanlar yaratıcılığı teşvik eder.
- Parametreleri API’de ayarlayın: Modeli (sora-2 veya sora-2-pro), çözünürlüğü ve klip uzunluğunu açıkça tanımlayın.
- Kare planlayın: Kamera kadrajını, ışığı, özneyi ve her kare için tek bir net eylemi betimleyin.
- Görsel ve somut olun: “Neon ışıklar altında ıslak asfalt” ifadesi “güzel bir sokak”tan daha etkilidir.
- Hareketi basit tutun: Bir özne eylemi + bir kamera hareketi en iyi sonucu verir.
- Işık: Tutarlılık için ışık kalitesini, yönünü ve renk paletini tanımlayın.
- Görüntü referansları kullanın: Stil ve kompozisyonu sabitlemek için görsel bir girdi ekleyin.
- Diyalog: Kısa, doğal cümleler; net şekilde etiketlenmiş; klip başına sınırlı.
- Remix ile yineleyin: Hassas kontrol için her seferinde tek bir unsuru (ışık, lens, palet) ayarlayın.
Bu fikirleri şu istem şablonunda bir araya getirmişler:
[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.]
Uzun istemleri terminalde vermek zahmetlidir. Kullanıcı deneyimini iyileştirmek için, eğer istem .txt ile bitiyorsa, betiği kullanıcıya istemin bulunduğu bir metin dosyasının yolunu verdiği varsayımını yapacak şekilde değiştirebiliriz.
Betiği bunu destekleyecek şekilde şöyle güncelleyebiliriz:
...
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)
...
Bunu test etmek için, aynı klasörde prompt.txt adlı bir dosya oluşturdum ve içine şu istemi yazdım:
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.”
Videoyu üretmek için --prompt parametresinde prompt.txt belirtiyoruz:
python generate_video_pipeline.py --prompt prompt.txt --model sora-2-pro --size 1280x720 --seconds 8
İşte video:
İstemin tamamı takip edilmemiş görünüyor. Yapay zekâ video modelleriyle çalışma deneyimimde, birden fazla daha basit video üretip bunları birleştirerek daha iyi sonuçlar aldım.
Bunu yapmak için ise tutarlılık sağlamamız gerekir. Bunu modele bir referans görsel sağlayarak elde edebiliriz. Sırada bunu öğreniyoruz.
Görüntülere Dayalı Sora 2 Videoları Üretme
Bir görüntüye dayalı video üretmek için input_reference parametresini kullanırız.
Bir görseli nasıl yükleyip modele referans olarak vereceğimize dair bir kod parçası:
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)
GitHub deposundaki generate_video_with_reference.py betiği bunun tam çalışan bir örneğini sunar. Referans görsel üzerinde çalıştırıldığında şunu elde ettik:
Referans görselin işe yaraması için, video üretimi için istenen boyutla aynı boyutta olması gerekir.
Modele vermeden önce referans görseli otomatik olarak yeniden boyutlandırmak için Pillow paketini kullanabiliriz. Ancak, orijinal görüntünün en-boy oranı çok farklıysa, görüntü bozulur ve video muhtemelen iyi olmaz.
Kurmak için şu komutu kullanın:
pip install Pillow
sora.py betiği, bir görsel sağlanırsa resmi yeniden boyutlandıracak şekilde önceki kodumuzu uyarlayan generate_video() fonksiyonu için bir uygulama sağlar.
generate_video_pipeline_reference.py betiği, referans parametresini video üretim betiğine nasıl ekleyebileceğimizi gösterir.
Az önce uyguladığımız otomatik yeniden boyutlandırma özelliğini kullanarak bir fotoğraftan üretilmiş bir örnek:
Video referansları kullanma
Burada oluşturduğumuz betik, görsel referansların yanı sıra video referanslarını da işleyebilecek durumda. Ancak, bir video referansı sağlarken video üretmeye çalıştığım her seferinde şu hatayı aldım:
Video inpaint is not available for your organization
Forumlarına göre bunun yaygın bir sorun olduğu anlaşılıyor, bu da bu özelliğin henüz API’de herkese açık olmadığını gösteriyor. Kullanabilmek için biraz daha beklememiz gerekecek.
Diğer kısıtlamalar
Sora 2 ile çalışırken, moderasyon sisteminin isteği engellediğini söyleyerek Sora’nın video üretmeyi reddettiği durumlarla sıkça karşılaştım:
RuntimeError: Video generation failed: Your request was blocked by our moderation system.
Bu sistemlerin güçlü bir moderasyona ihtiyaç duyduğunu anlıyorum; zira kullanıcılara istedikleri her videoyu üretme izni verilirse çok fazla zarar verilebilir. Ancak, moderasyon algoritmasının rafine edilmesi gerektiğini düşünüyorum; çünkü isteklerimin çoğunu engelledi ve beni orijinal fikrimden vazgeçirdi.
Videoya dönüştürmeye çalıştığım fotoğraflarda hassas içerik veya telif hakkı sorunu yoktu; tüm görseller bana ait. Ayrıca hata, neden engellendiğine dair herhangi bir bilgi içermiyor.
Bu sorun o kadar sık yaşandı ki, anlamlı bir şey oluşturmayı imkânsız hale getirdi.
Sonuç
Sora 2, yapay zekâ destekli video üretimi için heyecan verici yeni olanaklar sunuyor ve OpenAI API üzerinden erişilebilirliği sayesinde bu ileri araçları Python iş akışınıza entegre etmek artık her geçmişten geliştirici için mümkün.
Bu eğitimi izleyerek, basit istemlerle özel videolar oluşturmak, gelişmiş parametrelerle sonuçları ince ayar yapmak ve daha fazla tutarlılık için görüntü referanslarından yararlanmak konusunda sağlam bir temel edindiniz. API gelişmeye devam ettikçe, güçlü video-dan-videoya yetenekler de dahil olmak üzere daha pek çok özellik kullanıma sunulacak ve yaratıcı araç setinizi genişletecek.
İster eğlenceli istemlerle denemeler yapın, ister karmaşık storyboard’lar oluşturun ya da yeni nesil çoklu ortam uygulamaları geliştirin; Sora 2 fikirlerinizi hayata geçirmenin güçlü bir yolunu sunuyor. Ayrıca Meta’nın yeni SAM3 modeli rehberimize de göz atmanızı öneririm.
Sora 2 API SSS
Sora 2 API ücretsiz mi?
Hayır. Modele bağlı olarak, video başına saniye maliyeti $0,1 ile $0,3 arasındadır.
Bir görsele dayalı video üretmek mümkün mü?
Evet, input_reference parametresiyle bir referans görsel sağlayabiliriz. Ancak görsel, videoyla aynı boyutta olmalıdır.
API ile mevcut bir videoyu düzenlemek mümkün mü?
Sora 2 videoları düzenleyebilse de, bu özellik henüz herkes için kullanıma açık değil.
Sora 2 ile bir video üretmek ne kadar sürer?
Deneyimlerimize göre, en fazla 2 dakika sürüyor gibi görünüyor.
Sora 2 ses üretebilir mi?
Evet. Aksi istemde belirtilmedikçe, Sora 2 tarafından üretilen videolar, video içeriğiyle uyumlu sesle birlikte gelir. Ayrıca istemle sesi yönlendirebilir ve diyaloglar da ekleyebiliriz.


