Chuyển đến nội dung chính

API Sora 2 Với Python: Hướng Dẫn Hoàn Chỉnh Kèm Ví Dụ

Tìm hiểu cách hiện thực hóa ý tưởng video của bạn bằng API Sora 2 với hướng dẫn đầy đủ về cách dùng Python để tương tác với OpenAI API.
Đã cập nhật 5 thg 10, 2026  · 8 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Sora 2 đã ra mắt vào cuối tháng 9 với lời hứa sẽ sớm khả dụng thông qua OpenAI API. Khoảnh khắc đó cuối cùng cũng đã đến, và tôi sẽ hướng dẫn bạn cách sử dụng cũng như tận dụng tối đa công cụ này.

Trong hướng dẫn này, tôi sẽ đưa bạn đi qua cách dùng Python để tạo video bằng AI. Nếu bạn muốn đọc thêm về Sora 2 và cách dùng trực tiếp trên OpenAI, tôi khuyên bạn xem bài viết Sora 2 này. Để tham khảo các công cụ cạnh tranh, hãy xem hướng dẫn Seedance 2.0 và tutorial Veo 3.1 của chúng tôi.

Đây là ví dụ về kiểu video bạn có thể tạo được khi kết thúc hướng dẫn này:

Bắt đầu với OpenAI API

Để bắt đầu, chúng ta cần tạo tài khoản OpenAI và khóa API. Để làm vậy, hãy truy cập trang khóa API của họ và nhấp vào "Create new secret key" ở góc trên bên phải.

Khóa này được dùng để gửi yêu cầu đến OpenAI API. Chúng ta lưu khóa trong tệp tên .env trong thư mục nơi viết các script Python. Hãy đảm bảo giữ bí mật khóa vì bất kỳ ai cũng có thể dùng nó để tương tác với API bằng tài khoản của bạn.

Dán khóa API vào tệp .env theo định dạng sau:

OPENAI_API_KEY=<paste_api_key_here>

Lưu ý rằng dùng API không miễn phí, vì vậy bạn cần nạp tiền vào tài khoản trước khi có thể tạo video bằng Sora 2. Tham khảo, đây là giá theo giây của Sora 2:

Bảng giá Sora 2.

Tạo video Sora 2 bằng Python

Toàn bộ mã trong hướng dẫn này có thể được tìm thấy trong kho GitHub này.

Để giao tiếp với OpenAI API bằng Python, chúng ta sẽ dùng gói openai. Lưu ý rằng vì Sora còn mới trên API, chúng ta cần phiên bản gói gần đây.

Có thể dùng lệnh này để cài đặt (hoặc nâng cấp phiên bản hiện có nếu đã cài):

pip install --upgrade openai

Tạo một script mới tên generate_video.py trong cùng thư mục với tệp .env chúng ta đã tạo trước đó.

Bước đầu tiên là import các gói cần thiết. Chúng ta sẽ dùng:

  • os: Gói tích hợp để tương tác với hệ điều hành;
  • openai: Gói chính thức của OpenAI để tương tác với API của họ;
  • dotenv: Gói tích hợp hỗ trợ tải biến môi trường từ tệp .env. Ở đây, chúng ta dùng để tải khóa API OpenAI.
import os
from openai import OpenAI 
from dotenv import load_dotenv

Tiếp theo, tải tệp .env:

load_dotenv()
API_KEY = os.getenv("OPENAI_API_KEY")

Với khóa API đã được nạp vào bộ nhớ, chúng ta có thể khởi tạo client OpenAI, cho phép gửi yêu cầu đến OpenAI API. Chúng ta dùng thư viện os để tải khóa API:

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

Cuối cùng, dùng hàm videos.create từ client để tạo video:

video = client.videos.create(
    prompt="A cat and a dog dancing",
)
print(video.id)

Khi yêu cầu tạo video, chúng ta không nhận được video ngay vì quá trình tạo mất khá nhiều thời gian. Điều này có nghĩa biến video không phải bản thân video mà là một đối tượng chứa thông tin về job tạo video.

Đó là lý do chúng ta in ra định danh video. Đây là thông tin cần để:

  1. Theo dõi tiến độ tạo video.
  2. Tải video về.

Chúng ta sẽ giải thích chi tiết cả hai bước này bên dưới.

Đây là kết quả tôi nhận được:

Theo dõi tiến độ video

Chúng ta có thể lấy trạng thái của một job bằng cách cung cấp định danh job cho hàm videos.retrieve(), như sau:

job = client.videos.retrieve(job_id)
status = job.status
progress = job.progress
print(f"Status: {status}, {progress}%")

Chúng ta cần đợi tiến độ đạt 100% để có thể tải video. Để tiện hơn, chúng ta xây dựng một hàm, wait_for_video_to_finish(), dùng để theo dõi trạng thái của job cho đến khi hoàn tất:

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")

Hàm có ba tham số:

  • video_id: Định danh video chúng ta muốn theo dõi.
  • poll_interval: Số giây chờ giữa mỗi lần truy vấn tiến độ.
  • timeout: Số giây tối đa để chờ.

Hàm này sẽ kiểm tra định kỳ trạng thái video cho đến khi hoàn tất hoặc hết thời gian chờ.

Tải video

Giờ khi đã có thể theo dõi quá trình tạo video, điều duy nhất còn lại là cách tải video khi quá trình hoàn tất. Chúng ta có thể làm điều này bằng hàm videos.download_content().

Dưới đây là một hàm thực hiện việc này:

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)

Quy trình đầy đủ để tạo video Sora

Chúng ta có thể ghép các bước này lại để xây dựng một quy trình tạo video với 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)

Thiết lập kích thước và thời lượng video

Script trên chỉ dùng một prompt văn bản để tạo video. Tuy nhiên, OpenAI Sora 2 API cung cấp các tùy chọn khác như:

  • model: Mô hình dùng để tạo video. Mặc định là sora-2.
  • resolution: Kích thước video. Mặc định là 720x1280.
  • duration: Thời lượng (giây) của video. Mặc định là 4 giây.

Dưới đây là bảng với tất cả giá trị khả dụng tùy theo chế độ (giá trị in đậm là mặc định):

Bảng mô tả các tham số cho Sora 2 API

Để script dễ dùng hơn, ta có thể dùng gói tích hợp argparse để cho phép người dùng chỉ định giá trị cho từng tham số.

Ví dụ cách thiết lập đối số prompt và model với 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).",
)

Để nạp các đối số, gọi phương thức parse_args() như sau:

args = parser.parse_args()
prompt = args.prompt
model = args.model

Script generate_video_pipeline.py trong kho GitHub ghép những phần chúng ta đã học thành một script có thể tạo video bằng Sora 2.

Ví dụ cách chạy trên terminal với các tham số cụ thể:

python generate_video_pipeline.py --prompt "A family of dogs driving a car" --model sora-2-pro  --size 1280x720 --seconds 8

Đây là kết quả:

Mẹo viết prompt cho Sora 2 API

OpenAI cung cấp hướng dẫn prompt đầy đủ cho Sora 2.

Những ý tưởng cốt lõi để xây dựng prompt tốt cho Sora 2 gồm:

  • Cân bằng chi tiết và tự do: Prompt cụ thể cho phép kiểm soát; prompt đơn giản khuyến khích sáng tạo.
  • Thiết lập tham số trong API: Xác định rõ model (sora-2 hoặc sora-2-pro), độ phân giải và độ dài clip.
  • Nghĩ theo từng cảnh quay: Mô tả khung hình, góc máy, ánh sáng, chủ thể và một hành động rõ ràng cho mỗi cảnh.
  • Hình ảnh hóa và cụ thể: “Nhựa đường ướt dưới ánh đèn neon” hiệu quả hơn “một con phố đẹp.”
  • Giữ chuyển động đơn giản: Một hành động của chủ thể + một chuyển động máy quay là tốt nhất.
  • Ánh sáng: Xác định chất lượng, hướng và bảng màu ánh sáng để đảm bảo nhất quán.
  • Dùng ảnh tham chiếu: Thêm đầu vào trực quan để cố định phong cách và bố cục.
  • Đối thoại: Câu ngắn, tự nhiên; gắn nhãn rõ; giới hạn số câu mỗi clip.
  • Lặp với Remix: Điều chỉnh một yếu tố (ánh sáng, ống kính, bảng màu) mỗi lần để kiểm soát chính xác.

Họ tổng hợp các ý tưởng này thành mẫu prompt sau:

[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.]

Nhập prompt dài trong terminal khá bất tiện. Để cải thiện trải nghiệm, ta có thể sửa script để nếu prompt kết thúc bằng .txt, script sẽ hiểu người dùng đang cung cấp đường dẫn đến tệp văn bản chứa prompt. 

Cách cập nhật script để hỗ trợ điều này:

...
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)
...

Để thử nghiệm, tôi tạo một tệp cùng thư mục tên prompt.txt với prompt sau:

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.”

Để tạo video, chúng ta truyền prompt.txt vào tham số --prompt:

python generate_video_pipeline.py --prompt prompt.txt --model sora-2-pro  --size 1280x720 --seconds 8

Đây là video:

Ta thấy rằng nó không hoàn toàn theo sát prompt. Theo kinh nghiệm của tôi khi làm việc với các mô hình video AI, tôi thường đạt kết quả tốt hơn bằng cách tạo nhiều video đơn giản rồi ghép lại với nhau. 

Tuy nhiên, để làm điều đó, chúng ta cần đảm bảo tính nhất quán. Có thể đạt được điều này bằng cách cung cấp ảnh tham chiếu cho mô hình. Đó là nội dung chúng ta sẽ học tiếp theo.

Tạo video Sora 2 dựa trên hình ảnh

Để tạo video dựa trên hình ảnh, chúng ta dùng tham số input_reference.

Đây là đoạn mã minh họa cách nạp một hình ảnh và cung cấp cho mô hình như một tham chiếu:

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)

Tập lệnh generate_video_with_reference.py trong kho GitHub cung cấp một ví dụ hoạt động đầy đủ. Khi chạy với ảnh tham chiếu, chúng tôi nhận được kết quả sau:

Để ảnh tham chiếu hoạt động, ảnh cần có cùng kích thước với kích thước đã yêu cầu khi tạo video.

Chúng ta có thể dùng gói Pillow để tự động thay đổi kích thước ảnh tham chiếu trước khi cung cấp cho mô hình. Tuy nhiên, lưu ý rằng nếu tỉ lệ khung của ảnh gốc khác biệt quá nhiều, ảnh sẽ bị méo và video có thể không tốt.

Để cài đặt, dùng lệnh:

pip install Pillow

Script sora.py cung cấp triển khai cho hàm generate_video() để điều chỉnh mã trước đó nhằm thay đổi kích thước ảnh nếu có cung cấp ảnh.

Script generate_video_pipeline_reference.py minh họa cách chúng ta thêm tham số tham chiếu vào script tạo video.

Đây là ví dụ được tạo từ một bức ảnh bằng tính năng tự động đổi kích thước vừa triển khai:

Dùng tham chiếu video

Script chúng ta xây dựng sẵn sàng xử lý cả tham chiếu video lẫn hình ảnh. Tuy vậy, mỗi khi tôi thử tạo video đồng thời cung cấp một video khác làm tham chiếu, tôi gặp lỗi:

Video inpaint is not available for your organization

Theo diễn đàn của họ, có vẻ đây là vấn đề phổ biến, điều này cho thấy tính năng này chưa khả dụng với tất cả mọi người trên API. Chúng ta sẽ phải đợi thêm một thời gian nữa để có thể sử dụng.

Các hạn chế khác

Khi làm việc với Sora 2, tôi thường xuyên gặp trường hợp Sora từ chối tạo video, nêu rằng hệ thống kiểm duyệt đã chặn yêu cầu:

RuntimeError: Video generation failed: Your request was blocked by our moderation system.

Tôi hiểu rằng các hệ thống này cần được kiểm duyệt nghiêm ngặt vì có thể gây hại nếu người dùng được phép tạo bất kỳ video nào họ muốn. Tuy nhiên, tôi cảm thấy thuật toán kiểm duyệt cần được tinh chỉnh vì nó đã chặn hầu hết yêu cầu của tôi, khiến tôi phải bỏ ý tưởng ban đầu.

Những bức ảnh tôi cố gắng chuyển thành video không có nội dung nhạy cảm hay vấn đề bản quyền, vì tất cả đều thuộc sở hữu của tôi. Lỗi cũng không cung cấp thông tin vì sao bị chặn.

Vấn đề này xảy ra khá thường xuyên, khiến tôi không thể tạo ra điều gì có ý nghĩa.

Kết luận

Sora 2 mở ra những khả năng mới đầy hứng khởi cho tạo video bằng AI, và nhờ đã khả dụng qua OpenAI API, việc tích hợp các công cụ tiên tiến này vào quy trình Python của bạn giờ đây đã dễ tiếp cận với các nhà phát triển ở mọi nền tảng.

Bằng cách làm theo hướng dẫn này, bạn đã có nền tảng vững chắc để tạo video tùy chỉnh qua các prompt đơn giản, tinh chỉnh kết quả bằng các tham số nâng cao và tận dụng ảnh tham chiếu để tăng tính nhất quán. Khi API tiếp tục phát triển, sẽ có thêm nhiều tính năng — bao gồm khả năng video-to-video mạnh mẽ — mở rộng bộ công cụ sáng tạo của bạn.

Dù bạn đang thử nghiệm các prompt vui nhộn, xây dựng storyboard phức tạp, hay phát triển ứng dụng đa phương tiện thế hệ mới, Sora 2 mang đến cách mạnh mẽ để hiện thực hóa ý tưởng. Tôi cũng khuyên bạn xem hướng dẫn về mô hình SAM3 mới của Meta.

Câu hỏi thường gặp về Sora 2 API

Sora 2 API có miễn phí không?

Không. Tùy theo mô hình, mỗi giây video có giá từ $0,1 đến $0,3.

Có thể tạo video dựa trên một hình ảnh không?

Có, chúng ta có thể cung cấp ảnh tham chiếu bằng tham số input_reference. Tuy nhiên, ảnh phải có cùng kích thước với video.

Có thể chỉnh sửa một video hiện có bằng API không?

Mặc dù Sora 2 có thể chỉnh sửa video, tính năng này hiện chưa khả dụng cho tất cả mọi người.

Mất bao lâu để tạo một video với Sora 2?

Theo trải nghiệm của chúng tôi, tối đa khoảng 2 phút.

Sora 2 có thể tạo âm thanh không?

Có. Trừ khi được chỉ định khác đi trong prompt, các video do Sora 2 tạo sẽ kèm âm thanh phù hợp với nội dung. Chúng ta cũng có thể điều hướng âm thanh bằng prompt và thậm chí thêm đối thoại.


François Aubry's photo
Author
François Aubry
LinkedIn
Kỹ sư full-stack & nhà sáng lập tại CheapGPT. Giảng dạy luôn là niềm đam mê của tôi. Từ những ngày còn là sinh viên, tôi đã háo hức tìm kiếm cơ hội kèm cặp và hỗ trợ các bạn học khác. Niềm đam mê đó đã thôi thúc tôi theo học tiến sĩ, nơi tôi cũng đảm nhiệm vai trò trợ giảng để hỗ trợ con đường học thuật của mình. Trong những năm ấy, tôi tìm thấy sự mãn nguyện lớn lao trong môi trường lớp học truyền thống, xây dựng kết nối và thúc đẩy việc học tập. Tuy nhiên, với sự ra đời của các nền tảng học trực tuyến, tôi nhận ra tiềm năng thay đổi của giáo dục số. Thực tế, tôi đã trực tiếp tham gia phát triển một nền tảng như vậy tại trường đại học của chúng tôi. Tôi tận tâm kết hợp các nguyên tắc giảng dạy truyền thống với những phương pháp số đổi mới. Đam mê của tôi là tạo ra các khóa học không chỉ hấp dẫn và giàu thông tin mà còn dễ tiếp cận với người học trong thời đại số này.
Chủ đề
OpenAI
Trí tuệ Nhân tạo
Mô hình Ngôn ngữ Lớn
AI sinh sinh

Các khóa học hàng đầu trên DataCamp

Khóa học

Làm việc với OpenAI API

3 giờ
184.5K
Bắt đầu hành trình phát triển ứng dụng tích hợp AI với OpenAI API. Tìm hiểu về chức năng làm nền tảng cho các ứng dụng AI phổ biến như ChatGPT.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm