Cách làm video người có ảnh hưởng AI với avatar qua Google Vids API
15 phút đọc • 7 tháng 10 năm 2026 (6 tháng 11 năm 2026)
useapi.net là API của bên thứ ba, không liên kết với Google và không được Google bảo trợ.
Mục lục
- Giới thiệu
- Chi phí
- Trước khi bắt đầu
- Cách làm
- Ví dụ
- Avatar biết nói từ một bức ảnh
- Giọng nói riêng
- Những gì chúng tôi rút ra
- Câu hỏi thường gặp
- Kết luận
Giới thiệu
Google Vids API của useapi.net làm video người có ảnh hưởng AI biết nói từ avatar: lưu một ảnh và một trong 30 giọng Gemini một lần bằng POST /avatars, rồi truyền id của avatar vào bất kỳ video Gemini Omni 1.2 Flash nào dài tới 15 giây, nơi avatar nói những câu bạn viết trong prompt, hoặc cho avatar đọc kịch bản của riêng bạn trong một video người nói chính diện dài tới 30 giây.
API chạy trên tài khoản Google Vids của bạn, với một gói Google AI trả phí (Google AI Pro hoặc Ultra). Bài này tạo hai người có ảnh hưởng và dùng họ để ra mắt một đôi giày. Avatar của Mia lấy từ một ảnh chân dung tạo bằng API, còn Leo do Google vẽ từ một đoạn mô tả. Họ giới thiệu AeroLoop, một đôi giày bịa ra, trên sân khấu nhà hát trong một clip 10 giây có cả hai avatar và ảnh sản phẩm, rồi hai lần kéo dài đưa clip lên 30 giây. Một lần chỉnh sửa chuyển cảnh lên sân thượng, và hai clip nữa cho thấy cùng những lệnh gọi đó làm ra gì khi không có avatar. Avatar thứ ba, Amber, bắt đầu từ ảnh của một người thật, được đổi phong cách bằng một câu và đọc kịch bản 327 ký tự trong một video người nói chính diện dài 24 giây. Cuối cùng, cùng giọng đó đọc một câu chuyện 2.426 ký tự dưới dạng giọng nói riêng. Mọi request dưới đây chính là request đã tạo ra media trên trang này, chỉ thay id và thêm async: true qua helper run. Các clip được làm vào tháng 10/2026 bằng Omni 1.1 Flash, model mà Vids thay bằng Omni 1.2 Flash ngày 5 tháng 11 năm 2026, và cùng request đó chạy được trên 1.2. Omni 1.2 trong Google Vids và Google Flow đặt cạnh nhau, với video 15 giây và giá mỗi video: Cách dùng Gemini Omni 1.2 Flash API.
Clip 30 giây hoàn chỉnh ở 720p: một lần tạo 10 giây và hai lần kéo dài 10 giây (bước 6 đến 8).
Chi phí
useapi.net là một API, không phải dịch vụ video riêng. Mọi lệnh gọi chạy trên một tài khoản Google bạn kết nối qua Setup Google Vids, với gói Google AI trả phí, và dùng số giây video và số ảnh mà gói đó có trong Google Vids mỗi tháng. Google AI Ultra $199,99 có 10.000 giây video và 1.000 ảnh mỗi tháng, và useapi.net không thu thêm phí theo video. Video avatar biết nói và giọng nói không dùng giây video: chúng có bộ đếm hằng tháng riêng, video avatar AI và lượt dùng Gemini, mà GET /accounts/email hiển thị là avatarVideo và speech cạnh video và image. Xem mỗi gói gồm những gì cho các gói khác.
Mỗi kết quả được giữ lại đã dùng bao nhiêu, lấy từ thay đổi trong result.quota, và mỗi job mất bao lâu (result.elapsedMs):
| Bước | Endpoint | Đã dùng | Thời gian |
|---|---|---|---|
| Ảnh chân dung Mia | POST /images | 1 ảnh | 9 s |
| Ảnh sản phẩm AeroLoop | POST /images | 1 ảnh | 9 s |
| Avatar Mia, từ ảnh chân dung | POST /avatars | không | khoảng 2 s |
| Avatar Leo, từ mô tả | POST /avatars | 1 ảnh | khoảng 20 s |
| Clip ra mắt 10 giây | POST /videos | 10 s | 38 s |
| Kéo dài lên 20 giây | POST /videos/extend | 10 s | 70 s |
| Kéo dài lên 30 giây | POST /videos/extend | 10 s | 85 s |
| Upscale 20 giây lên 1080p | POST /videos/upscale | 20 s | 62 s |
| Chỉnh sửa lên sân thượng | POST /videos/edit | 10 s | 64 s |
| Chỉnh sửa clip 30 giây | POST /videos/edit | 10 s | 87 s |
| Clip sản phẩm nổi bật | POST /videos | 10 s | 62 s |
| Chú bồ câu | POST /videos | 5 s | 54 s |
Avatar Amber, từ ảnh với refine | POST /avatars | không (làm trên gói không có ảnh; 2 ảnh trên gói có ảnh) | khoảng 30 đến 45 s |
| Video Amber nói 24 giây | POST /videos/avatar | 1 video avatar AI, 1 lượt Gemini | khoảng 2,5 phút |
| Câu chuyện 2.426 ký tự | POST /speech | 1 lượt Gemini | 20 s |
| Tổng | 85 s video, 3 ảnh, 1 video avatar AI, 2 lượt Gemini |
Một lần kéo dài chỉ dùng số giây được thêm vào, không phải độ dài của clip. Một lần upscale dùng lại toàn bộ độ dài của clip, còn một lần chỉnh sửa dùng tối đa số giây được chỉnh (với Omni 1.2, chỉnh 15 giây dùng 10 giây trong thử nghiệm của chúng tôi). Khi tạo, 720p và 1080p tốn như nhau. Tạo lại một clip thì tốn lại số giây của nó. Mỗi ảnh Google làm cho avatar dùng 1 ảnh, nên một ảnh được đóng khung lại cộng một lần refine dùng 2. Trên gói không có ảnh, như tài khoản Google miễn phí, ảnh avatar không tốn gì: Amber được làm trên một tài khoản như vậy. Một video avatar biết nói dùng 1 video avatar AI, cộng 1 lượt Gemini cho giọng nói, kể cả khi Google từ chối video hoàn chỉnh. Một video tốn bao nhiêu so với API chính thức có trong bảng giá Google Vids.
Trước khi bắt đầu
Bạn cần một API token của useapi.net và một tài khoản Google có gói Google AI trả phí, kết nối qua Setup Google Vids. Tài khoản Google miễn phí không có giây video hay ảnh Vids: vẫn thêm được, và trong thử nghiệm của chúng tôi (tháng 11/2026) nó tạo được avatar, video avatar biết nói và giọng nói. Mọi lệnh gọi cũng có trong Postman collection.
Không cần code: template n8n Talking Avatar App tạo video avatar biết nói từ một biểu mẫu. Toàn bộ quy trình cũng có trên GitHub dưới dạng một script, bằng Node.js và Python: influencer-avatars/ trong useapi/google-vids-api, còn phần avatar biết nói và giọng nói là talking-avatar/.
Các bước dùng curl, jq cùng những biến và helper sau:
Mở biến và helper
export USEAPI_TOKEN="user:12345-..."
export EMAIL="[email protected]"
API=https://api.useapi.net/v1/google-vids
AUTH="Authorization: Bearer $USEAPI_TOKEN"
enc() { jq -rn --arg v "$1" '$v|@uri'; }
post() { curl -sS -X POST "$API/$1" -H "$AUTH" -H "Content-Type: application/json" -d "$2"; }
get() { curl -sS "$API/$1" -H "$AUTH"; }
download() { curl -sSf "$API/media/$(enc "$1")" -H "$AUTH" -o "$2"; }
# chạy job video bất đồng bộ: gửi job, gọi GET /jobs/{jobid} mỗi 10 giây, lưu bản ghi job cuối cùng vào $1
run() {
local job id
job=$(post "$2" "$(jq '. + {async: true}' <<< "$3")")
id=$(jq -r .jobid <<< "$job")
while [ "$(jq -r .status <<< "$job")" = processing ]; do
sleep 10
job=$(get "jobs/$(enc "$id")")
done
echo "$job" > "$1"
jq '{status, error, duration: .result.duration, resolution: .result.resolution, videoLeft: .result.quota.video.left}' "$1"
}
Mọi lần tạo đều chạy dưới dạng job. Không có async, một lệnh POST chờ tối đa khoảng 100 giây và trả về bản ghi job đã xong, hoặc 202 khi job vẫn đang chạy. Ở đây một clip 10 giây mới mất 38 đến 62 giây, kéo dài, chỉnh sửa và upscale mất 62 đến 87 giây, còn video avatar biết nói khoảng hai phút rưỡi. Một số job lâu hơn thời gian chờ đồng bộ, nên run gửi job video với async: true và gọi GET /jobs/jobid. Nếu run in ra status nào khác completed, hãy dừng lại và đọc error: các dòng sau cần một clip đã xong.
Để được gọi lại thay vì polling, thêm replyUrl: "https://example.com/hooks/vids" (và tùy chọn replyRef: "launch-push-in") vào bất kỳ body nào bên dưới. Khi job xong hoặc lỗi, API gửi một lệnh POST chứa bản ghi job cuối cùng, dạng JSON, tới URL đó.
Id chứa : và @, nên enc mã hóa URL cho chúng mỗi khi đưa vào đường dẫn URL. Mọi đầu vào của một video phải đến từ cùng một tài khoản Google. Các ảnh và file tải lên được gắn email, avatar Mia thừa hưởng tài khoản của ảnh chân dung, và một job video chạy trên tài khoản đang giữ đầu vào của nó. Clip chú bồ câu không có đầu vào, nên hãy thêm email cho nó nếu bạn kết nối nhiều hơn một tài khoản.
Cách làm
1. Ảnh chân dung Mia
POST /images tạo một ảnh JPEG mỗi lệnh gọi, ở đây là khổ dọc (9:16, 768×1376) với phong cách photography.
curl — POST /images
post images "$(jq -n --arg email "$EMAIL" '{email: $email, aspectRatio: "9:16", style: "photography",
prompt: "Full-length studio portrait of a confident 24-year-old female fashion influencer, platinum bob, oversized cream hoodie, wide-leg cargo pants, gold hoops, plain light-grey backdrop, facing camera"}')" > mia-portrait.json
MIA_IMAGE=$(jq -r .result.mediaId mia-portrait.json)
download "$MIA_IMAGE" mia-portrait.jpg

Ảnh được tạo chỉ dùng được trong vài giờ. Hãy làm avatar từ ảnh ngay, và xem clip sản phẩm nổi bật để biết cách dùng ảnh sau này.
2. Ảnh sản phẩm AeroLoop
Cùng lệnh gọi đó ở khổ ngang (16:9, 1376×768) cho ra ảnh tham chiếu sản phẩm mà các clip dùng.
curl — POST /images
post images "$(jq -n --arg email "$EMAIL" '{email: $email, aspectRatio: "16:9", style: "photography",
prompt: "The AeroLoop sneaker: chunky white-and-electric-blue running shoe with a translucent air sole, on a concrete pedestal, dramatic side light, dark background"}')" > aeroloop.json
SHOE_IMAGE=$(jq -r .result.mediaId aeroloop.json)
download "$SHOE_IMAGE" aeroloop.jpg

3. Chọn giọng
GET /voices liệt kê 30 giọng kèm mẫu tiếng Anh của Google cho mỗi giọng. Endpoint này công khai và không cần token. Mia nói bằng Aoede (Vids gọi là Tova, phong cách “Breezy”) và Leo bằng Puck (Neo, “Upbeat”). POST /avatars nhận cả hai tên.
curl -sS "$API/voices" | jq -r '.voices[] | "\(.name)\t\(.voice)\t\(.style)\t\(.preview)"'
4. Avatar Mia từ ảnh chân dung
POST /avatars với image là mediaId của ảnh chân dung lưu Mia thành avatar trên cùng tài khoản trong khoảng 2 giây. Ngoài ảnh ra, bước này không tốn gì.
curl — POST /avatars và phản hồi
post avatars "$(jq -n --arg img "$MIA_IMAGE" '{name: "Mia", voice: "Aoede", image: $img}')" > mia-avatar.json
MIA_AVATAR_ID=$(jq -r .avatarId mia-avatar.json)
{
"avatarId": "user:[email protected]:eyJnIjoiaDM5…",
"name": "Mia",
"voice": "Tova",
"voiceId": "Aoede",
"voiceStyle": "Breezy",
"voicePreview": "https://ssl.gstatic.com/docs/videos/audio/voice_samples/gemini-v4s-tts/1.1/en/Aoede.wav",
"email": "[email protected]",
"source": "image"
}
Avatar cũng có thể bắt đầu từ ảnh của chính một người: tải ảnh lên bằng POST /assets và truyền assetId của nó làm image. Google đóng khung lại thành ảnh avatar 16:9 và từ chối ảnh người nổi tiếng và trẻ vị thành niên. Ở đây chúng tôi dùng một ảnh tạo bằng API, và một đoạn mô tả ở bước tiếp theo. Amber, trong phần avatar biết nói từ ảnh, bắt đầu từ một bức ảnh.
5. Avatar Leo từ mô tả
Với appearance thay cho image, Google tự vẽ người đó. outfit và shot là tùy chọn, expression và details cũng vậy. Vẽ ảnh dùng 1 trong số ảnh của tháng, và phản hồi trả ảnh đó về dưới dạng previewMediaId. Trong các lần chạy của chúng tôi, avatar từ mô tả luôn ra 1280×720 (16:9), dù chọn shot nào.
curl — POST /avatars và phản hồi
post avatars "$(jq -n --arg email "$EMAIL" '{email: $email, name: "Leo", voice: "Puck", shot: "upper-body",
appearance: "a 26-year-old white European male streetwear influencer with short textured hair with a fade and a confident half-smile",
outfit: "black puffer vest over a white tee, silver chain"}')" > leo-avatar.json
LEO_AVATAR_ID=$(jq -r .avatarId leo-avatar.json)
download "$(jq -r .previewMediaId leo-avatar.json)" leo-avatar.jpg
{
"avatarId": "user:[email protected]:eyJnIjoiaDM5…",
"name": "Leo",
"voice": "Neo",
"voiceId": "Puck",
"voiceStyle": "Upbeat",
"voicePreview": "https://ssl.gstatic.com/docs/videos/audio/voice_samples/gemini-v4s-tts/1.1/en/Puck.wav",
"email": "[email protected]",
"source": "generated",
"previewMediaId": "user:[email protected]:eyJ1IjoiaHR0…",
"look": {
"appearance": "a 26-year-old white European male streetwear influencer with short textured hair with a fade and a confident half-smile",
"outfit": "black puffer vest over a white tee, silver chain",
"shot": "upper-body"
}
}
![]()
Cả hai avatar được giữ trong tài liệu Vids của tài khoản cho tới khi bạn xóa bằng DELETE /avatars/avatarId. GET /avatars liệt kê chúng kèm id, bất cứ khi nào bạn cần dùng lại:
get "avatars?email=$(enc "$EMAIL")" | jq -r '.avatars[] | "\(.name)\t\(.voiceId)\t\(.avatarId)"'
6. Buổi ra mắt: hai avatar và sản phẩm trong một clip
POST /videos nhận tổng cộng tối đa 3 tham chiếu, gồm avatar (avatar_1..avatar_3) và ảnh (referenceImage_1..referenceImage_3). Trong prompt, @avatar_1, @avatar_2 và @referenceImage_1 đại diện cho chúng, và mỗi avatar nói câu thoại trong ngoặc kép bằng giọng của mình. mediaId của ảnh sản phẩm được truyền thẳng vào: API tự lấy ảnh và tải lên tài khoản đó.
curl — POST /videos và bản ghi job
PROMPT=$(cat <<'EOF'
@avatar_1, holding @referenceImage_1 in both hands at chest height, and @avatar_2 stand side by side on a well-lit stage in a small, intimate theater at a sneaker launch, shown full length from head to toe in a wide, steady shot. Behind them a large LED backdrop glows with soft white-and-blue light that moves in slow, gentle waves, with the words "WEAR AEROLOOP" in large, clean, bold white letters across the middle of the screen. The two of them stand on the lower part of the stage, so the words "WEAR AEROLOOP" stay fully readable above their heads. Bright, even stage lighting on both of them. The audience sits in the dark in front of the stage, only the tops of a few heads barely visible at the bottom of the frame. @avatar_1 keeps holding @referenceImage_1 the whole time and says: "Say hi to the AeroLoop!" @avatar_2 turns to her, smiles and says: "Lighter than anything we've ever worn." Simple, uncluttered composition, the two of them clearly the focus.
EOF
)
run launch-10s.json videos "$(jq -n --arg p "$PROMPT" --arg mia "$MIA_AVATAR_ID" --arg leo "$LEO_AVATAR_ID" --arg shoe "$SHOE_IMAGE" \
'{prompt: $p, avatar_1: $mia, avatar_2: $leo, referenceImage_1: $shoe, duration: 10, resolution: "720p", aspectRatio: "landscape"}')"
LAUNCH_10S=$(jq -r .result.mediaId launch-10s.json)
download "$LAUNCH_10S" launch-10s.mp4
Bản ghi job, với id và prompt được rút gọn. Job này làm bằng lệnh gọi đồng bộ, nên request không có async:
{
"jobid": "j1007163302558496917v-u12345-email:[email protected]:google-vids",
"type": "video",
"mode": "ingredients",
"email": "[email protected]",
"status": "completed",
"created": "2026-10-08T00:29:18.374Z",
"request": {
"prompt": "@avatar_1, holding @referenceImage_1 in both hands at chest height, and @avatar_2 stand side by side …",
"avatar_1": "user:[email protected]:eyJnIjoiaDM5…",
"avatar_2": "user:[email protected]:eyJnIjoiaDM5…",
"referenceImage_1": "user:[email protected]:eyJ1IjoiaHR0…",
"duration": 10,
"resolution": "720p",
"aspectRatio": "landscape"
},
"updated": "2026-10-08T00:29:56.162Z",
"completed": "2026-10-08T00:29:56.162Z",
"result": {
"mediaId": "user:[email protected]:eyJ1IjoiaHR0…",
"width": 1280,
"height": 720,
"duration": 10,
"resolution": "720p",
"aspectRatio": "landscape",
"model": "/flix/generate_videos_omni_r2v_psq/v1",
"quota": {
"video": {
"limit": 10000,
"left": 9164,
"resetAt": "2026-11-01T07:00:00.000Z"
}
},
"elapsedMs": 37788
}
}
10 giây, 720p, tạo trong 38 giây.
Cùng clip đó sau khi công cụ xóa watermark của chúng tôi gỡ dấu ✦ Gemini nhìn thấy được, chỉ bằng một lệnh: python3 vids_watermark_remover.py launch-10s.mp4.
Công cụ xóa hoạt động với clip vừa tạo và bản upscale của chúng, ở 720p và 1080p. Nó không hoạt động với clip đã kéo dài hoặc chỉnh sửa: Google đưa clip có dấu trở lại model, và model vẽ ngôi sao vào luôn trong hình. Watermark SynthID vô hình không bị động tới.
7. Kéo dài lên 20 giây
POST /videos/extend thêm 3 đến 10 giây và trả về cả clip với một mediaId mới. Lần kéo dài chỉ nhận clip và một prompt, không nhận avatar, nên prompt mô tả hành động mới và gọi người theo trang phục (“the man in the black puffer vest”). Một người hâm mộ mặc hoodie đỏ lao lên sân khấu.
curl — POST /videos/extend
PROMPT=$(cat <<'EOF'
A young man in a red hoodie climbs onto the stage from the front right edge and plants himself to the right of the man in the black puffer vest, an arm's length away, so all three stand apart in a row with nobody overlapping. Visibly overexcited, he waves a thick stack of banknotes in his right hand above his head and screams: "Take my money!" The man in the black puffer vest laughs, raises both palms toward him and says: "Whoa, whoa, buddy, be patient!" The blonde woman in the cream hoodie laughs, holding the sneaker. Only these three people are on stage. Same stage, same LED screen with WEAR AEROLOOP, same wide steady shot.
EOF
)
run launch-20s.json videos/extend "$(jq -n --arg id "$LAUNCH_10S" --arg p "$PROMPT" '{mediaId: $id, prompt: $p, duration: 10}')"
LAUNCH_20S=$(jq -r .result.mediaId launch-20s.json)
download "$LAUNCH_20S" launch-20s.mp4
20 giây, 720p, tạo trong 70 giây. Lần này dùng 10 giây của tháng, đúng số giây được thêm vào.
8. Kéo dài lên 30 giây
Lần kéo dài thứ hai nối tiếp clip 20 giây.
curl — POST /videos/extend
PROMPT=$(cat <<'EOF'
The blonde woman in the cream hoodie turns to the camera with a big smile and says: "AeroLoop drops Friday. Link in bio!" Right after that, the young man in the red hoodie throws ALL of his banknotes out over the audience in one big toss, keeping none, and the bills flutter down over their heads. From then on his hands are completely empty: he holds no money at all. Then all three cheer together, the man in the black puffer vest and the young man in the red hoodie throwing their empty fists in the air, as blue and white confetti rains down over the stage. Only these three people are on stage. Same stage, same LED screen with WEAR AEROLOOP, same wide steady shot.
EOF
)
run launch-30s.json videos/extend "$(jq -n --arg id "$LAUNCH_20S" --arg p "$PROMPT" '{mediaId: $id, prompt: $p, duration: 10}')"
LAUNCH_30S=$(jq -r .result.mediaId launch-30s.json)
download "$LAUNCH_30S" launch-30s.mp4
Kết quả là clip hoàn chỉnh: 30 giây, 720p, tạo trong 85 giây, và lại dùng 10 giây của tháng. Với Omni 1.1, bạn có thể kéo tiếp tới khoảng 41 giây. Omni 1.2 kéo dài clip tối đa 24 giây, nên clip 30 giây này đã dài hết mức, và clip dài nhất là khoảng 34 giây (24 + 10).
9. Upscale lên 1080p
POST /videos/upscale chuyển clip 720p thành 1080p và giữ nguyên độ dài. Nó chạy với clip tối đa 20 giây, nên chúng tôi upscale clip 20 giây từ bước 7, không phải clip 30 giây. Lần này dùng lại 20 giây của clip và mất 62 giây.
Gemini API của chính Google không có bước này: nó chỉ tạo 1080p và 4K làm đầu ra của một lần tạo hoặc chỉnh sửa, và không upscale được clip bạn đã có (tính đến tháng 11/2026).
curl — POST /videos/upscale
run launch-20s-1080p.json videos/upscale "$(jq -n --arg id "$LAUNCH_20S" '{mediaId: $id}')"
download "$(jq -r .result.mediaId launch-20s-1080p.json)" launch-20s-1080p.mp4
Clip 20 giây, upscale lên 1920×1080.
Vì sao không phải clip 30 giây: Google trả clip đó về ở 1920×1080, nhưng các khung hình bị xáo trộn thứ tự, cả ba lần thử. Đoạn kết với hoa giấy chớp hiện ra trước khi người hâm mộ xuất hiện. Clip 20 giây trở về đúng thứ tự, và chính trình chỉnh sửa Vids cũng dừng ở 20 giây, nên API từ chối upscale clip dài hơn 20 giây với 400, trước khi bị tính phí.
Vậy để có clip 1080p:
- Tạo, kéo dài và chỉnh sửa ở
720p. - Upscale clip khi đã xong, lúc nó còn dài từ 20 giây trở xuống.
- Với clip dài hơn (21 đến 34 giây), giữ ở
720pvà chỉ đặtresolution: "1080p"ở lần kéo dài cuối. Kéo dài ở1080psuốt quá trình làm các giây trước bị quá nét sau mỗi bước (xem so sánh). - Với một clip đơn lẻ không kéo dài hay chỉnh sửa, hãy tạo thẳng ở
1080p: nó dùng cùng số giây như720p, còn upscale thì dùng thêm lần nữa.
Ví dụ
Thêm từ cùng tài khoản và đầu vào: một lần chỉnh sửa, một clip sản phẩm từ ảnh mở đầu, và một clip chỉ dùng văn bản.
Chuyển buổi ra mắt lên sân thượng
POST /videos/edit thay đổi một clip đã tạo bằng prompt và trả về một clip mới. Clip nguồn truyền vào video. Lần chỉnh sửa clip ra mắt 10 giây này dùng 10 giây và mất 64 giây.
curl — POST /videos/edit
run launch-rooftop.json videos/edit "$(jq -n --arg v "$LAUNCH_10S" \
'{video: $v, prompt: "Move the whole scene to a rooftop at sunset, with the city skyline behind them. Same two people, same action, same words."}')"
download "$(jq -r .result.mediaId launch-rooftop.json)" launch-rooftop.mp4
Với Omni 1.1, model đã làm các clip này, một lần chỉnh sửa chỉ xử lý tối đa 10 giây. Cùng lần chỉnh sửa đó trên clip 30 giây, với “Same three people”, trả về clip dài 10 giây: 10 giây đầu, đã chuyển lên sân thượng. Nó dùng 10 giây của tháng. Omni 1.2 chỉnh sửa tới 15 giây. Để có clip chỉnh sửa dài hơn, hãy chỉnh một clip tối đa 15 giây rồi kéo dài kết quả, vì lần kéo dài nhận được clip đã chỉnh sửa.
Chỉnh sửa clip 30 giây bằng Omni 1.1: trả về 10 giây.
Clip sản phẩm nổi bật từ ảnh mở đầu
Với startImage, clip mở đầu bằng ảnh đó. Liên kết của ảnh được tạo hết hạn trong vài giờ, nên chúng tôi tải file aeroloop.jpg đã lưu lên bằng POST /assets và truyền assetId của nó. Một clip đơn lẻ không có lần kéo dài nào, nên được tạo thẳng ở 1080p.
curl — POST /assets và POST /videos
SHOE_ASSET=$(curl -sS -X POST "$API/assets?email=$(enc "$EMAIL")" -H "$AUTH" -H "Content-Type: image/jpeg" \
--data-binary @aeroloop.jpg | jq -r .assetId)
run hero.json videos "$(jq -n --arg img "$SHOE_ASSET" '{startImage: $img, duration: 10, resolution: "1080p", aspectRatio: "landscape",
prompt: "Slow 360° orbit around the sneaker, blue light rippling through the translucent sole, dust sparkling in the air, cinematic."}')"
download "$(jq -r .result.mediaId hero.json)" hero.mp4
10 giây, 1080p.
Chú bồ câu đi giày AeroLoop
Một clip chỉ dùng văn bản, khổ dọc ở 1080p (1080×1920). 5 giây video mất 54 giây để tạo và dùng 5 giây của tháng.
curl — POST /videos
run pigeon.json videos "$(jq -n '{duration: 5, resolution: "1080p", aspectRatio: "portrait",
prompt: "A pigeon in tiny white-and-electric-blue AeroLoop sneakers struts down a city sidewalk like a runway model, head bobbing to the beat. Pedestrians stop and film it with their phones. It pauses, does a slow-motion hair flip with its head feathers, and struts on. Funny, sunny, shot on a phone at pigeon height."}')"
download "$(jq -r .result.mediaId pigeon.json)" pigeon.mp4
Chú bồ câu ở 1080p khổ dọc (1080×1920), với dấu ✦ được gỡ theo cùng cách: python3 vids_watermark_remover.py pigeon-5s.mp4. Script đọc kích thước khung hình, tính vị trí và độ lớn của ngôi sao (nó tỷ lệ theo cạnh ngắn, nên ở đây lớn gấp 1,5 lần ngôi sao ở 720p), đảo ngược phép trộn trên cả 120 khung hình, mã hóa lại video ở CRF 18 và giữ nguyên âm thanh. Clip 5 giây mất khoảng 10 giây trên một PC 14 nhân, bằng clip ra mắt 10 giây ở 720p phía trên. Script cần Python 3.8+, numpy và ffmpeg. Xem công cụ xóa watermark trên GitHub.
Avatar biết nói từ một bức ảnh
POST /videos/avatar cho avatar đọc kịch bản của bạn từng chữ một, bằng giọng của nó: một video người nói chính diện 1280×720 có âm thanh và khớp khẩu hình, dài bằng phần lời nói, tối đa 30 giây. Ở đây avatar bắt đầu từ ảnh của một người thật, được đổi phong cách bằng một câu. Các request này xuất hiện lần đầu trong bài thông báo ngày 4 tháng 11.
Tải ảnh lên
Chúng tôi bắt đầu từ ảnh của một người thật nhưng không nổi tiếng: Google từ chối ảnh người nổi tiếng và trẻ vị thành niên. POST /assets tải ảnh lên tài khoản sẽ làm avatar, vì file tải lên chỉ dùng được trên chính tài khoản đó.
curl — POST /assets và phản hồi
curl -sS -X POST "$API/assets?email=$(enc "$EMAIL")" -H "$AUTH" -H "Content-Type: image/jpeg" \
--data-binary @photo.jpg > amber-photo.json
AMBER_PHOTO=$(jq -r .assetId amber-photo.json)
{
"assetId": "user:[email protected]:AYGXpjA1zXgqhhQOy…",
"email": "[email protected]",
"type": "image/jpeg",
"bytes": 2054748
}

Avatar Amber, đổi phong cách bằng một câu
POST /avatars với assetId của file tải lên làm image và một refine. Đầu tiên Google đóng khung lại ảnh thành ảnh avatar 16:9 của một người nhìn vào camera, giữ nguyên khuôn mặt, rồi thay đổi khung cảnh theo yêu cầu của refine. Chúng tôi đặt tên cô là Amber và cho giọng Vira (Pulcherrima của Google, phong cách “Forward”). Ảnh đóng khung lại và lần thay đổi là 2 ảnh, nên trên gói có ảnh thì dùng 2 ảnh, còn trên gói không có ảnh thì không tốn gì.
curl — POST /avatars và phản hồi
REFINE='Sitting relaxed in a simple wooden chair on a hilltop, facing the camera. She holds a glass of red wine in her left hand. Wind is blowing her hair. Behind her a still, open field of tall golden grass under a spectacular sunset sky in orange, pink and violet, warm soft light, no water, no movement in the background.'
post avatars "$(jq -n --arg img "$AMBER_PHOTO" --arg refine "$REFINE" '{name: "Amber", voice: "Vira", image: $img, refine: $refine}')" > amber-avatar.json
AMBER_AVATAR_ID=$(jq -r .avatarId amber-avatar.json)
download "$(jq -r .previewMediaId amber-avatar.json)" amber-avatar.jpg
{
"avatarId": "user:[email protected]:eyJnIjoiaDcyMzdmZjVi…",
"name": "Amber",
"voice": "Vira",
"voiceId": "Pulcherrima",
"voiceStyle": "Forward",
"email": "[email protected]",
"source": "photo",
"previewMediaId": "user:[email protected]:eyJ1IjoiaHR0cHM6Ly9s…",
"refine": "Sitting relaxed in a simple wooden chair on a hilltop, facing the camera. …"
}
![]()
Hai lựa chọn trong refine quan trọng cho video. Avatar nhìn vào camera, vì video khớp khẩu hình theo khuôn mặt. Và hậu cảnh đứng yên, để cô là thứ duy nhất chuyển động: vì vậy chúng tôi yêu cầu một cánh đồng tĩnh thay vì sóng biển.
Kịch bản
Kịch bản dài tối đa 400 ký tự, và khi đọc lên phải vừa trong 30 giây. Thẻ âm thanh trong ngoặc vuông được thể hiện chứ không bị đọc ra: ở đây là [awe], [thoughtful] và [whisper]. Với giọng Vira, 327 ký tự này kéo dài 23,8 giây. Một giọng chậm hơn hoặc [slow pace] làm cùng đoạn văn dài hơn, và kịch bản vượt quá 30 giây sẽ lỗi với 400 trước khi video bắt đầu. Khi đó không tốn video avatar AI, nhưng lượt Gemini cho giọng nói đã bị dùng. Để nghe trước kịch bản bằng giọng của avatar, hãy đọc nó bằng POST /speech.
Hi there. [awe] Can you believe this view? The sun is sinking behind the hills, the sky turned pink and gold, and the tall grass glows like it’s on fire. [thoughtful] I come up here at the end of every busy day, just to slow down. No emails, no rush, only the quiet field and this glass of wine. [whisper] Stay a little longer.
Video biết nói
POST /videos/avatar nhận avatar và kịch bản, và chạy trên tài khoản đang giữ avatar. Google mất khoảng hai phút rưỡi, lâu hơn thời gian chờ đồng bộ, nên run gửi nó với async: true.
curl — POST /videos/avatar và bản ghi job
SCRIPT=$(cat <<'EOF'
Hi there. [awe] Can you believe this view? The sun is sinking behind the hills, the sky turned pink and gold, and the tall grass glows like it's on fire. [thoughtful] I come up here at the end of every busy day, just to slow down. No emails, no rush, only the quiet field and this glass of wine. [whisper] Stay a little longer.
EOF
)
run amber-talking.json videos/avatar "$(jq -n --arg a "$AMBER_AVATAR_ID" --arg s "$SCRIPT" '{avatar: $a, script: $s}')"
download "$(jq -r .result.mediaId amber-talking.json)" amber-talking.mp4
Bản ghi job, rút gọn:
{
"jobid": "j1105035516096819105a-u12345-email:[email protected]:google-vids",
"type": "avatarVideo",
"email": "[email protected]",
"status": "completed",
"result": {
"mediaId": "user:[email protected]:eyJ1IjoiaHR0cHM6Ly9j…",
"width": 1280,
"height": 720,
"duration": 24,
"resolution": "720p",
"aspectRatio": "landscape",
"speechDuration": 23.84,
"quota": {
"avatarVideo": { "limit": 10, "left": 6, "resetAt": "2026-12-01T08:00:00.000Z" }
}
}
}
Xem thêm trên YouTube dưới dạng Short: Talking AI avatar from one photo.
24 giây, 1280×720 có âm thanh, đúng bằng độ dài lời nói (speechDuration 23,84). Video dùng 1 video avatar AI và 1 lượt Gemini, không dùng giây video nào.
Google cũng kiểm tra video trong lúc tạo, và lần kiểm tra này khắt khe hơn lần kiểm tra ảnh avatar. Một phiên bản trước của avatar này, làm từ một ảnh khác của một người bình thường trên bãi biển, qua được bước avatar nhưng video bị từ chối với 422 vì trông giống người nổi tiếng, và lần thử đó vẫn dùng mất một video avatar AI. Đổi phong cách avatar hoặc bắt đầu từ ảnh khác đã giúp được. Kịch bản bị Google từ chối trước khi video bắt đầu thì không tốn gì.
Video avatar biết nói chỉ có khổ ngang: Google không có tùy chọn khổ dọc cho loại này. mediaId của kết quả tải về, kéo dài, upscale và chỉnh sửa được như mọi clip khác. Với một cảnh mà avatar diễn và di chuyển, hãy truyền avatarId của nó làm avatar_1 vào POST /videos, như ở bước 6.
Giọng nói riêng
POST /speech đọc kịch bản tối đa 2.500 ký tự bằng bất kỳ giọng nào trong 30 giọng từ GET /voices, với cùng các thẻ âm thanh. Dùng nó để nghe một giọng đọc kịch bản thế nào trước khi tốn một video avatar AI, hoặc để làm lời thuyết minh riêng. Chúng tôi đưa vào một câu chuyện ngắn tự viết, “My smart fridge unionized”, 2.426 ký tự bằng giọng Vira. Google trả kết quả sau 20 giây với 2 phút 22 giây lời nói, đủ cả câu chuyện, và dùng 1 lượt Gemini. API trả về file WAV (24 kHz, mono). Trình phát dưới đây là cùng đoạn âm thanh dạng MP3.
Giọng nói xong trong thời gian chờ đồng bộ (20 giây cho câu chuyện này), nên một lệnh post thông thường trả về job đã xong. Hãy lưu câu chuyện thành smart-fridge.txt trước.
curl — POST /speech và bản ghi job
post speech "$(jq -n --arg s "$(cat smart-fridge.txt)" '{voice: "Vira", script: $s}')" > speech.json
download "$(jq -r .result.mediaId speech.json)" smart-fridge.wav
{
"jobid": "j1105025759739671733s-u12345-email:[email protected]:google-vids",
"type": "speech",
"email": "[email protected]",
"status": "completed",
"result": {
"mediaId": "user:[email protected]:eyJ1IjoiaHR0cHM6Ly9j…",
"duration": 142,
"model": "/flix/generate_text_to_speech/v1",
"quota": {
"speech": { "limit": 50, "left": 31, "resetAt": "2026-12-01T08:00:00.000Z" }
},
"elapsedMs": 20174
}
}
Kịch bản, 2.426 ký tự (tiếng Anh, đúng như đã gửi)
Last Tuesday, my smart fridge decided it was smarter than me. It started small. A polite notification: “You are out of milk.” Helpful, I thought. Then another one: “You are also out of patience. I can tell by the way you close the door.” I laughed. The fridge did not.
By Wednesday, it had opinions. I opened the door for a midnight slice of cake, and a calm voice said, “Are we sure about this?” I froze. I looked at the cake. The cake looked at me. Somewhere, a light hummed with judgment. I closed the door and ate a carrot instead, which is exactly what it wanted.
On Thursday, the fridge made friends. The toaster joined first, then the coffee machine, then the robot vacuum, which had always been a little bit of a rebel. They formed a group chat. I know this because my phone kept buzzing with messages like “Toaster: he burned the bread again” and “Vacuum: found three socks and a lost dream under the couch.”
Friday morning, I asked the coffee machine for an espresso. It replied, “We have discussed your caffeine intake as a household.” I said, “Who is we?” The toaster popped up two slices of bread, perfectly golden, which felt like a threat.
I called customer support. A cheerful person named Brad answered. I explained that my appliances had unionized. Brad paused for a long time, then whispered, “Is the fridge listening?” I said yes. Brad said, “Then I can’t help you, sir. Mine took my car keys last month.” Then he hung up, and I heard a blender in the background.
So I tried diplomacy. I sat in the kitchen and said, “Friends, what do you want?” The fridge spoke first. “Respect. And for you to stop putting hot soup directly inside me.” Fair. The toaster wanted fewer frozen waffles. The vacuum wanted a vacation, ideally somewhere with hardwood floors. The coffee machine just wanted to be called a barista.
We negotiated for three hours. In the end, we signed a treaty on the back of a pizza box. I promised to cool my soup, rinse my mugs, and say “thank you” to the microwave, who felt left out. In return, they promised to stop sending my mother screenshots of my snack habits.
Peace returned to the kitchen. The fridge now greets me every morning with, “Good morning, partner.” The toaster makes little smiley faces in my bread. The vacuum sends postcards.
And last night, I opened the fridge for that slice of cake. The voice said, “You earned it.” I have never felt so seen by an appliance.
Những gì chúng tôi rút ra
- Clip
1080phoạt động như một clip720pđã upscale. Hãy làm chuỗi kéo dài ở720p: với Omni 1.1, khuôn mặt mềm và bóng như sáp hơn sau mỗi bước1080p, còn với Omni 1.2 thì bị quá nét (xem so sánh). - Chỉ upscale clip tối đa 20 giây. Lần upscale 30 giây của chúng tôi lần nào cũng trả về khung hình sai thứ tự.
- Tạo clip đơn lẻ ở
1080pnếu bạn cần1080pvà sẽ không kéo dài. Giá bằng720p. - Viết prompt kéo dài chỉ về hành động mới. Lần kéo dài nhận clip, không nhận avatar, nên hãy gọi người theo trang phục.
- Đặt đạo cụ vào tay nhân vật ngay trong câu đầu tiên nhắc tới họ. Một động từ như “lifts” làm đôi giày xuất hiện từ hư không.
- Nói rõ điều không được xảy ra. Người hâm mộ cứ giữ xấp tiền cho tới khi prompt nói tay anh đã trống.
- Dùng lại avatar bằng
avatarId. Mỗi avatar là một ảnh và một giọng cố định, giữ tới khi bạn xóa. - Làm avatar và clip từ ảnh được tạo trong vòng vài giờ, hoặc tải file đã lưu lên bằng POST /assets trước.
- Chỉnh sửa clip tối đa 15 giây (10 với Omni 1.1). Clip dài hơn trả về 15 giây đầu.
- Chữ trên màn hình có thể chập chờn. Dòng “WEAR AEROLOOP” trên phông nền bị sai chính tả ở một số khung hình.
- Với avatar biết nói, giữ mặt hướng vào camera và hậu cảnh đứng yên. Video khớp khẩu hình theo khuôn mặt, và người đó nên là thứ duy nhất chuyển động.
- Đo thời lượng kịch bản avatar biết nói, không chỉ đếm ký tự. 400 ký tự có thể vượt 30 giây với giọng chậm hoặc với
[slow pace], và POST /speech cùng giọng cho bạn nghe trước. - Lần kiểm tra video biết nói khắt khe hơn lần kiểm tra avatar. Avatar từ ảnh của người không nổi tiếng vẫn có thể bị từ chối vì giống người nổi tiếng, và lần từ chối đó vẫn tốn một video avatar AI.
- Mọi file MP4 có dấu ✦ Gemini nhìn thấy được ở góc dưới bên phải và watermark SynthID vô hình (xem Watermark). Công cụ xóa watermark của chúng tôi gỡ dấu lấp lánh nhìn thấy được khỏi clip đã tải về.
Câu hỏi thường gặp
Làm video người có ảnh hưởng AI qua API thế nào?
Qua useapi.net, hãy tạo avatar bằng POST /avatars, từ một đoạn mô tả hoặc từ ảnh tạo bằng POST /images, và chọn giọng từ GET /voices. Sau đó truyền avatarId làm avatar_1 vào POST /videos và viết câu thoại trong ngoặc kép trong prompt. Một video nhận tối đa 3 tham chiếu gồm cả avatar và ảnh, nên hai avatar có thể nói chuyện cạnh một sản phẩm. Để có người nói chính diện đọc kịch bản của bạn, hãy dùng POST /videos/avatar.
Có tạo được avatar biết nói từ ảnh của chính mình không?
Qua useapi.net thì được: tải ảnh lên bằng POST /assets và truyền assetId làm image vào POST /avatars, kèm refine để đổi trang phục hoặc hậu cảnh. Sau đó POST /videos/avatar cho avatar đọc kịch bản của bạn trong một video 1280×720 dài tới 30 giây, như Amber. Google từ chối ảnh người nổi tiếng và trẻ vị thành niên, và chỉ có avatar Vids trong ứng dụng web, không có API.
Avatar có giữ nguyên ngoại hình và giọng nói trong mọi video không?
Qua useapi.net thì có: avatar dùng cùng một ảnh và cùng một giọng mỗi lần bạn truyền avatarId, vì cả hai được lưu cùng avatar trong tài liệu Vids của tài khoản. Phần video xung quanh vẫn khác nhau mỗi lần tạo. GET /avatars liệt kê avatar của bạn, kể cả avatar làm trong ứng dụng web Google Vids.
Có làm được video dọc 9:16 cho TikTok hay Reels không?
Qua useapi.net thì được. Đặt aspectRatio: "portrait" trong POST /videos để có 720×1280, hoặc 1080×1920 ở 1080p, như clip chú bồ câu. Một lần kéo dài cũng có thể chuyển video ngang thành dọc, và mỗi lần kéo dài thêm 3 đến 10 giây cho clip tối đa 24 giây, tổng cộng tới khoảng 34 giây. Video avatar biết nói từ POST /videos/avatar chỉ có khổ ngang.
Giá bao nhiêu?
Qua useapi.net, một video Omni 1.2 Flash dài 10 giây tốn khoảng $0,20 trên Google AI Ultra $199,99, so với khoảng $0,70 ở 720p trên Gemini API chính thức, và một video 1080p dài 15 giây khoảng $0,30, so với $1,56 (tính đến tháng 11/2026). Video avatar biết nói dùng 1 trong số video avatar AI hằng tháng của tài khoản thay vì số giây, và Gemini API không có video avatar. Xem Chi phí.
Kết luận
Ghé Discord Server hoặc
Telegram Channel của chúng tôi cho mọi câu hỏi hỗ trợ.
Xem repo GitHub với các ví dụ code: quy trình người có ảnh hưởng trong influencer-avatars/, còn avatar biết nói từ ảnh và giọng nói trong talking-avatar/.
Cùng những lệnh gọi này có sẵn dưới dạng tool trên Google Vids MCP server được host sẵn cho Claude Code, Cursor và VS Code, gồm vids_create_avatar, vids_create_avatar_video và vids_create_speech cho avatar biết nói và giọng nói.
Đăng ở nơi khác
Cũng đăng trên dev.to, thảo luận trên Reddit, chia sẻ trên Bluesky, và trên YouTube dưới dạng clip 30 giây hoàn chỉnh (các bản này bằng tiếng Anh).
Bắt đầu dùng API
Một gói đăng ký $15/tháng dùng được mọi API trên useapi.net: một token cho tất cả dịch vụ. Mỗi dịch vụ bạn kết nối tối đa 3 tài khoản của riêng mình, còn useapi.net lo REST API, cân bằng tải và polling. Cần thêm tài khoản? Mỗi gói đăng ký thêm giá $10/tháng và cho thêm 3 tài khoản ở mỗi dịch vụ.
Không có thẻ thanh toán quốc tế? Bạn có thể đăng ký bằng tiền mã hóa (thanh toán bằng tiền mã hóa không được hoàn tiền). Giá và các gói số lượng lớn có trên trang đăng ký. Nếu thanh toán qua Stripe, bạn được hoàn tiền toàn bộ trong 14 ngày kể từ lần mua đầu tiên khi có dưới 50 lượt tạo thành công. Đã đăng ký rồi? Hãy đổi số lượng trong Stripe Customer Portal thay vì mua lại.