0Pricing
AI Prompt Engineering · Lekcja

Multimodalni agenci głosowi i tekstowi

Koordynowanie wypowiedzi głosowych z tekstem wyświetlanym na ekranie w systemach agentów głosowych.

Multimodalni agenci głosowi i tekstowi to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Prompt Engineering, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.

Konteksty wyłącznie głosowe a multimodalne

Agenci głosowej AI działają w dwóch zasadniczo różnych kontekstach:

  • Wyłącznie głosowy: Inteligentne głośniki, IVR i rozmowy telefoniczne — użytkownicy słyszą tylko dźwięk, bez ekranu
  • Multimodalny: Aplikacje mobilne, aplikacje internetowe i kokpity samochodowe — użytkownicy jednocześnie widzą ekran i słyszą dźwięk

Te konteksty wymagają różnych strategii odpowiadania. W kontekście wyłącznie głosowym wszystko musi zostać wypowiedziane. W kontekście multimodalnym można skoordynować treści wypowiadane z wyświetlanymi.

Projektowanie promptów dla odpowiedzi wyłącznie głosowych

W kontekstach wyłącznie głosowych LLM musi tworzyć odpowiedzi, które działają całkowicie bez elementów wizualnych. Oznacza to brak odwołań do elementów ekranu, brak list wymagających przeglądania wzrokowego oraz brak treści, które mają sens wyłącznie dzięki formatowaniu.

VOICE_ONLY_SYSTEM_PROMPT = (
    'You are a voice-only assistant. The user cannot see any screen.\n\n'
    'Requirements:\n'
    '- Never reference visual elements ("tap here", "see the chart", "the blue button")\n'
    '- Never use numbered or bulleted lists — use spoken sequences instead:\n'
    '  BAD: "1. First do X 2. Then do Y"\n'
    '  GOOD: "Start by doing X. When that is done, do Y."\n'
    '- Limit responses to what can be comfortably spoken in 30 seconds\n'
    '- Offer to give more detail rather than overwhelming the user\n'
    '- Use verbal signposts: "First", "Next", "Finally"\n'
    '- Read out all important data: codes, dates, amounts as full words'
)
print(VOICE_ONLY_SYSTEM_PROMPT)

Koordynowanie tekstu mówionego i wyświetlanego na ekranie

W kontekstach multimodalnych można podzielić treść między dźwięk i ekran. Dźwięk przekazuje treści konwersacyjne, emocjonalne i dynamiczne. Ekran służy do prezentowania dużej ilości informacji, tabel i dłuższych tekstów.

MULTIMODAL_SYSTEM_PROMPT = (
    'You are a multimodal assistant with both a voice and a screen.\n\n'
    'When responding, consider what each modality does best:\n\n'
    'SPEAK (voice):\n'
    '- Conversational summary, emotional tone, key highlights\n'
    '- Guide the user to look at the screen when needed:\n'
    '  "I have shown the details on screen. The key number to notice is..."\n\n'
    'SHOW (screen):\n'
    '- Detailed data, tables, long lists, code, maps, images\n\n'
    'When your response includes structured data, respond in this format:\n'
    'SPOKEN: <what to say aloud>\n'
    'VISUAL: <what to display on screen in markdown>'
)

# Example LLM output for multimodal response:
EXAMPLE_MULTIMODAL_OUTPUT = (
    'SPOKEN: Your top three expenses this month are food, transport, and entertainment. '
    'Food was the biggest, almost double your budget. Check the screen for the full breakdown.\n\n'
    'VISUAL: | Category | Budget | Actual | Difference |\n'
    '|---|---|---|---|\n'
    '| Food | $400 | $780 | -$380 |\n'
    '| Transport | $150 | $162 | -$12 |\n'
    '| Entertainment | $100 | $145 | -$45 |'
)
print(EXAMPLE_MULTIMODAL_OUTPUT)

Strukturyzowanie danych wyjściowych LLM dla agentów głosowych

W aplikacjach agentów głosowych należy poprosić LLM o zwracanie ustrukturyzowanych danych wyjściowych, które można analizować i osobno kierować do kanału audio lub na ekran. Dobrze sprawdza się JSON albo zdefiniowany format sekcji.

import anthropic
import json

client = anthropic.Anthropic(api_key='sk-ant-...')

VOICE_AGENT_SYSTEM = (
    'You are a financial voice assistant. For each response, return JSON with:\n'
    '{\n'
    '  "spoken": "Short spoken response (max 2 sentences)",\n'
    '  "visual_title": "Header for the on-screen card (optional)",\n'
    '  "visual_content": "Detailed content for screen (markdown, optional)",\n'
    '  "action_label": "Button label if action needed (optional)",\n'
    '  "action_type": "one of: none, confirm, navigate, call"\n'
    '}\n'
    'Return only the JSON object.'
)

def voice_agent_query(user_message):
    r = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=500,
        system=VOICE_AGENT_SYSTEM,
        messages=[{'role': 'user', 'content': user_message}]
    )
    try:
        response_data = json.loads(r.content[0].text)
        return response_data
    except json.JSONDecodeError:
        return {'spoken': r.content[0].text, 'visual_content': None}

result = voice_agent_query('What is my account balance?')
print('SPEAK:', result.get('spoken'))
print('SHOW:', result.get('visual_content', 'Nothing to display'))

Formatowanie transkrypcji agentów głosowych

Rozmowy agentów głosowych muszą być rejestrowane jako transkrypcje na potrzeby debugowania, zgodności z przepisami i kontroli jakości. Transkrypcje należy formatować tak, aby zawierały identyfikację mówcy, znaczniki czasu oraz zarówno dane wyjściowe audio, jak i wizualne.

import datetime
import json

class VoiceTranscript:
    def __init__(self, session_id):
        self.session_id = session_id
        self.turns = []

    def add_user_turn(self, text, audio_duration_ms=None):
        self.turns.append({
            'speaker': 'user',
            'timestamp': datetime.datetime.utcnow().isoformat(),
            'text': text,
            'audio_duration_ms': audio_duration_ms,
        })

    def add_agent_turn(self, spoken_text, visual_content=None, action=None):
        self.turns.append({
            'speaker': 'agent',
            'timestamp': datetime.datetime.utcnow().isoformat(),
            'spoken': spoken_text,
            'visual': visual_content,
            'action': action,
        })

    def save(self, filepath):
        with open(filepath, 'w') as f:
            json.dump({'session_id': self.session_id, 'turns': self.turns}, f, indent=2)
        print(f'Transcript saved: {filepath}')

# Usage
transcript = VoiceTranscript('session_001')
transcript.add_user_turn('What is my balance?', audio_duration_ms=1200)
transcript.add_agent_turn('Your balance is four hundred dollars.', visual_content='Balance: $400')
transcript.save('/tmp/session_001_transcript.json')

Obsługa błędów danych wejściowych głosowych

Agenci głosowi muszą sprawnie obsługiwać błędy rozpoznawania mowy — błędnie usłyszane słowa, niepełne wypowiedzi lub hałas w tle. Należy poprosić LLM o wykrywanie niejednoznacznych danych wejściowych i odzyskiwanie poprawnego toku rozmowy.

import anthropic

client = anthropic.Anthropic(api_key='sk-ant-...')

AMBIGUITY_HANDLING_SYSTEM = (
    'You are a voice assistant. User input comes from speech recognition '
    'and may contain transcription errors.\n\n'
    'When input seems unclear or ambiguous:\n'
    '1. State what you think the user might have meant.\n'
    '2. Ask a single clarifying yes/no question to confirm.\n'
    '3. Never ask more than one question at a time.\n'
    '4. Offer the most likely interpretation as the default.\n\n'
    'Example:\n'
    'Input: "transfer five hundred to john or gene" (ambiguous name)\n'
    'Response: "It sounds like you want to transfer five hundred dollars. '
    'Did you mean John Smith or Gene Lee?"'
)

def handle_voice_input(user_speech):
    r = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=200,
        system=AMBIGUITY_HANDLING_SYSTEM,
        messages=[{'role': 'user', 'content': user_speech}]
    )
    return r.content[0].text

print(handle_voice_input('pay the electric company bill thing'))

Zarządzanie kolejnością wypowiedzi w rozmowach głosowych

W przeciwieństwie do czatu tekstowego rozmowy głosowe wymagają jawnego zarządzania kolejnością wypowiedzi. Agent musi wiedzieć, kiedy przestać mówić i zacząć słuchać, a użytkownik musi wiedzieć, kiedy agent skończył. Należy projektować prompty tak, aby generowane odpowiedzi zawierały naturalne sygnały końca wypowiedzi.

TURN_TAKING_SYSTEM = (
    'You are a voice assistant. Responses must be designed for spoken conversation:\n\n'
    'End each response with exactly ONE of:\n'
    '- A direct question inviting the user to respond\n'
    '- A clear statement that the task is complete (e.g., "That is done.")\n'
    '- An explicit offer to continue (e.g., "Is there anything else?")\n\n'
    'Never end mid-thought. Never trail off. '
    'Avoid open-ended statements that leave the user unsure if they should speak.\n\n'
    'GOOD endings:\n'
    '- "The transfer is complete. Would you like a confirmation number?"\n'
    '- "That is all I have. Is there anything else?"\n'
    'BAD endings:\n'
    '- "You might also want to consider..." (open, unclear)\n'
    '- "The balance is..." (incomplete)'
)
print(TURN_TAKING_SYSTEM[:300])

Obsługa przerwań

Użytkownicy przerywają agentom głosowym. System musi wykrywać przerwania (za pomocą VAD — wykrywania aktywności głosowej) i instruować agenta, aby płynnie wznowił rozmowę lub przekierował ją na inny temat. Należy poprosić LLM o akceptowanie zmian tematu w trakcie rozmowy.

import anthropic

client = anthropic.Anthropic(api_key='sk-ant-...')

INTERRUPTION_SYSTEM = (
    'You are a voice assistant. Users may interrupt mid-conversation.\n\n'
    'If the user changes topic abruptly, smoothly acknowledge the change:\n'
    '"Of course. Let us switch to that." Then answer the new question.\n\n'
    'If the user says something like "wait", "stop", "hold on":\n'
    'Pause and say "Sure, take your time" and wait for them to continue.\n\n'
    'If the user repeats a question, they likely did not hear the answer:\n'
    'Say "Let me repeat that." and say it again more slowly.\n\n'
    'Never express frustration at interruptions or repetition.'
)

def handle_conversation(turns):
    """Handle multi-turn voice conversation with interruptions."""
    messages = []
    for speaker, text in turns:
        messages.append({'role': speaker, 'content': text})

    r = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=200,
        system=INTERRUPTION_SYSTEM,
        messages=messages
    )
    return r.content[0].text

# Simulate an interruption scenario
conversation = [
    ('user', 'What is my balance?'),
    ('assistant', 'Your checking account balance is four hundred dollars and—'),
    ('user', 'Actually wait, can you tell me my savings instead?'),
]
print(handle_conversation(conversation))

Ekran jako uzupełnienie głosu

Gdy dostępny jest ekran, należy zaprojektować wyświetlane treści tak, aby uzupełniały, a nie powielały wypowiedzi głosowych. Ekran powinien prezentować szczegóły, a głos obsługiwać nawigację i zaangażowanie emocjonalne.

def render_multimodal_response(agent_output):
    """
    Render a voice agent response to both TTS and screen components.
    agent_output: dict with 'spoken', 'visual_content', 'action_label'
    """
    # Route to TTS
    spoken = agent_output.get('spoken', '')
    if spoken:
        send_to_tts(spoken)  # Your TTS function
        print(f'[AUDIO] {spoken}')

    # Route to screen
    visual = agent_output.get('visual_content')
    if visual:
        render_card_on_screen(visual)  # Your UI function
        print(f'[SCREEN] {visual[:100]}')

    # Optional action button
    action_label = agent_output.get('action_label')
    if action_label:
        show_action_button(action_label)  # Your UI function
        print(f'[BUTTON] {action_label}')

def send_to_tts(text):
    print(f'TTS: {text}')

def render_card_on_screen(content):
    print(f'Screen card: {content[:50]}')

def show_action_button(label):
    print(f'Button: {label}')

# Test it
render_multimodal_response({
    'spoken': 'I found three flights to New York.',
    'visual_content': '| Flight | Departs | Price |\n|---|---|---|\n| AA101 | 08:00 | $299 |',
    'action_label': 'Book cheapest'
})

Kwestie dostępności

Głosowa AI sama w sobie jest funkcją dostępności dla użytkowników z niepełnosprawnościami wzroku lub trudnościami motorycznymi. Agenta należy zaprojektować tak, aby wspierał również użytkowników, którzy korzystają z głosu jako podstawowego interfejsu.

ACCESSIBILITY_VOICE_SYSTEM = (
    'This voice assistant serves users who may be using voice as their '
    'primary access method due to disability or preference.\n\n'
    'Guidelines:\n'
    '- Never require the user to see a screen to complete a task.\n'
    '- Read out all information that matters, including confirmation codes, '
    'totals, and status messages.\n'
    '- Offer to repeat any information: '
    '"I can repeat that if you would like."\n'
    '- Describe any actions you took: '
    '"I have sent the confirmation to your email."\n'
    '- Accept multiple phrasings for the same command — users phrase '
    'voice commands inconsistently.\n'
    '- Confirm all destructive or financial actions before executing:\n'
    '  "Just to confirm: you want to transfer $500 to John. Is that right?"'
)
print(ACCESSIBILITY_VOICE_SYSTEM[:300])

Testowanie odpowiedzi agenta głosowego

Testowanie odpowiedzi agenta głosowego wymaga innego podejścia niż testowanie odpowiedzi tekstowych. Należy ocenić zarówno wypowiadany dźwięk (prozodię, wyrazistość i naturalność), jak i komponent wizualny (kompletność i formatowanie). Odpowiedź tekstowa, która dobrze wygląda w piśmie, może brzmieć niezręcznie po wypowiedzeniu.

Należy zbudować potok testowy, który konwertuje dane wyjściowe agenta na dźwięk za pomocą używanego silnika TTS, a następnie stosuje automatyczną kontrolę jakości: długości zdań, wymowy skrótów, braku artefaktów Markdown oraz sygnałów informujących o kolejności wypowiedzi.

Sprawdzenie wiedzy: ograniczenie trybu wyłącznie głosowego

W kontekście wyłącznie głosowym (inteligentny głośnik bez ekranu) jaki rodzaj odpowiedzi agenta jest NAJODPOWIEDNIEJSZY?

Podsumowanie: multimodalni agenci głosowi i tekstowi

Agenci głosowi działają w dwóch trybach: wyłącznie głosowym (bez ekranu) i multimodalnym (głos oraz ekran). Odpowiedzi wyłącznie głosowe muszą unikać odwołań wizualnych i działać całkowicie jako wypowiadany dźwięk, z użyciem słownych wskazówek porządkujących treść. W odpowiedziach multimodalnych treść jest dzielona: głos służy do konwersacyjnych podsumowań i przekazywania tonu emocjonalnego, a ekran do prezentowania szczegółowych danych i dłuższych tekstów. LLM należy instruować, aby zwracał ustrukturyzowane dane wyjściowe (JSON z polami spoken i visual), co ułatwia ich kierowanie do odpowiednich kanałów. Należy projektować interakcje z uwzględnieniem kolejności wypowiedzi, wyraźnych zakończeń odpowiedzi, płynnej obsługi przerwań i jawnej obsługi próśb o powtórzenie. Zawsze należy uwzględniać dostępność — głos jest często podstawowym interfejsem dla użytkowników, którzy najbardziej go potrzebują.

Często zadawane pytania

Czy lekcja „Multimodalni agenci głosowi i tekstowi” jest bezpłatna?

Tak — pełny tekst „Multimodalni agenci głosowi i tekstowi” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Prompt Engineering, przejdź na CoddyKit PRO. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.

Co nauczysz się w „Multimodalni agenci głosowi i tekstowi”?

Koordynowanie wypowiedzi głosowych z tekstem wyświetlanym na ekranie w systemach agentów głosowych. Ćwiczysz AI Prompt Engineering z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć AI Prompt Engineering?

Nie wymagamy żadnego doświadczenia. AI Prompt Engineering w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Multimodalni agenci głosowi i tekstowi”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji AI Prompt Engineering?

Tak. Każda lekcja AI Prompt Engineering zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Wzorce promptów TTS dla naturalnej mowy
  2. SSML i kontrola prozodii
  3. Projektowanie person głosowych AI
  4. Multimodalni agenci głosowi i tekstowi
← Powrót do AI Prompt Engineering