ChatGPT tạo được GIF, kể cả bảng sáu khung hình

ChatGPT tạo được GIF, kể cả bảng sáu khung hình

Ngày 4/11, OpenAI giới thiệu ChatGPT Images 2.6, và tính năng mới được chú ý nhất là GIF: chỉ cần một câu lệnh hoặc một bức ảnh là tạo được ảnh động lặp vòng, sau đó còn chỉnh được tốc độ, sửa từng khung hình. Câu lệnh trong phần demo chính thức đơn giản đến mức tùy tiện: «can you make a gif of a cat dancing?».

Chúng tôi dùng Codex trên máy để làm thử một loạt ảnh động theo cách đó, và ngay bước đầu tiên đã không diễn ra như dự kiến.

Yêu cầu GIF thẳng, nhận về một ảnh PNG

OpenAI cho biết Images 2.6 đã mở cho mọi gói trên ChatGPT và Codex. Trong Codex, chúng tôi yêu cầu thẳng một GIF con thuyền giấy; sau khoảng 21 giây, kết quả nhận về là một ảnh PNG một khung kích thước 1536×1024.

Công cụ tạo ảnh tích hợp sẵn của Codex chỉ có bốn tham số đầu vào: câu lệnh, đường dẫn ảnh tham chiếu, số ảnh gần nhất đính kèm theo, và có dùng nền trong suốt hay không. Tên mô hình, định dạng đầu ra, số khung hình đều không nằm trong đó, và phản hồi cũng không hiển thị phiên bản mô hình.

Vì vậy cần nói rõ nguồn gốc của loạt ảnh này: tất cả đều được tạo trong Codex với yêu cầu rõ ràng là dùng năng lực của Images 2.6, nhưng chúng tôi không thể xác nhận chúng thực sự đến từ 2.6. Việc lần này không nhận được GIF gốc cũng không cho phép suy ra 2.6 không hỗ trợ, vì bản web của ChatGPT và API đi qua những cổng khác. Ngoài ra có báo cáo cho biết GIF vẫn đang được triển khai dần, nên tài khoản chưa thấy tính năng này cũng là bình thường.

Đổi hướng: vẽ trước một bảng sáu khung

Ví dụ chính thức của OpenAI thực ra đã gợi ý cách làm: vẽ chuyển động thành một sprite sheet, rồi nối lại thành ảnh động. Cách này không phụ thuộc cổng vào, nơi nào tạo được ảnh thì dùng được. Cấu trúc câu lệnh như sau:

Một sprite sheet 3 cột × 2 hàng, tổng cộng 6 khung hình, các khung bằng nhau,
thứ tự đọc từ trái sang phải, từ trên xuống dưới.
Nội dung: một chiếc thuyền giấy origami màu trắng nhẹ nhàng nhấp nhô trên mặt nước xanh nhạt, sóng nước thay đổi theo.
Góc máy, hình dạng thuyền và nền giữ nguyên ở mọi khung.
Khung 6 phải nối liền tự nhiên với khung 1.
Không thêm chữ, số hay logo.

Có ảnh rồi thì cắt ra, vài dòng Python là ghép được:

from PIL import Image

sheet = Image.open("boat-sheet.png").convert("RGB")
w, h = sheet.width // 3, sheet.height // 2
frames = [sheet.crop((x * w, y * h, (x + 1) * w, (y + 1) * h))
          for y in range(2) for x in range(3)]
frames[0].save("boat.gif", save_all=True, append_images=frames[1:],
               duration=140, loop=0)

Con thuyền giấy này được làm ra đúng như vậy: 6 khung, mỗi khung 140 mili giây, 512×512, dung lượng chưa tới 500KB.

Illustration: a paper boat bobs on pale blue water, a looping GIF assembled from a six-frame AI sheet

Quan sát sau khi làm bốn ảnh động

Hình dáng nhân vật ổn định hơn dự đoán. Chiếc khăn, cái bụng và đôi tai của chú cáo nhỏ nguyên bản này khớp nhau ở cả sáu khung; chỉ có vân đất sét và đường viền hơi rung nhẹ.

Illustration: a clay fox in a blue scarf waves, keeping a consistent look across six AI-generated frames

Nền càng vụn, càng dễ lộ. Vân mặt nước ở ảnh thuyền giấy mỗi khung lại khác một chút, làm chậm lại là thấy ngay. Muốn vòng lặp sạch, nên chọn nền màu đơn hoặc các mảng màu lớn.

Chuyển động theo quỹ đạo là khó nhất. Chiếc máy bay giấy bay vòng ở bản đầu có đường bay méo mó, phải vẽ lại một lần mới dùng được, và bản cuối vẫn còn lệch nhẹ ở các đoạn gấp khúc. Những động tác nhỏ tại chỗ như vẫy tay, nhấp nhô, gật đầu có tỷ lệ thành công cao hơn rõ rệt.

Sáu khung là đủ, đừng tham động tác. Một ảnh GIF chỉ nên diễn tả một việc. Cách làm chắc ăn là làm một ảnh trước, tạo vài phiên bản cho cùng một nhân vật, kiểm tra xem khuôn mặt, màu sắc và logo có bị biến dạng không, rồi mới quyết định có làm hàng loạt hay không.

Tham số của API rõ ràng hơn

Phía nhà phát triển có tham số chính thức: đặt output_format là gif, kèm frame_count và frame_duration_ms, mặc định 9 khung, mỗi khung 200 mili giây. Tài liệu về giới hạn số khung có chỗ lệch nhau: hướng dẫn ghi từ 2 đến 64, còn tài liệu tham chiếu API ghi từ 2 đến 16; để an toàn, hãy dùng trong phạm vi 16 khung.

Trước khi cho chuyển động, chốt ảnh tĩnh đã

Phần lớn công sức làm lại phát sinh trước khi có chuyển động. Nếu khuôn mặt, bảng màu, cách thắt khăn của nhân vật còn chưa chốt, chỉ cần một khung trong bảng sáu khung bị lệch là cả tấm phải vẽ lại.

Vì thế thứ tự đỡ tốn công hơn là tạo trước một ảnh tĩnh chuẩn ưng ý, chốt xong rồi mới cho nó chuyển động. Bước này không nhất thiết phải làm trong ChatGPT. Trang GPT Image 2.6 trên PixPix mở ra là một quy trình kiểu này: có thể bắt đầu từ câu lệnh hoặc ảnh tham chiếu, mỗi lần chỉ sửa một chỗ và đồng thời nêu rõ chi tiết nào cần giữ, mặc định chọn Sunburst thiên về độ chi tiết. Đoạn câu lệnh sprite sheet ở trên bản thân là yêu cầu cho một ảnh tĩnh, về lý thuyết cũng có thể đưa sang thử, còn việc cắt khung và ghép vẫn làm trên máy. Con đường này chúng tôi chưa thử thực tế, trang PixPix cũng không ghi tính năng GIF, nên chỉ xem là một ý tưởng.

Trước khi đăng còn vài điều cần lưu ý: một số nền tảng hỗ trợ tải GIF lên không tốt, có thể phải chuyển sang video; chữ và logo trong ảnh cần soát từng khung; nếu dùng ảnh của người khác để làm ảnh động, hãy xin phép họ trước.

Nguồn tham khảo: thông báo trên cộng đồng nhà phát triển OpenAI, CocoLoop, tài liệu tạo ảnh của OpenAI, The Decoder, AI×SNS Lab; thời gian xử lý và thông số file là số liệu đo thực tế của trang, phiên bản mô hình không thể xác nhận.