Cómo hacer videos de influencer con IA usando avatares mediante la Google Vids API

15 min de lectura • 7 de octubre de 2026 (6 de noviembre de 2026)

useapi.net es una API de terceros. No está afiliada a Google ni cuenta con su respaldo.

Índice

  1. Introducción
  2. Cuánto costó
  3. Antes de empezar
  4. Cómo se hizo
    1. 1. Retrato de Mia
    2. 2. Foto del producto AeroLoop
    3. 3. Elegir las voces
    4. 4. Avatar de Mia a partir del retrato
    5. 5. Avatar de Leo a partir de una descripción
    6. 6. El lanzamiento: dos avatares y el producto en un clip
    7. 7. Extender a 20 segundos
    8. 8. Extender a 30 segundos
    9. 9. Upscale a 1080p
  5. Ejemplos
    1. Llevar el lanzamiento a una azotea
    2. Un clip destacado del producto a partir de una imagen inicial
    3. Una paloma con AeroLoop
  6. Un avatar parlante a partir de una foto
    1. Subir la foto
    2. Avatar de Amber, reestilizado con una frase
    3. El guion
    4. El video hablado
  7. Voz sola
  8. Lo que aprendimos
  9. Preguntas frecuentes
  10. Conclusión

Introducción

La Google Vids API de useapi.net hace videos hablados de influencer con IA a partir de avatares: guarda una imagen y una de las 30 voces de Gemini una sola vez con POST /avatars, y luego pasa el id del avatar a cualquier video de Gemini Omni 1.2 Flash de hasta 15 segundos, donde dice las líneas que escribes en el prompt, o haz que lea tu propio guion en un video de avatar parlante de hasta 30 segundos.

La API se ejecuta en tu cuenta de Google Vids, con una suscripción de Google AI de pago (Google AI Pro o Ultra). Este recorrido crea dos influencers y lanza unas zapatillas con ellos. El avatar de Mia sale de un retrato hecho con la API, y el de Leo lo dibuja Google a partir de una descripción escrita. Presentan las AeroLoop, unas zapatillas inventadas, en el escenario de un teatro, en un clip de 10 segundos con los dos avatares y una imagen del producto, y dos extensiones llevan el clip a 30 segundos. Una edición traslada la escena a una azotea, y dos clips más muestran lo que hacen las mismas llamadas sin avatares. Un tercer avatar, Amber, parte de la foto de una persona real, se reestiliza con una frase y lee un guion de 327 caracteres en un video de avatar parlante de 24 segundos. Por último, la misma voz lee una historia de 2.426 caracteres como voz sola. Cada solicitud de abajo es la que generó el contenido de esta página, con los ids cambiados y async: true agregado por el helper run. Los clips se hicieron en octubre de 2026 con Omni 1.1 Flash, que Vids reemplazó por Omni 1.2 Flash el 5 de noviembre de 2026, y las mismas solicitudes funcionan en 1.2. Omni 1.2 en Google Vids y en Google Flow lado a lado, con videos de 15 segundos y el precio por video: Cómo usar la API de Gemini Omni 1.2 Flash.

El clip final de 30 segundos en 720p: una generación de 10 segundos y dos extensiones de 10 segundos (pasos 6 a 8).

Cuánto costó

useapi.net es una API, no un servicio de video propio. Cada llamada se ejecuta en una cuenta de Google que conectas con Setup Google Vids, con una suscripción de Google AI de pago, y gasta los segundos de video y las imágenes que esa suscripción incluye en Google Vids cada mes. Google AI Ultra US$199,99 incluye 10.000 segundos de video y 1.000 imágenes al mes, y useapi.net no cobra nada por video. Los videos de avatar parlante y la voz no gastan segundos de video: tienen sus propios contadores mensuales, videos de avatar con IA y usos de Gemini, que GET /accounts/email muestra como avatarVideo y speech, junto a video e image. Consulta lo que incluye cada plan para los demás planes.

Lo que gastó cada resultado conservado, tomado del cambio en result.quota, y cuánto tardó cada job (result.elapsedMs):

Paso Endpoint Gasto Tiempo
Retrato de Mia POST /images 1 imagen 9 s
Foto del producto AeroLoop POST /images 1 imagen 9 s
Avatar de Mia, del retrato POST /avatars nada unos 2 s
Avatar de Leo, de una descripción POST /avatars 1 imagen unos 20 s
Clip de lanzamiento de 10 segundos POST /videos 10 s 38 s
Extender a 20 segundos POST /videos/extend 10 s 70 s
Extender a 30 segundos POST /videos/extend 10 s 85 s
Upscale de los 20 segundos a 1080p POST /videos/upscale 20 s 62 s
Edición en la azotea POST /videos/edit 10 s 64 s
Edición del clip de 30 segundos POST /videos/edit 10 s 87 s
Clip destacado del producto POST /videos 10 s 62 s
La paloma POST /videos 5 s 54 s
Avatar de Amber, de una foto con refine POST /avatars nada (hecho en un plan sin imágenes, 2 imágenes en un plan con ellas) unos 30 a 45 s
Video hablado de 24 segundos de Amber POST /videos/avatar 1 video de avatar con IA, 1 uso de Gemini unos 2,5 min
La historia de 2.426 caracteres POST /speech 1 uso de Gemini 20 s
Total   85 s de video, 3 imágenes, 1 video de avatar con IA, 2 usos de Gemini  

Una extensión gasta solo los segundos que agrega, no la duración del clip. Un upscale vuelve a gastar la duración completa del clip, y una edición gasta como máximo los segundos que edita (con Omni 1.2, una edición de 15 segundos gastó 10 en nuestras pruebas). 720p y 1080p cuestan lo mismo al generar. Un clip generado de nuevo vuelve a gastar sus segundos. Cada imagen que Google hace para un avatar gasta 1 imagen, así que una foto reencuadrada más un refine gastan 2. En un plan sin imágenes, como una cuenta gratuita de Google, las imágenes de avatar no cuestan nada: Amber se hizo en una cuenta así. Un video de avatar parlante gasta 1 video de avatar con IA, más 1 uso de Gemini por la voz, incluso cuando Google rechaza el video terminado. Cuánto sale un video frente a la API oficial está en la tabla de precios de Google Vids.

Antes de empezar

Necesitas un token de API de useapi.net y una cuenta de Google con una suscripción de Google AI de pago, conectada con Setup Google Vids. Una cuenta gratuita de Google no recibe segundos de video ni imágenes de Vids: igual se puede agregar, y en nuestras pruebas (noviembre de 2026) hizo avatares, videos de avatar parlante y voz. Todas las llamadas también están en la colección de Postman.

Sin código: la plantilla de n8n Talking Avatar App hace un video de avatar parlante a partir de un formulario. El pipeline completo también está en GitHub como un solo script, en Node.js y Python: influencer-avatars/ en useapi/google-vids-api, y las secciones de avatar parlante y voz en talking-avatar/.

Los pasos usan curl, jq y estas variables y helpers:

Ver las variables y los helpers
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"; }

# ejecuta un job de video de forma asíncrona: lo envía, consulta GET /jobs/{jobid} cada 10 s y guarda el registro final del job en $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"
}

Cada generación se ejecuta como un job. Sin async, un POST espera hasta unos 100 segundos y devuelve el registro del job terminado, o 202 con el job todavía en curso. Un clip nuevo de 10 segundos tardó de 38 a 62 segundos aquí, las extensiones, las ediciones y el upscale tardaron de 62 a 87, y el video de avatar parlante unos dos minutos y medio. Algunos superan la espera síncrona, así que run envía los jobs de video con async: true y consulta GET /jobs/jobid. Si run muestra cualquier status distinto de completed, detente ahí y lee el error: las líneas siguientes esperan un clip terminado.

Para recibir un callback en lugar de consultar, agrega replyUrl: "https://example.com/hooks/vids" (y, si quieres, replyRef: "launch-push-in") a cualquier cuerpo de abajo. La API envía entonces un único POST del registro final del job, en JSON, a esa URL cuando el job termina o falla.

Los ids tienen : y @, así que enc los codifica para URL cada vez que entran en una ruta de URL. Todas las entradas de un video tienen que venir de la misma cuenta de Google. Las imágenes y la subida fijan el email, el avatar de Mia hereda la cuenta del retrato, y un job de video se ejecuta en la cuenta que guarda sus entradas. El clip de la paloma no tiene entradas, así que agrégale email si conectas más de una cuenta.

Cómo se hizo

1. Retrato de Mia

POST /images genera un JPEG por llamada, aquí en vertical (9:16, 768×1376) con el estilo 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

Mia, un retrato de cuerpo entero generado de una influencer de moda con sudadera crema y pantalón cargo, hecho con POST /images

Las imágenes generadas están disponibles solo por unas horas. Haz el avatar a partir de ella pronto, y consulta el clip destacado del producto para usar una imagen más tarde.

2. Foto del producto AeroLoop

La misma llamada en horizontal (16:9, 1376×768) da la referencia del producto que usan los clips.

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

Las zapatillas AeroLoop, unas zapatillas de running blancas y azul eléctrico con suela translúcida sobre un pedestal de concreto, hechas con POST /images

3. Elegir las voces

GET /voices lista las 30 voces con la muestra en inglés de Google para cada una. Es público y no necesita token. Mia habla con Aoede (Vids la llama Tova, estilo “Breezy”) y Leo con Puck (Neo, “Upbeat”). POST /avatars acepta cualquiera de los dos nombres.

curl -sS "$API/voices" | jq -r '.voices[] | "\(.name)\t\(.voice)\t\(.style)\t\(.preview)"'

4. Avatar de Mia a partir del retrato

POST /avatars con image igual al mediaId del retrato guarda a Mia como avatar en la misma cuenta en unos 2 segundos. No cuesta nada aparte de la imagen.

curl — POST /avatars y la respuesta
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"
}

Un avatar también puede partir de la foto de una persona: sube la foto con POST /assets y pasa su assetId como image. Google reencuadra la foto en una imagen de avatar 16:9 y rechaza fotos de personas famosas y de menores. Aquí usamos una imagen hecha con la API, y una descripción en el paso siguiente. Amber, en un avatar parlante a partir de una foto, parte de una foto.

5. Avatar de Leo a partir de una descripción

Con appearance en lugar de image, Google dibuja a la persona. outfit y shot son opcionales, igual que expression y details. Dibujar la imagen gasta 1 de las imágenes del mes, y la respuesta trae esa imagen como previewMediaId. En nuestras pruebas, un avatar por descripción salió en 1280×720 (16:9), sin importar el shot elegido.

curl — POST /avatars y la respuesta
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"
  }
}

Leo, un avatar que Google dibujó a partir de una descripción: un joven con chaleco acolchado negro sobre camiseta blanca y cadena plateada, 1280x720

Los dos avatares se quedan en el documento de Vids de la cuenta hasta que los borres con DELETE /avatars/avatarId. GET /avatars lista los avatares, con sus ids, cada vez que los necesites de nuevo:

get "avatars?email=$(enc "$EMAIL")" | jq -r '.avatars[] | "\(.name)\t\(.voiceId)\t\(.avatarId)"'

6. El lanzamiento: dos avatares y el producto en un clip

POST /videos acepta hasta 3 referencias en total, avatares (avatar_1..avatar_3) e imágenes (referenceImage_1..referenceImage_3) juntos. En el prompt, @avatar_1, @avatar_2 y @referenceImage_1 representan esas referencias, y cada avatar dice su línea entre comillas con su propia voz. El mediaId de la imagen del producto entra directo: la API busca la imagen y la sube a esa cuenta.

curl — POST /videos y el registro del 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

El registro del job, con los ids y el prompt acortados. Se hizo con una llamada síncrona, por eso el request no tiene 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 segundos, 720p, 38 segundos para generar.

El mismo clip con el ✦ visible de Gemini quitado por nuestro removedor de marca de agua, con un comando: python3 vids_watermark_remover.py launch-10s.mp4.

El removedor funciona en clips tal como se generaron y en sus upscales, en 720p y 1080p. No funciona en clips extendidos o editados: Google devuelve el clip marcado al modelo, que vuelve a pintar la estrella en la imagen. La marca de agua invisible SynthID no se toca.

7. Extender a 20 segundos

POST /videos/extend agrega de 3 a 10 segundos y devuelve el clip completo con un nuevo mediaId. Una extensión recibe solo el clip y un prompt, no los avatares, así que el prompt describe la nueva acción y nombra a las personas por lo que llevan puesto (“the man in the black puffer vest”). Un fan con sudadera roja invade el escenario.

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 segundos, 720p, 70 segundos para generar. Gastó 10 de los segundos del mes, los segundos que agregó.

8. Extender a 30 segundos

La segunda extensión continúa el clip de 20 segundos.

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

El resultado es el clip final: 30 segundos, 720p, 85 segundos para generar, y otra vez 10 de los segundos del mes. Con Omni 1.1 se podía seguir hasta unos 41 segundos. Omni 1.2 extiende clips de hasta 24 segundos, así que este clip de 30 segundos ya está en el límite, y el clip más largo dura unos 34 segundos (24 + 10).

9. Upscale a 1080p

POST /videos/upscale convierte un clip 720p en 1080p y mantiene la duración. Funciona en clips de hasta 20 segundos, así que hicimos el upscale del clip de 20 segundos del paso 7, no del de 30. Volvió a gastar los 20 segundos del clip y tardó 62 segundos.

La Gemini API del propio Google no tiene este paso: hace 1080p y 4K solo como salida de una generación o de una edición, y no hace upscale de un clip que ya tienes (a noviembre de 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

El clip de 20 segundos, con upscale a 1920×1080.

Por qué no el clip de 30 segundos: Google devolvió el clip en 1920×1080, pero con los fotogramas fuera de orden, tres veces de tres. El final con confeti aparecía antes de que llegara el fan. El clip de 20 segundos volvió en orden, y el propio editor de Vids se detiene en 20 segundos, así que la API rechaza los upscales de clips de más de 20 segundos con 400, antes de cualquier cobro.

Entonces, para un clip en 1080p:

  • Genera, extiende y edita en 720p.
  • Haz el upscale cuando el clip esté terminado, mientras dure 20 segundos o menos.
  • Para un clip más largo (21 a 34 segundos), quédate en 720p y define resolution: "1080p" solo en la última extensión. Extender en 1080p todo el tiempo deja los segundos anteriores demasiado nítidos en cada paso (ver la comparación, en inglés).
  • Para un clip único que no vas a extender ni editar, genera directo en 1080p: gasta los mismos segundos que 720p, mientras que un upscale vuelve a gastarlo todo.

Ejemplos

Más resultados de la misma cuenta y las mismas entradas: una edición, un clip de producto a partir de una imagen inicial y un clip solo con texto.

Llevar el lanzamiento a una azotea

POST /videos/edit cambia un clip generado mediante un prompt y devuelve un clip nuevo. La fuente va en video. Esta edición del clip de lanzamiento de 10 segundos gastó 10 segundos y tardó 64 segundos.

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

Con Omni 1.1, que hizo estos clips, una edición funcionaba en hasta 10 segundos. La misma edición del clip de 30 segundos, con “Same three people”, volvió con 10 segundos: los primeros 10 segundos, llevados a la azotea. Gastó 10 de los segundos del mes. Omni 1.2 edita hasta 15 segundos. Para tener un clip editado más largo, edita un clip de hasta 15 segundos y extiende el resultado, ya que una extensión acepta un clip editado.

La edición del clip de 30 segundos con Omni 1.1: volvieron 10 segundos.

Un clip destacado del producto a partir de una imagen inicial

Con startImage, el clip abre en esa imagen. El enlace de una imagen generada vence en pocas horas, así que subimos el aeroloop.jpg guardado con POST /assets y pasamos su assetId. Un clip único no tiene extensiones, así que se hizo directo en 1080p.

curl — POST /assets y 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 segundos, 1080p.

Una paloma con AeroLoop

Un clip solo con texto, en vertical y 1080p (1080×1920). Los 5 segundos tardaron 54 segundos en generarse y gastaron 5 de los segundos del mes.

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

La paloma en 1080p vertical (1080×1920), con el ✦ quitado de la misma forma: python3 vids_watermark_remover.py pigeon-5s.mp4. El script lee el tamaño del fotograma, calcula dónde está la estrella y qué tamaño tiene (sigue el lado menor, así que aquí es 1,5 veces la estrella de 720p), revierte la mezcla en los 120 fotogramas, recodifica el video con CRF 18 y copia el audio sin cambios. El clip de 5 segundos tardó unos 10 segundos en una PC de 14 núcleos, lo mismo que el clip de lanzamiento de 10 segundos en 720p de arriba. Necesita Python 3.8+, numpy y ffmpeg. Consulta el removedor de marca de agua en GitHub.

Un avatar parlante a partir de una foto

POST /videos/avatar hace que un avatar lea tu guion palabra por palabra, con su propia voz: un video de avatar parlante en 1280×720, con sonido y sincronización labial, de la duración del habla, hasta 30 segundos. Aquí el avatar parte de la foto de una persona real, reestilizada con una frase. Estas solicitudes aparecieron primero en la publicación de lanzamiento del 4 de noviembre (en inglés).

Subir la foto

Partimos de la foto de una persona real que no es famosa: Google rechaza fotos de personas famosas y de menores. POST /assets sube la foto a la cuenta que va a hacer el avatar, ya que un archivo subido solo funciona en su propia cuenta.

curl — POST /assets y la respuesta
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
}

La foto original: una mujer de pelo rojizo largo y vestido blanco, frente a una cortina crema

Avatar de Amber, reestilizado con una frase

POST /avatars con el assetId de la subida como image y un refine. Primero Google reencuadra la foto en una imagen de avatar 16:9 de una persona de frente a la cámara, manteniendo el rostro, y luego cambia la escena como pide el refine. Le dimos el nombre Amber y la voz Vira (la Pulcherrima de Google, estilo “Forward”). La foto reencuadrada y el cambio son 2 imágenes, así que en un plan con imágenes esto gasta 2 imágenes, y en un plan sin ellas, nada.

curl — POST /avatars y la respuesta
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. …"
}

Amber, el avatar hecho de la foto con refine: sentada en una silla de madera en lo alto de una colina al atardecer, con una copa de vino tinto, 1280x720

Dos decisiones en el refine importan para el video. El avatar queda de frente a la cámara, porque el video sincroniza los labios del rostro. Y el fondo queda quieto, para que ella sea lo único que se mueve: por eso pedimos un campo tranquilo en lugar de olas en una playa.

El guion

Un guion tiene hasta 400 caracteres y, hablado, tiene que caber en 30 segundos. Las etiquetas de audio entre corchetes se interpretan, no se leen: aquí, [awe], [thoughtful] y [whisper]. En la voz de Vira, estos 327 caracteres duraron 23,8 segundos. Una voz más lenta o [slow pace] alarga el mismo texto, y un guion que pasa de 30 segundos falla con 400 antes de que empiece el video. Eso no gasta video de avatar con IA, pero el uso de Gemini por la voz sí se gasta. Para escuchar antes un guion en la voz del avatar, léelo con 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.

El video hablado

POST /videos/avatar recibe el avatar y el guion, y se ejecuta en la cuenta que guarda el avatar. Google tardó unos dos minutos y medio, más que la espera síncrona, así que run lo envía con async: true.

curl — POST /videos/avatar y el registro del 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

El registro del job, acortado:

{
  "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" }
    }
  }
}

También en YouTube, como Short: Talking AI avatar from one photo (en inglés).

24 segundos, 1280×720 con sonido, exactamente la duración del habla (speechDuration 23,84). Gastó 1 video de avatar con IA y 1 uso de Gemini, y ningún segundo de video.

Google también revisa el video mientras lo genera, y esa revisión es más estricta que la de las imágenes de avatar. Una versión anterior de este avatar, hecha a partir de otra foto de una persona común en una playa, pasó como avatar, pero su video fue rechazado con 422 por parecerse a una celebridad, y ese intento igual gastó un video de avatar con IA. Reestilizar el avatar o partir de otra foto ayudó. Un guion que Google rechaza antes de que empiece el video no cuesta nada.

Los videos de avatar parlante son solo en horizontal: Google no ofrece opción vertical para ellos. El mediaId del resultado se puede descargar, extender, editar y pasar por upscale como cualquier otro clip. Para una escena en la que el avatar actúa y se mueve, pasa su avatarId como avatar_1 a POST /videos, como en el paso 6.

Voz sola

POST /speech lee un guion de hasta 2.500 caracteres en cualquiera de las 30 voces de GET /voices, con las mismas etiquetas de audio. Úsalo para escuchar cómo lee una voz un guion antes de gastar un video de avatar con IA, o para una narración sola. Le dimos una pequeña historia original, “My smart fridge unionized”, de 2.426 caracteres, en la voz de Vira. Google respondió en 20 segundos con 2 minutos y 22 segundos de habla, la historia completa, y gastó 1 uso de Gemini. La API devuelve un WAV (24 kHz, mono). El reproductor de abajo es el mismo audio en MP3.

La voz está lista con holgura dentro de la espera síncrona (20 segundos para esta historia), así que un post simple responde con el job terminado. Guarda antes la historia como smart-fridge.txt.

curl — POST /speech y el registro del 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
  }
}
El guion, 2.426 caracteres (en inglés, tal como se envió)

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.

Lo que aprendimos

  • Un clip en 1080p se comporta como un 720p con upscale. Arma una cadena de extensiones en 720p: con Omni 1.1, los rostros quedaban más suaves y con aspecto de cera en cada paso en 1080p, y con Omni 1.2 quedan demasiado nítidos (ver la comparación, en inglés).
  • Haz upscale solo de clips de hasta 20 segundos. Nuestro upscale de 30 segundos volvió con los fotogramas fuera de orden todas las veces.
  • Genera un clip único en 1080p si quieres 1080p y no lo vas a extender. Cuesta lo mismo que 720p.
  • Escribe el prompt de una extensión solo sobre la nueva acción. La extensión recibe el clip, no los avatares, así que nombra a las personas por lo que llevan puesto.
  • Pon un objeto en las manos de una persona en la primera frase que habla de ella. Un verbo como “lifts” hizo que las zapatillas aparecieran de la nada.
  • Di lo que no debe pasar. El fan siguió con un fajo de billetes hasta que el prompt dijo que tenía las manos vacías.
  • Reutiliza avatares por su avatarId. Cada avatar es una imagen y una voz fijas, guardadas hasta que lo borres.
  • Haz avatares y clips a partir de una imagen generada en pocas horas, o sube antes el archivo guardado con POST /assets.
  • Edita clips de hasta 15 segundos (10 con Omni 1.1). Un clip más largo vuelve como sus primeros 15 segundos.
  • Espera que el texto en pantalla varíe. El “WEAR AEROLOOP” del fondo sale con faltas de ortografía en algunos fotogramas.
  • Para un avatar parlante, mantén el rostro de frente a la cámara y el fondo quieto. El video sincroniza los labios del rostro, y la persona debe ser lo único que se mueve.
  • Cronometra un guion de avatar parlante, no solo los caracteres. 400 caracteres pueden pasar de 30 segundos en una voz lenta o con [slow pace], y POST /speech en la misma voz te deja escucharlo antes.
  • Espera que la revisión del video hablado sea más estricta que la del avatar. Un avatar de la foto de alguien que no es famoso igual puede ser rechazado como celebridad, y ese rechazo igual gasta un video de avatar con IA.
  • Todo MP4 lleva el ✦ visible de Gemini de Google en la esquina inferior derecha y una marca de agua invisible SynthID (consulta Watermark). Nuestro removedor de marca de agua quita el destello visible de un clip descargado.

Preguntas frecuentes

¿Cómo hacer un video de influencer con IA mediante una API? Con useapi.net, crea un avatar con POST /avatars, a partir de una descripción o de una imagen hecha con POST /images, y dale una voz de GET /voices. Luego pasa su avatarId como avatar_1 a POST /videos y escribe las líneas entre comillas en el prompt. Un video acepta hasta 3 referencias, avatares e imágenes juntos, así que dos avatares pueden conversar junto a un producto. Para un avatar parlante que lee tu guion, usa POST /videos/avatar.

¿Puedo hacer un avatar parlante con mi propia foto? Con useapi.net, sí: sube la foto con POST /assets y pasa su assetId como image a POST /avatars, con refine para cambiar la ropa o el fondo. Después, POST /videos/avatar hace que el avatar lea tu guion en un video de 1280×720 de hasta 30 segundos, como lo hace Amber. Google rechaza fotos de personas famosas y de menores, y ofrece los avatares de Vids solo en la app web, sin API.

¿Un avatar mantiene la misma apariencia y la misma voz en todos los videos? Con useapi.net, sí: un avatar usa la misma imagen y la misma voz cada vez que pasas su avatarId, ya que las dos quedan guardadas con el avatar en el documento de Vids de la cuenta. El video alrededor de él igual varía de una toma a otra. GET /avatars lista tus avatares, incluidos los hechos en la app web de Google Vids.

¿Puedo hacer un video vertical 9:16 para TikTok o Reels? Con useapi.net, sí. Define aspectRatio: "portrait" en POST /videos para 720×1280, o 1080×1920 en 1080p, como en el clip de la paloma. Una extensión también puede convertir un video horizontal en vertical, y cada extensión agrega de 3 a 10 segundos a un clip de hasta 24 segundos, hasta unos 34 segundos en total. Los videos de avatar parlante de POST /videos/avatar son solo en horizontal.

¿Cuánto cuesta? Con useapi.net, un video de Omni 1.2 Flash de 10 segundos cuesta unos US$0,20 en Google AI Ultra US$199,99, frente a unos US$0,70 en 720p en la Gemini API oficial, y un video de 15 segundos en 1080p unos US$0,30, frente a US$1,56 (a noviembre de 2026). Un video de avatar parlante gasta 1 de los videos de avatar con IA mensuales de la cuenta en lugar de segundos, y la Gemini API no tiene videos de avatar. Consulta Cuánto costó.

Conclusión

Visita nuestro servidor de Discord o el canal de Telegram para cualquier pregunta de soporte.

Consulta nuestro repositorio en GitHub con ejemplos de código: el pipeline de influencer en influencer-avatars/, y el avatar parlante a partir de una foto y la voz en talking-avatar/.

Las mismas llamadas están disponibles como herramientas en el servidor MCP de Google Vids alojado, para Claude Code, Cursor y VS Code, incluidas vids_create_avatar, vids_create_avatar_video y vids_create_speech para el avatar parlante y la voz.

También publicado en

También publicado en dev.to, comentado en Reddit, compartido en Bluesky y en YouTube como el clip final de 30 segundos (todos en inglés).

Empieza a usar la API

Una sola suscripción de US$15 al mes cubre todas las API de useapi.net: un token para todos los servicios. Conectas hasta 3 cuentas propias por servicio, cada una con la suscripción de su sitio web, y useapi.net se encarga de la API REST, el balanceo de carga y el polling. ¿Necesitas más cuentas? Cada suscripción adicional cuesta US$10 al mes y suma 3 cuentas más por servicio.

Suscríbete — US$15/mes Pagar con cripto

¿No tienes una tarjeta de crédito internacional? También puedes suscribirte con criptomonedas (los pagos con cripto no se reembolsan). Los precios y los planes por volumen están en la página de suscripción. Si pagas con Stripe, recibes el reembolso completo dentro de los 14 días posteriores a la primera compra, si tienes menos de 50 generaciones exitosas. ¿Ya tienes una suscripción? Cambia la cantidad en el portal de clientes de Stripe en lugar de volver a comprar.