Presentamos Eleven v4Conoce Eleven v4, nuestro modelo más expresivo hasta la fecha.

Ir al contenido

Habla con una estatua: crea una app multimodal con ElevenAgents

Escrito por
Joe Reeve
Publicado
Última actualización

EscucharEscucha este artículo

Fotografía una estatua. Identifica las figuras representadas. Después, mantén una conversación por voz en tiempo real con ellas: cada personaje hablará con una voz distinta y acorde a su época.

Eso es lo que puedes crear con las API de Voice Design y Agents de ElevenLabs. En este artículo, repasamos la arquitectura de una app web móvil que combina visión artificial con generación de voz para convertir monumentos públicos en experiencias interactivas. Todo lo que se explica aquí puede reproducirse con las API y los ejemplos de código de abajo.

Sáltate el tutorial: créalo con un solo prompt

Toda la app que aparece a continuación se creó a partir de un único prompt, probado con éxito para resolverlo de una vez en Cursor con Claude Opus 4.5 (high), desde un proyecto vacío de NextJS. Si quieres ir directo al grano y crear la tuya, pega esto en tu editor:

We need to make an app that:
- is optimised for mobile
- allows the user to take a picture (of a statue, picture, monument, etc) that includes one or more people
- uses an OpenAI LLM api call to identify the statue/monument/picture, characters within it, the location, and name
- allows the user to check it's correct, and then do either a deep research or a standard search to get information about the characters and the statue's history, and it's current location
- then create an ElevenLabs agent (allowing multiple voices), that the user can then talk to as though they're talking to the characters in the statue. Each character should use voice designer api to create a matching voice.
The purpose is to be fun and educational.

https://elevenlabs.io/docs/eleven-api/guides/how-to/voices/voice-design
https://elevenlabs.io/docs/eleven-agents/quickstart 
https://elevenlabs.io/docs/api-reference/agents/create


También puedes usar las Skills de ElevenLabs Agent en lugar de enlazar la documentación. Se basan en la documentación y pueden ofrecer resultados aún mejores.

El resto de este artículo explica en detalle lo que genera ese prompt.

Cómo funciona

El proceso tiene cinco fases:

  1. Capturar una imagen
  2. Identificar la obra y sus personajes (OpenAI)
  3. Investigar la historia (OpenAI)
  4. Generar voces únicas para cada personaje (ElevenAPI)
  5. Iniciar una conversación por voz en tiempo real mediante WebRTC (ElevenAgents)

Identificar la estatua con visión artificial

Cuando un usuario fotografía una estatua, la imagen se envía a un modelo de OpenAI con capacidad de visión. Un prompt de sistema estructurado extrae el nombre de la obra, su ubicación, el artista, la fecha y, lo más importante, una descripción detallada de la voz de cada personaje. El prompt de sistema incluye el formato de salida JSON esperado:

{
  "statueName": "string - name of the statue, monument, or artwork",
  "location": "string - where it is located (city, country)",
  "artist": "string - the creator of the artwork",
  "year": "string - year completed or unveiled",
  "description": "string - brief description of the artwork and its historical significance",
  "characters": [
    {
      "name": "string - character name",
      "description": "string - who this person was and their historical significance",
      "era": "string - time period they lived in",
      "voiceDescription": "string - detailed voice description for Voice Design API (include audio quality marker, age, gender, vocal qualities, accent, pacing, and personality)"
    }
  ]
}
const response = await openai.chat.completions.create({
  model: "gpt-5.2",
  response_format: { type: "json_object" },
  messages: [
    { role: "system", content: SYSTEM_PROMPT },
    {
      role: "user",
      content: [
        {
          type: "text",
          text: "Identify this statue/monument/artwork and all characters depicted.",
        },
        {
          type: "image_url",
          image_url: {
            url: `data:image/jpeg;base64,${base64Data}`,
            detail: "high",
          },
        },
      ],
    },
  ],
  max_completion_tokens: 2500,
});

Para una fotografía de la estatua de Boudica en el puente de Westminster, Londres, la respuesta tiene este aspecto:

{
  "statueName": "Boudica and Her Daughters",
  "location": "Westminster Bridge, London, UK",
  "artist": "Thomas Thornycroft",
  "year": "1902",
  "description": "Bronze statue depicting Queen Boudica riding a war chariot with her two daughters, commemorating her uprising against Roman occupation of Britain.",
  "characters": [
    {
      "name": "Boudica",
      "description": "Queen of the Iceni tribe who led an uprising against Roman occupation",
      "era": "Ancient Britain, 60-61 AD",
      "voiceDescription": "Perfect audio quality. A powerful woman in her 30s with a deep, resonant voice and a thick Celtic British accent. Her tone is commanding and fierce, with a booming quality that projects authority. She speaks at a measured, deliberate pace with passionate intensity."
    },
    // Other characters in the statue
  ]
}

Cómo escribir descripciones de voz eficaces

La calidad de la descripción de voz determina directamente la calidad de la voz generada. La guía de prompting de Voice Design explica esto en detalle, pero los atributos clave que debes incluir son: un indicador de calidad de audio («Perfect audio quality.»), edad y género, tono/timbre (grave, resonante, áspero), un acento preciso («thick Celtic British accent» en lugar de simplemente «British») y ritmo. Los prompts más descriptivos dan resultados más precisos: «a tired New Yorker in her 60s with a dry sense of humor» siempre superará a «an older female voice».

Algunos aspectos destacables de la guía: usa «thick» en lugar de «strong» al describir la intensidad de un acento, evita términos vagos como «foreign» y, para personajes ficticios o históricos, puedes sugerir acentos reales como inspiración (por ejemplo, «an ancient Celtic queen with a thick British accent, regal and commanding»).

Crear voces de personajes con Voice Design

La API de Voice Design genera nuevas voces sintéticas a partir de descripciones de texto, sin საჭირო de muestras de voz ni clonación. Esto la hace ideal para figuras históricas de las que no existe audio original.

El proceso tiene dos pasos.

Generar previsualizaciones

const { previews } = await elevenlabs.textToVoice.design({
  modelId: "eleven_multilingual_ttv_v2",
  voiceDescription: character.voiceDescription,
  text: sampleText,
});

El parámetro de texto es importante. Un texto de muestra más largo y adecuado para el personaje (más de 50 palabras) ofrece resultados más estables: adapta el diálogo al personaje en vez de usar un saludo genérico. La guía de prompting de Voice Design explica esto con más detalle.

Guardar la voz

Una vez generadas las previsualizaciones, selecciona una y crea una voz permanente:

const voice = await elevenlabs.textToVoice.create({
  voiceName: `StatueScanner - ${character.name}`,
  voiceDescription: character.voiceDescription,
  generatedVoiceId: previews[0].generatedVoiceId,
});

En estatuas con varios personajes, la creación de voces se ejecuta en paralelo. Las voces de cinco personajes se generan aproximadamente en el mismo tiempo que una sola:

const results = await Promise.all(
  characters.map((character) => createVoiceForCharacter(character))
);

Crear un Agent de ElevenLabs con varias voces

Una vez creadas las voces, el siguiente paso es configurar un Agent de ElevenLabs que pueda cambiar entre las voces de los personajes en tiempo real.

const agent = await elevenlabs.conversationalAi.agents.create({
  name: `Statue Scanner - ${statueName}`,
  tags: ["statue-scanner"],
  conversationConfig: {
    agent: {
      firstMessage,
      language: "en",
      prompt: {
        prompt: systemPrompt,
        temperature: 0.7,
      },
    },
    tts: {
      voiceId: primaryCharacter.voiceId,
      modelId: "eleven_v3",
      supportedVoices: otherCharacters.map((c) => ({
        voiceId: c.voiceId,
        label: c.name,
        description: c.voiceDescription,
      })),
    },
    turn: {
      turnTimeout: 10,
    },
    conversation: {
      maxDurationSeconds: 600,
    },
  },
});

Cambio entre varias voces

El array supportedVoices indica al agente qué voces están disponibles. La plataforma Agents gestiona el cambio de voz automáticamente: cuando la respuesta del LLM indica que habla otro personaje, el motor de TTS dirige ese fragmento a la voz correcta.

Prompt engineering para conversaciones grupales

Hacer que varios personajes parezcan un grupo real, en lugar de una sesión de preguntas y respuestas secuencial, requiere diseñar el prompt de forma deliberada:

const multiCharacterRules = `
MULTI-CHARACTER DYNAMICS:
You are playing ALL ${characters.length} characters simultaneously.
Make this feel like a group conversation, not an interview.

- Characters should interrupt each other:
  "Actually, if I may -" / "Wait, I must say -"

- React to what others say:
  "Well said." / "I disagree with that..." / "Always so modest..."

- Have side conversations:
  "Do you remember when -" / "Tell them about the time you -"

The goal is for users to feel like they are witnessing a real exchange
between people who happen to include them.
`;

Voz en tiempo real mediante WebRTC

La pieza final es la conexión del cliente. Los Agents de ElevenLabs admiten WebRTC para conversaciones por voz de baja latencia, notablemente más rápidas que las conexiones basadas en WebSocket, algo importante para que los turnos de palabra sean naturales.

Servidor: obtener un token de conversación

const { token } = await client.conversationalAi.conversations.getWebrtcToken({
    agentId,
});

Cliente: iniciar la sesión

import { useConversation } from "@elevenlabs/react";

const conversation = useConversation({
  onConnect: () => setIsSessionActive(true),
  onDisconnect: () => setIsSessionActive(false),
  onMessage: (message) => {
    if (message.source === "ai") {
      setMessages((prev) => [...prev, { role: "agent", text: message.message }]);
    }
  },
});

await conversation.startSession({
  agentId,
  conversationToken: token,
  connectionType: "webrtc",
});

El hook useConversation gestiona la captura de audio, el streaming, la detección de actividad de voz y la reproducción.

Añadir profundidad a la investigación con búsqueda web

Para usuarios que quieran más contexto histórico antes de iniciar una conversación, puedes añadir un modo de investigación avanzada con la herramienta de búsqueda web de OpenAI:

const response = await openai.responses.create({
  model: "gpt-5.2",
  instructions: RESEARCH_SYSTEM_PROMPT,
  tools: [{ type: "web_search_preview" }],
  input: `Research ${identification.statueName}. Search for current information
including location, visiting hours, and recent news about the artwork.`,
});

Lo que hemos aprendido

Este proyecto demuestra que, al combinar distintas modalidades de IA —texto, investigación, visión y audio—, podemos crear experiencias que conectan el mundo digital y el real. Los agentes multimodales tienen mucho potencial todavía por explorar, y nos encantaría que más gente lo hiciera para aprender, trabajar y divertirse.

Empieza a crear

Las API utilizadas en este proyecto — Voice Design, ElevenAgents y OpenAI— ya están disponibles.

Escrito por

Joe trabaja en el equipo de Crecimiento en ElevenLabs, enfocado en ayudar a desarrolladores a aprovechar al máximo los modelos de audio de vanguardia de ElevenLabs

Artículos relacionados

Crea con el audio IA de la más alta calidad