Vi presenterar Eleven v4Möt Eleven v4, vår mest uttrycksfulla modell hittills.

Hoppa till innehållet

Prata med en staty: Bygg en multimodal app med ElevenAgents

Skriven av
Joe Reeve
Publicerad
Senast uppdaterad

LyssnaLyssna på den här artikeln

Fotografera en staty. Identifiera personerna som avbildas. Ha sedan ett röstsamtal med dem i realtid – där varje karaktär talar med en egen röst som passar tidsperioden.

Det är vad du kan bygga med ElevenLabs API:er för Voice Design och Agents. I det här inlägget går vi igenom arkitekturen för en mobil webbapp som kombinerar datorseende med röstgenerering för att göra offentliga monument till interaktiva upplevelser. Allt här går att återskapa med API:erna och kodexemplen nedan.

Hoppa över guiden – bygg den med en enda prompt

Hela appen nedan byggdes med en enda prompt och testades framgångsrikt i ett enda försök i Cursor med Claude Opus 4.5 (high) från ett tomt NextJS-projekt. Vill du hoppa direkt till att bygga din egen klistrar du in detta i din kodredigerare:

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


Du kan också använda ElevenLabs Agent Skills i stället för att länka till dokumentationen. De bygger på dokumentationen och kan ge ännu bättre resultat.

Resten av inlägget förklarar vad den prompten skapar.

Så fungerar det

Flödet har fem steg:

  1. Ta en bild
  2. Identifiera konstverket och dess karaktärer (OpenAI)
  3. Undersök historien (OpenAI)
  4. Generera unika röster för varje karaktär (ElevenAPI)
  5. Starta ett röstsamtal i realtid via WebRTC (ElevenAgents)

Identifiera statyn med datorseende

När en användare fotograferar en staty skickas bilden till en OpenAI-modell med stöd för datorseende. En strukturerad systemprompt hämtar konstverkets namn, plats, konstnär, datum och – vilket är avgörande – en detaljerad röstbeskrivning för varje karaktär. Systemprompten innehåller det förväntade JSON-utdataformatet:

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

För ett foto av Boudica-statyn vid Westminster Bridge i London ser svaret ut så här:

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

Skriv effektiva röstbeskrivningar

Kvaliteten på röstbeskrivningen avgör direkt kvaliteten på den genererade rösten. Guiden för Voice Design-prompter beskriver detta i detalj, men de viktigaste attributen att ta med är: en markör för ljudkvalitet (”Perfect audio quality.”), ålder och kön, ton/klang (djup, resonant, sträv), en specifik accent (”thick Celtic British accent” i stället för bara ”British”) och taltempo. Mer beskrivande prompter ger mer träffsäkra resultat – ”en trött New York-bo i 60-årsåldern med torr humor” kommer alltid att prestera bättre än ”en äldre kvinnoröst”.

Några saker från guiden är värda att notera: använd ”thick” i stället för ”strong” för att beskriva hur tydlig accenten är, undvik vaga termer som ”foreign”, och för fiktiva eller historiska karaktärer kan du föreslå verkliga accenter som inspiration (t.ex. ”an ancient Celtic queen with a thick British accent, regal and commanding”).

Skapa karaktärsröster med Voice Design

Voice Design API:t genererar nya syntetiska röster från textbeskrivningar – inga röstprover eller kloning krävs. Därför passar det bra för historiska personer där det inte finns något källjud.

Processen har två steg.

Generera förhandsvisningar

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

Textparametern spelar roll. Längre exempeltexter som passar karaktären (minst 50 ord) ger stabilare resultat – anpassa dialogen till karaktären i stället för att använda en allmän hälsning. Guiden för Voice Design-prompter beskriver detta mer ingående.

Spara rösten

När förhandsvisningarna har genererats väljer du en och skapar en permanent röst:

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

För statyer med flera karaktärer skapas rösterna parallellt. Röster för fem karaktärer genereras på ungefär samma tid som en enda:

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

Bygg en ElevenLabs Agent med flera röster

När rösterna har skapats är nästa steg att konfigurera en ElevenLabs Agent som kan växla mellan karaktärsröster i realtid.

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

Växling mellan flera röster

Arrayen supportedVoices anger vilka röster agenten har tillgång till. Agents-plattformen hanterar röstväxlingen automatiskt – när LLM:ens svar visar att en annan karaktär talar dirigerar TTS-motorn segmentet till rätt röst.

Promptteknik för gruppsamtal

För att få flera karaktärer att kännas som en verklig grupp – snarare än en serie frågor och svar – krävs genomtänkt promptdesign:

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

Röst i realtid via WebRTC

Den sista delen är klientanslutningen. ElevenLabs Agents har stöd för WebRTC för röstsamtal med låg latens – märkbart snabbare än WebSocket-baserade anslutningar, vilket är viktigt för naturliga turbyten i samtalet.

På serversidan: hämta en samtalstoken

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

På klientsidan: starta sessionen

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

Hooken useConversation hanterar ljudupptagning, strömning, röstaktivitetsdetektering och uppspelning.

Ge efterforskningen mer djup med webbsökning

För användare som vill ha mer historisk kontext innan de startar ett samtal kan du lägga till ett utökat forskningsläge med OpenAI:s verktyg för webbsökning:

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

Vad vi lärde oss

Projektet visar att vi kan bygga upplevelser som rör sig mellan den digitala och verkliga världen när vi kombinerar olika AI-modaliteter – text, forskning, datorseende och ljud. Agenter med flera modaliteter har mycket outnyttjad potential som vi gärna vill se fler utforska för utbildning, arbete och nöje.

Börja bygga

API:erna som används i det här projektet – Voice Design, ElevenAgents och OpenAI – är alla tillgängliga i dag.

Skriven av

Joe arbetar med Growth-teamet på ElevenLabs och fokuserar på att hjälpa utvecklare att få ut det mesta av ElevenLabs banbrytande ljudmodeller

Liknande artiklar

Skapa med AI-ljud av högsta kvalitet