Presentiamo Eleven v4Scopri Eleven v4, il nostro modello più espressivo di sempre.

Vai al contenuto

Parla con una statua: crea un'app multi-modale con ElevenAgents

Scritto da
Joe Reeve
Pubblicato
Ultimo aggiornamento

AscoltaAscolta questo articolo

Fotografa una statua. Identifica le figure raffigurate. Poi avvia con loro una conversazione vocale in tempo reale: ogni personaggio parlerà con una voce distinta e adatta al periodo storico.

È ciò che puoi creare con le API Voice Design e Agent di ElevenLabs. In questo articolo, analizziamo l'architettura di un'app web mobile che combina computer vision e generazione vocale per trasformare i monumenti pubblici in esperienze interattive. Puoi replicare tutto ciò con le API e gli esempi di codice qui sotto.

Salta il tutorial: creala con un solo prompt

L'intera app qui sotto è stata creata partendo da un unico prompt, testato con successo in un solo tentativo in Cursor con Claude Opus 4.5 (high), partendo da un progetto NextJS vuoto. Se vuoi andare direttamente al risultato e crearne una tua, incolla questo nel tuo 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


Puoi anche usare le ElevenLabs Agent Skills invece di inserire link alla documentazione. Si basano sulla documentazione e possono offrire risultati ancora migliori.

Il resto di questo articolo spiega nel dettaglio cosa produce quel prompt.

Come funziona

La pipeline prevede cinque fasi:

  1. Acquisire un'immagine
  2. Identificare l'opera e i suoi personaggi (OpenAI)
  3. Ricercare la storia (OpenAI)
  4. Generare voci uniche per ogni personaggio (ElevenAPI)
  5. Avviare una conversazione vocale in tempo reale tramite WebRTC (ElevenAgents)

Identificare la statua con la visione artificiale

Quando un utente fotografa una statua, l'immagine viene inviata a un modello OpenAI in grado di elaborare immagini. Un prompt di sistema strutturato estrae il nome dell'opera, la posizione, l'artista, la data e, soprattutto, una descrizione vocale dettagliata per ciascun personaggio. Il prompt di sistema include il formato di output JSON previsto:

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

Per una fotografia della statua di Boudica sul Westminster Bridge a Londra, la risposta è simile a questa:

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

Scrivere descrizioni vocali efficaci

La qualità della descrizione vocale determina direttamente quella della voce generata. La guida ai prompt per Voice Design tratta questo argomento in dettaglio, ma gli attributi principali da includere sono: indicatore della qualità audio ("Perfect audio quality."), età e genere, tono/timbro (profondo, risonante, roco), un accento preciso ("thick Celtic British accent" anziché semplicemente "British") e ritmo. I prompt più descrittivi producono risultati più accurati: "a tired New Yorker in her 60s with a dry sense of humor" supererà sempre "an older female voice".

Alcuni aspetti importanti indicati nella guida: usa "thick" anziché "strong" per descrivere quanto è marcato un accento, evita termini vaghi come "foreign" e, per personaggi fittizi o storici, puoi suggerire accenti reali come ispirazione (ad esempio, "an ancient Celtic queen with a thick British accent, regal and commanding").

Creare voci per i personaggi con Voice Design

L'API Voice Design genera nuove voci sintetiche da descrizioni testuali, senza bisogno di campioni vocali o clonazione. Per questo è particolarmente adatta alle figure storiche per cui non esistono registrazioni audio originali.

Il processo si svolge in due passaggi.

Generare anteprime

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

Il parametro text è importante. Un testo di esempio più lungo e adatto al personaggio (oltre 50 parole) produce risultati più stabili: abbina il dialogo al personaggio invece di usare un saluto generico. La guida ai prompt per Voice Design approfondisce ulteriormente l'argomento.

Salvare la voce

Dopo aver generato le anteprime, selezionane una e crea una voce permanente:

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

Per le statue con più personaggi, la creazione delle voci avviene in parallelo. Le voci di cinque personaggi vengono generate all'incirca nello stesso tempo necessario per una sola:

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

Creare un agente ElevenLabs con più voci

Dopo aver creato le voci, il passaggio successivo è configurare un agente ElevenLabs in grado di passare da una voce all'altra dei personaggi in tempo reale.

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

Passaggio tra più voci

L'array supportedVoices indica all'agente quali voci sono disponibili. La piattaforma Agents gestisce automaticamente il passaggio tra le voci: quando la risposta dell'LLM indica che sta parlando un personaggio diverso, il motore TTS indirizza quel segmento alla voce corretta.

Prompt engineering per le conversazioni di gruppo

Per far sembrare più personaggi un vero gruppo, anziché una serie di domande e risposte, serve progettare i prompt con cura:

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

Voce in tempo reale tramite WebRTC

L'ultimo elemento è la connessione client. Gli agenti ElevenLabs supportano WebRTC per conversazioni vocali a bassa latenza, sensibilmente più veloce delle connessioni basate su WebSocket: un aspetto importante per un'alternanza naturale dei turni di parola.

Lato server: ottieni un token di conversazione

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

Lato client: avvia la sessione

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

L'hook useConversation gestisce l'acquisizione audio, lo streaming, il rilevamento dell'attività vocale e la riproduzione.

Aggiungere approfondimenti con la ricerca web

Per gli utenti che desiderano un maggiore contesto storico prima di avviare una conversazione, puoi aggiungere una modalità di ricerca avanzata usando lo strumento di ricerca web di 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.`,
});

Cosa abbiamo imparato

Questo progetto mostra che, combinando diverse modalità dell'IA — testo, ricerca, visione e audio — possiamo creare esperienze che uniscono il mondo digitale e quello reale. Gli agenti multimodali hanno ancora molto potenziale inesplorato e ci piacerebbe che più persone li esplorassero per l'istruzione, il lavoro e il divertimento.

Inizia a creare

Le API utilizzate in questo progetto — Voice Design, ElevenAgents e OpenAI — sono tutte disponibili già oggi.

Scritto da

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.

Articoli simili

Crea con l'audio IA della massima qualità