Découvrez Eleven v4Découvrez Eleven v4, notre modèle le plus expressif à ce jour.

Aller au contenu

Parlez à une statue : créer une application multi-modale avec ElevenAgents

Rédigé par
Joe Reeve
Publié
Dernière mise à jour

ÉcouterÉcouter cet article

Photographiez une statue. Identifiez les personnages représentés. Puis échangez avec eux à la voix en temps réel, chaque personnage s’exprimant avec une voix distincte adaptée à son époque.

C’est ce que vous pouvez créer avec les API Voice Design et Agent d’ElevenLabs. Dans cet article, nous détaillons l’architecture d’une application web mobile qui associe vision par ordinateur et génération vocale pour transformer les monuments publics en expériences interactives. Tout ce qui suit est reproductible avec les API et les exemples de code ci-dessous.

Passez le tutoriel, créez l’application avec un seul prompt

L’ensemble de l’application ci-dessous a été créé à partir d’un seul prompt, testé avec succès en une seule tentative dans Cursor avec Claude Opus 4.5 (high), depuis un projet NextJS vide. Pour passer directement à la création de votre propre application, collez ceci dans votre éditeur :

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


Vous pouvez également utiliser les ElevenLabs Agent Skills plutôt que de créer un lien vers la documentation. Elles s’appuient sur la documentation et peuvent donner des résultats encore meilleurs.

La suite de cet article détaille ce que produit ce prompt.

Fonctionnement

Le pipeline comporte cinq étapes :

  1. Capturer une image
  2. Identifier l’œuvre et ses personnages (OpenAI)
  3. Rechercher son histoire (OpenAI)
  4. Générer des voix uniques pour chaque personnage (ElevenAPI)
  5. Démarrer une conversation vocale en temps réel via WebRTC (ElevenAgents)

Identifier la statue grâce à la vision

Lorsqu’un utilisateur photographie une statue, l’image est envoyée à un modèle OpenAI capable d’analyser des images. Un prompt système structuré extrait le nom de l’œuvre, son emplacement, son artiste, sa date et, surtout, une description vocale détaillée pour chaque personnage. Le prompt système inclut le format de sortie JSON attendu :

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

Pour une photographie de la statue de Boudica sur le pont de Westminster, à Londres, la réponse se présente ainsi :

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

Rédiger des descriptions vocales efficaces

La qualité de la description vocale détermine directement celle de la voix générée. Le guide de prompting Voice Design explique ce point en détail, mais les attributs essentiels à inclure sont : un indicateur de qualité audio (« Perfect audio quality. »), l’âge et le genre, le ton/timbre (grave, résonnant, rocailleux), un accent précis (« thick Celtic British accent » plutôt que simplement « British ») et le rythme. Des prompts plus descriptifs produisent des résultats plus précis : « a tired New Yorker in her 60s with a dry sense of humor » sera toujours plus efficace que « an older female voice ».

Quelques éléments à retenir du guide : utilisez « thick » plutôt que « strong » pour décrire l’intensité d’un accent, évitez les termes vagues comme « foreign » et, pour les personnages fictifs ou historiques, inspirez-vous d’accents réels (par exemple, « an ancient Celtic queen with a thick British accent, regal and commanding »).

Créer des voix de personnages avec Voice Design

L’API Voice Design génère de nouvelles voix synthétiques à partir de descriptions textuelles, sans échantillons vocaux ni clonage. Elle convient donc parfaitement aux personnages historiques dont aucun enregistrement audio n’existe.

Le processus se déroule en deux étapes.

Générer des aperçus

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

Le paramètre de texte est important. Un texte d’exemple plus long et adapté au personnage (plus de 50 mots) produit des résultats plus stables : adaptez le dialogue au personnage plutôt que d’utiliser une formule de salutation générique. Le guide de prompting Voice Design aborde ce sujet plus en détail.

Enregistrer la voix

Une fois les aperçus générés, sélectionnez-en un et créez une voix permanente :

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

Pour les statues comportant plusieurs personnages, les voix sont créées en parallèle. Générer les voix de cinq personnages prend environ le même temps que pour un seul :

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

Créer un Agent ElevenLabs à plusieurs voix

Une fois les voix créées, l’étape suivante consiste à configurer un Agent ElevenLabs capable d’alterner entre les voix des personnages en temps réel.

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

Changement de voix multiples

Le tableau supportedVoices indique à l’agent quelles voix sont disponibles. La plateforme Agents gère automatiquement le changement de voix : lorsque la réponse du LLM indique qu’un autre personnage parle, le moteur TTS achemine ce segment vers la voix appropriée.

Prompt engineering pour les conversations de groupe

Pour que plusieurs personnages donnent l’impression de former un véritable groupe, plutôt qu’un enchaînement de questions-réponses, le prompt doit être conçu avec soin :

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

Voix en temps réel via WebRTC

Dernier élément : la connexion côté client. Les Agents ElevenLabs prennent en charge WebRTC pour des conversations vocales à faible latence, sensiblement plus rapides que les connexions basées sur WebSocket, ce qui est essentiel pour des tours de parole naturels.

Côté serveur : obtenir un jeton de conversation

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

Côté client : démarrer la session

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

Le hook useConversation gère la capture audio, le streaming, la détection d’activité vocale et la lecture.

Approfondir les recherches avec la recherche web

Pour les utilisateurs qui souhaitent davantage de contexte historique avant de démarrer une conversation, vous pouvez ajouter un mode de recherche approfondie avec l’outil de recherche web d’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.`,
});

Ce que nous avons appris

Ce projet montre qu’en combinant différentes modalités de l’IA, texte, recherche, vision et audio, nous pouvons créer des expériences à la croisée du numérique et du monde réel. Les agents multimodaux offrent encore un vaste potentiel inexploré, que nous aimerions voir davantage de personnes explorer pour l’éducation, le travail et le divertissement.

Commencez à créer

Les API utilisées dans ce projet, Voice Design, ElevenAgents et OpenAI, sont toutes disponibles dès aujourd’hui.

Rédigé par

Joe fait partie de l'équipe Growth chez ElevenLabs, et se concentre sur l'aide aux développeurs pour tirer le meilleur parti des modèles audio de pointe d'ElevenLabs

Articles similaires

Créez avec l'audio IA de la plus haute qualité