Apresentamos o Eleven v4Conheça o Eleven v4, nosso modelo mais expressivo até agora.

Pular para o conteúdo

Converse com uma Estátua: Criando um App Multimodal com ElevenAgents

Escrito por
Joe Reeve
Publicado
Última atualização

OuvirOuça este artigo

Fotografe uma estátua. Identifique as figuras retratadas. Depois, converse com elas por voz em tempo real — cada personagem falando com uma voz distinta e adequada à época.

É isso que você pode criar com as APIs de Voice Design e Agents da ElevenLabs. Neste post, mostramos a arquitetura de um app web para dispositivos móveis que combina visão computacional e geração de voz para transformar monumentos públicos em experiências interativas. Tudo aqui pode ser reproduzido com as APIs e os exemplos de código abaixo.

Pule o tutorial — crie tudo com um único prompt

Todo o app abaixo foi criado a partir de um único prompt, testado com sucesso em uma única tentativa no Cursor com o Claude Opus 4.5 (high), a partir de um projeto NextJS vazio. Se quiser ir direto ao ponto e criar o seu, cole isto no seu 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


Você também pode usar as Skills do ElevenLabs Agent em vez de criar links para a documentação. Elas se baseiam na documentação e podem trazer resultados ainda melhores.

O restante deste post detalha o que esse prompt produz.

Como funciona

O pipeline tem cinco etapas:

  1. Capturar uma imagem
  2. Identificar a obra e seus personagens (OpenAI)
  3. Pesquisar a história (OpenAI)
  4. Gerar vozes únicas para cada personagem (ElevenAPI)
  5. Iniciar uma conversa por voz em tempo real via WebRTC (ElevenAgents)

Identificando a estátua com visão computacional

Quando um usuário fotografa uma estátua, a imagem é enviada para um modelo da OpenAI com recursos de visão. Um prompt de sistema estruturado extrai o nome da obra, local, artista, data e — o mais importante — uma descrição detalhada da voz de cada personagem. O prompt de sistema inclui o formato JSON de saída 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 uma fotografia da estátua de Boudica na Ponte de Westminster, em Londres, a resposta é assim:

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

Como escrever descrições de voz eficazes

A qualidade da descrição de voz determina diretamente a qualidade da voz gerada. O guia de prompts para Voice Design aborda isso em detalhes, mas os principais atributos a incluir são: marcador de qualidade de áudio ("Qualidade de áudio perfeita."), idade e gênero, tom/timbre (grave, ressonante, rouco), um sotaque preciso ("sotaque britânico celta acentuado" em vez de apenas "britânico") e ritmo. Prompts mais descritivos geram resultados mais precisos — "uma nova-iorquina cansada, na casa dos 60 anos, com humor seco" sempre terá um desempenho melhor do que "uma voz feminina mais velha".

Alguns pontos importantes do guia: use "acentuado" em vez de "forte" para descrever a intensidade de um sotaque, evite termos vagos como "estrangeiro" e, para personagens fictícios ou históricos, você pode sugerir sotaques do mundo real como inspiração (por exemplo, "uma antiga rainha celta com um sotaque britânico acentuado, régia e imponente").

Criando vozes de personagens com Voice Design

A API de Voice Design gera novas vozes sintéticas a partir de descrições de texto — sem necessidade de amostras de voz ou clonagem. Isso a torna ideal para figuras históricas cuja gravação de áudio original não existe.

O processo tem duas etapas.

Gerar prévias

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

O parâmetro de texto é importante. Um texto de exemplo mais longo e adequado ao personagem (mais de 50 palavras) produz resultados mais estáveis — adapte o diálogo ao personagem em vez de usar uma saudação genérica. O guia de prompts para Voice Design aborda isso com mais detalhes.

Salvar a voz

Depois que as prévias forem geradas, selecione uma e crie uma voz permanente:

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

Para estátuas com vários personagens, a criação das vozes é executada em paralelo. As vozes de cinco personagens são geradas praticamente no mesmo tempo que uma só:

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

Criando um Agent da ElevenLabs com várias vozes

Com as vozes criadas, a próxima etapa é configurar um Agent da ElevenLabs capaz de alternar entre as vozes dos personagens em tempo 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,
    },
  },
});

Alternância entre várias vozes

O array supportedVoices informa ao agente quais vozes estão disponíveis. A plataforma Agents faz a alternância de vozes automaticamente — quando a resposta do LLM indica que outro personagem está falando, o mecanismo de TTS direciona esse trecho para a voz correta.

Engenharia de prompts para conversas em grupo

Para fazer vários personagens parecerem um grupo real — em vez de uma sessão sequencial de perguntas e respostas — é necessário elaborar os prompts intencionalmente:

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 em tempo real via WebRTC

A última parte é a conexão do cliente. Os Agents da ElevenLabs oferecem suporte a WebRTC para conversas por voz de baixa latência — visivelmente mais rápidas do que conexões baseadas em WebSocket, algo importante para alternâncias de fala naturais.

No servidor: obter um token de conversa

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

No cliente: iniciar a sessão

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",
});

O hook useConversation gerencia a captura e a transmissão de áudio, a detecção de atividade de voz e a reprodução.

Adicionando mais profundidade à pesquisa com busca na web

Para usuários que desejam mais contexto histórico antes de iniciar uma conversa, você pode adicionar um modo de pesquisa avançada usando a ferramenta de busca na web da 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.`,
});

O que aprendemos

Este projeto mostra que, ao combinar diferentes modalidades de IA — texto, pesquisa, visão e áudio — podemos criar experiências que conectam os mundos digital e real. Há muito potencial ainda inexplorado em agentes multimodais, e gostaríamos de ver mais pessoas explorando isso na educação, no trabalho e na diversão.

Comece a criar

As APIs usadas neste projeto — Voice Design, ElevenAgents e OpenAI — já estão disponíveis hoje.

Escrito por

Joe trabalha na equipe de Crescimento da ElevenLabs, focado em ajudar desenvolvedores a aproveitarem ao máximo os modelos de áudio de ponta da ElevenLabs

Artigos relacionados

Crie com o áudio de IA da mais alta qualidade