Maak kennis met Eleven v4Maak kennis met Eleven v4, ons meest expressieve model tot nu toe.

Naar content

Praat met een standbeeld: een multimodale app bouwen met ElevenAgents

Geschreven door
Joe Reeve
Gepubliceerd
Laatst bijgewerkt

LuisterenLuister naar dit artikel

Fotografeer een standbeeld. Identificeer de afgebeelde figuren. Voer vervolgens in realtime een stemgesprek met hen, waarbij elk personage met een eigen stem spreekt die bij de periode past.

Dat kun je bouwen met de Voice Design- en Agent-API's van ElevenLabs. In dit artikel nemen we de architectuur door van een mobiele webapp die computervisie combineert met spraakgeneratie om openbare monumenten om te zetten in interactieve ervaringen. Alles hier is te reproduceren met de onderstaande API's en codevoorbeelden.

Sla de tutorial over: bouw het met één prompt

De volledige app hieronder is gebouwd met één prompt en getest om in één keer succesvol te werken in Cursor met Claude Opus 4.5 (high) vanuit een leeg NextJS-project. Wil je vooruitspoelen en je eigen app bouwen? Plak dit dan in je 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


Je kunt ook de ElevenLabs Agent Skills gebruiken in plaats van naar de documentatie te linken. Deze zijn gebaseerd op de documentatie en kunnen nog betere resultaten opleveren.

In de rest van dit artikel leggen we uit wat die prompt oplevert.

Hoe het werkt

De pipeline bestaat uit vijf stappen:

  1. Leg een afbeelding vast
  2. Identificeer het kunstwerk en de personages (OpenAI)
  3. Onderzoek de geschiedenis (OpenAI)
  4. Genereer unieke stemmen voor elk personage (ElevenAPI)
  5. Start een realtime stemgesprek via WebRTC (ElevenAgents)

Het standbeeld identificeren met visie

Wanneer een gebruiker een standbeeld fotografeert, wordt de afbeelding naar een OpenAI-model met visuele mogelijkheden gestuurd. Een gestructureerde systeemprompt haalt de naam van het kunstwerk, de locatie, de kunstenaar, de datum en – cruciaal – een gedetailleerde stembeschrijving voor elk personage op. De systeemprompt bevat de verwachte JSON-outputindeling:

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

Voor een foto van het standbeeld van Boudica op Westminster Bridge in Londen ziet het antwoord er als volgt uit:

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

Effectieve stembeschrijvingen schrijven

De kwaliteit van de stembeschrijving bepaalt rechtstreeks de kwaliteit van de gegenereerde stem. De Voice Design prompting guide behandelt dit uitgebreid, maar de belangrijkste kenmerken om op te nemen zijn: een markering voor audiokwaliteit ("Perfect audio quality."), leeftijd en gender, toon/timbre (diep, resonant, gruizig), een precies accent ("thick Celtic British accent" in plaats van alleen "British") en tempo. Beschrijvende prompts leveren nauwkeurigere resultaten op: "a tired New Yorker in her 60s with a dry sense of humor" presteert elke keer beter dan "an older female voice".

Een paar aandachtspunten uit de gids: gebruik "thick" in plaats van "strong" om de nadrukkelijkheid van een accent te beschrijven, vermijd vage termen als "foreign" en gebruik voor fictieve of historische personages echte accenten als inspiratie (bijvoorbeeld: "an ancient Celtic queen with a thick British accent, regal and commanding").

Personagestemmen maken met Voice Design

De Voice Design API genereert nieuwe synthetische stemmen op basis van tekstbeschrijvingen – geen stemvoorbeelden of klonen vereist. Daardoor is deze API zeer geschikt voor historische personen van wie geen bronmateriaal met audio bestaat.

Het proces bestaat uit twee stappen.

Previews genereren

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

De tekstparameter is belangrijk. Langere voorbeeldteksten die bij het personage passen (50+ woorden) leveren stabielere resultaten op – laat de dialoog aansluiten bij het personage in plaats van een algemene begroeting te gebruiken. De Voice Design prompting guide behandelt dit uitgebreider.

De stem opslaan

Zodra previews zijn gegenereerd, selecteer je er één en maak je een permanente stem:

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

Voor standbeelden met meerdere personages worden stemmen parallel gemaakt. De stemmen voor vijf personages worden ongeveer even snel gegenereerd als die voor één personage:

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

Een ElevenLabs Agent met meerdere stemmen bouwen

Nadat de stemmen zijn gemaakt, is de volgende stap het configureren van een ElevenLabs Agent die in realtime kan wisselen tussen stemmen van personages.

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

Wisselen tussen meerdere stemmen

De supportedVoices-array vertelt de agent welke stemmen beschikbaar zijn. Het Agents-platform verwerkt het wisselen van stem automatisch: wanneer het antwoord van de LLM aangeeft dat een ander personage spreekt, stuurt de TTS-engine dat segment naar de juiste stem.

Prompt engineering voor groepsgesprekken

Om meerdere personages als een echte groep te laten voelen, in plaats van als een opeenvolgende vraag-en-antwoordsessie, is bewust promptontwerp nodig:

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.
`;

Realtime spraak via WebRTC

Het laatste onderdeel is de clientverbinding. ElevenLabs Agents ondersteunen WebRTC voor stemgesprekken met lage latency – merkbaar sneller dan verbindingen op basis van WebSocket, wat belangrijk is voor natuurlijke beurtwisseling.

Server-side: een gesprekstoken ophalen

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

Client-side: de sessie starten

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

De useConversation-hook verwerkt audio-opname, streaming, spraakactiviteitsdetectie en afspelen.

Onderzoek verdiepen met zoeken op het web

Voor gebruikers die meer historische context willen voordat ze een gesprek starten, kun je een uitgebreide onderzoeksmodus toevoegen met de webzoektool van 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.`,
});

Wat we hebben geleerd

Dit project laat zien dat we ervaringen kunnen bouwen die zowel de digitale als de echte wereld overstijgen wanneer we verschillende AI-modaliteiten combineren: tekst, onderzoek, visie en audio. Er is veel onontdekt potentieel in multimodale agents dat we graag door meer mensen zien verkennen voor onderwijs, werk en plezier.

Begin met bouwen

De API's die in dit project worden gebruikt – Voice Design, ElevenAgents, en OpenAI – zijn vandaag allemaal beschikbaar.

Geschreven door

Joe is on the Growth team at ElevenLabs, focused on helping developers get the most out of the company's frontier audio models. Previously, he was an Engineering Manager at Amplitude and served as CTO of the Coronavirus Tech Handbook, building a real-time collaborative editing platform used by thousands of contributors.

Vergelijkbare artikelen

Creëer met AI-audio van de hoogste kwaliteit