Poznaj Eleven v4Poznaj Eleven v4, nasz najbardziej emocjonalny model.

Przejdź do treści

Porozmawiaj z posągiem: jak stworzyć wielomodalną aplikację z ElevenAgents

Opublikowano
Ostatnia aktualizacja

PosłuchajPosłuchaj tego artykułu

Zrób zdjęcie pomnika. Rozpoznaj przedstawione postacie. Potem porozmawiaj z nimi głosowo w czasie rzeczywistym — każda postać będzie mówić innym głosem pasującym do epoki.

To możesz stworzyć z API Voice Design i Agent od ElevenLabs. W tym artykule pokazujemy architekturę mobilnej aplikacji webowej, która łączy wizję komputerową z generowaniem głosu, by zmienić publiczne pomniki w interaktywne doświadczenia. Wszystko możesz odtworzyć za pomocą poniższych API i przykładów kodu.

Pomiń poradnik — zbuduj to jednym promptem

Cała poniższa aplikacja powstała na podstawie jednego promptu i została pomyślnie przetestowana w trybie one-shot w Cursor z Claude Opus 4.5 (high), zaczynając od pustego projektu NextJS. Jeśli chcesz przejść od razu do działania i stworzyć własną aplikację, wklej to do edytora:

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


Możesz też użyć ElevenLabs Agent Skills zamiast linkować do dokumentacji. Bazują one na dokumentacji i mogą dać jeszcze lepsze wyniki.

W dalszej części artykułu omawiamy, co tworzy ten prompt.

Jak to działa

Proces składa się z pięciu etapów:

  1. Zrób zdjęcie
  2. Rozpoznaj dzieło i jego postacie (OpenAI)
  3. Zbadaj historię (OpenAI)
  4. Wygeneruj unikalne głosy dla każdej postaci (ElevenAPI)
  5. Rozpocznij rozmowę głosową w czasie rzeczywistym przez WebRTC (ElevenAgents)

Rozpoznawanie pomnika za pomocą wizji

Gdy użytkownik fotografuje pomnik, obraz trafia do modelu OpenAI z obsługą wizji. Ustrukturyzowany prompt systemowy wyodrębnia nazwę dzieła, lokalizację, artystę, datę, a przede wszystkim szczegółowy opis głosu każdej postaci. Prompt systemowy zawiera oczekiwany format wyjściowy JSON:

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

W przypadku zdjęcia pomnika Boudiki na Westminster Bridge w Londynie odpowiedź wygląda tak:

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

Jak pisać skuteczne opisy głosu

Jakość opisu głosu bezpośrednio wpływa na jakość wygenerowanego głosu. Poradnik promptowania Voice Design szczegółowo omawia ten temat, ale kluczowe cechy to: znacznik jakości audio ("Perfect audio quality."), wiek i płeć, ton/barwa (deep, resonant, gravelly), precyzyjny akcent ("thick Celtic British accent" zamiast samego "British") oraz tempo. Bardziej szczegółowe prompty dają trafniejsze wyniki — "a tired New Yorker in her 60s with a dry sense of humor" zawsze sprawdzi się lepiej niż "an older female voice".

Warto pamiętać o kilku wskazówkach z poradnika: używaj „thick”, a nie „strong”, gdy opisujesz wyrazistość akcentu, unikaj nieprecyzyjnych określeń, takich jak „foreign”, a dla postaci fikcyjnych lub historycznych możesz podawać jako inspirację akcenty z rzeczywistego świata (np. „an ancient Celtic queen with a thick British accent, regal and commanding”).

Tworzenie głosów postaci z Voice Design

API Voice Design generuje nowe syntetyczne głosy na podstawie opisów tekstowych — nie potrzebujesz próbek głosu ani klonowania. Dzięki temu świetnie nadaje się do postaci historycznych, dla których nie istnieją nagrania źródłowe.

Proces ma dwa kroki.

Wygeneruj podglądy

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

Parametr tekstowy ma znaczenie. Dłuższy tekst próbny pasujący do postaci (ponad 50 słów) daje stabilniejsze wyniki — dopasuj dialog do postaci, zamiast używać ogólnego powitania. Poradnik promptowania Voice Design omawia to szerzej.

Zapisz głos

Gdy wygenerujesz podglądy, wybierz jeden i utwórz stały głos:

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

W przypadku pomników z wieloma postaciami głosy tworzą się równolegle. Wygenerowanie głosów pięciu postaci trwa mniej więcej tyle samo co jednego:

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

Tworzenie ElevenLabs Agent z wieloma głosami

Po utworzeniu głosów kolejnym krokiem jest skonfigurowanie ElevenLabs Agent , który może przełączać głosy postaci w czasie rzeczywistym.

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

Przełączanie wielu głosów

Tablica supportedVoices informuje agenta, które głosy są dostępne. Platforma Agents automatycznie obsługuje przełączanie głosów — gdy odpowiedź LLM wskazuje, że mówi inna postać, silnik TTS kieruje ten fragment do właściwego głosu.

Prompt engineering dla rozmów grupowych

Aby wiele postaci brzmiało jak prawdziwa grupa, a nie seria pytań i odpowiedzi, potrzebujesz przemyślanego projektu promptu:

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

Głos w czasie rzeczywistym przez WebRTC

Ostatnim elementem jest połączenie po stronie klienta. ElevenLabs Agents obsługuje WebRTC dla rozmów głosowych o niskim opóźnieniu — jest zauważalnie szybsze niż połączenia oparte na WebSocket, co ma znaczenie dla naturalnej wymiany zdań.

Po stronie serwera: pobierz token rozmowy

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

Po stronie klienta: rozpocznij sesję

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

Hook useConversation obsługuje przechwytywanie audio, streaming, wykrywanie aktywności głosowej i odtwarzanie.

Więcej kontekstu dzięki wyszukiwaniu w sieci

Dla użytkowników, którzy chcą poznać więcej kontekstu historycznego przed rozpoczęciem rozmowy, możesz dodać rozszerzony tryb badawczy z narzędziem wyszukiwania w sieci od 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.`,
});

Czego się nauczyliśmy

Ten projekt pokazuje, że łącząc różne modalności AI — tekst, badania, wizję i audio — możemy tworzyć doświadczenia łączące świat cyfrowy z rzeczywistym. Agenci multimodalni mają ogromny, wciąż niewykorzystany potencjał, który chcielibyśmy, by więcej osób odkrywało w nauce, pracy i zabawie.

Zacznij tworzyć

API użyte w tym projekcie — Voice Design, ElevenAgents i OpenAI — są już dostępne.

Autor

Joe pracuje w zespole Growth w ElevenLabs, skupiając się na pomaganiu deweloperom w pełnym wykorzystaniu nowatorskich modeli audio ElevenLabs

Podobne artykuły

Twórz z najwyższej jakości audio AI