AI Prompt Engineering · Lección

Agentes de voz y texto multimodales

Coordine las respuestas habladas con el texto en pantalla en sistemas de agentes de voz.

Lección 4 de 413 pasos

Agentes de voz y texto multimodales es una lección gratuita de AI Prompt Engineering en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Prompt Engineering, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Prompt Engineering incluye 4 lecciones en total.

Contextos de solo voz frente a contextos multimodales

Los agentes de IA de voz funcionan en dos contextos fundamentalmente distintos:

  • Solo voz: Altavoces inteligentes, IVR y llamadas telefónicas; los usuarios solo oyen audio y no tienen pantalla
  • Multimodal: Aplicaciones móviles, aplicaciones web y paneles de control de vehículos; los usuarios pueden ver una pantalla Y oír audio simultáneamente

Estos contextos requieren estrategias de respuesta diferentes. En un contexto de solo voz, todo debe decirse en voz alta. En uno multimodal, puede coordinar lo que se dice con lo que se muestra.

Diseño de prompts para respuestas de solo voz

En los contextos de solo voz, el LLM debe producir respuestas que funcionen completamente sin elementos visuales. Esto significa no hacer referencias a elementos de la pantalla, no usar listas que requieran un análisis visual y no incluir contenido que solo tenga sentido con formato.

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)

Coordinación del texto hablado y el texto en pantalla

En los contextos multimodales, puede dividir el contenido entre el audio y la pantalla. El audio se ocupa del contenido conversacional, emocional y dinámico. La pantalla se ocupa de la información densa, las tablas y el texto extenso.

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)

Estructuración de la salida del LLM para agentes de voz

En las aplicaciones de agentes de voz, indique en el prompt que el LLM devuelva una salida estructurada que pueda analizar y dirigir por separado al audio o a la pantalla. JSON o un formato de secciones definido funcionan bien.

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'))

Formato de transcripciones para agentes de voz

Las conversaciones de los agentes de voz deben registrarse como transcripciones para facilitar la depuración, el cumplimiento normativo y la revisión de calidad. Dé formato a las transcripciones para capturar la identidad del hablante, las marcas de tiempo y las salidas de audio y visuales.

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')

Gestión de errores de entrada de voz

Los agentes de voz deben gestionar con naturalidad los errores de reconocimiento del habla: palabras mal entendidas, enunciados incompletos o ruido de fondo. Indique en el prompt al LLM que detecte y resuelva las entradas ambiguas.

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'))

Gestión de turnos en conversaciones de voz

A diferencia del chat de texto, la voz requiere una gestión explícita de los turnos. El agente debe saber cuándo dejar de hablar y escuchar, y el usuario debe saber cuándo ha terminado el agente. Diseñe prompts que produzcan respuestas con señales naturales de finalización.

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])

Gestión de interrupciones

Los usuarios interrumpen a los agentes de voz. El sistema debe detectar las interrupciones (mediante VAD, detección de actividad de voz) e indicar al agente que reanude la conversación o la redirija con naturalidad. Indique en el prompt al LLM que acepte cambios de tema a mitad de la conversación.

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))

La pantalla como complemento de la voz

Cuando haya una pantalla disponible, diseñe el contenido que aparece en ella para complementar, no duplicar, el audio hablado. La pantalla se ocupa de los detalles; la voz, de la navegación y la interacción emocional.

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'
})

Consideraciones de accesibilidad

La IA de voz es en sí misma una función de accesibilidad para usuarios con dificultades visuales o motrices. Diseñe también su agente para ayudar a los usuarios que dependen de la voz como interfaz principal.

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])

Pruebas de las respuestas de los agentes de voz

Probar las respuestas de los agentes de voz requiere un enfoque diferente al de probar respuestas de texto. Debe evaluar tanto el audio hablado (prosodia, claridad y naturalidad) como el componente visual (completitud y formato). Una respuesta de texto que se lee bien puede sonar poco natural al pronunciarse.

Construya un proceso de pruebas que convierta las salidas del agente en audio mediante su motor de TTS y aplique después una comprobación de calidad automatizada: longitud de las frases, pronunciación de las abreviaturas, ausencia de elementos propios de Markdown y señales de gestión de turnos.

Comprobación de conocimientos: restricción de solo voz

En un contexto de solo voz (un altavoz inteligente sin pantalla), ¿qué tipo de respuesta del agente es MÁS adecuada?

Resumen: agentes de voz y texto multimodales

Los agentes de voz funcionan en dos modos: solo voz (sin pantalla) y multimodal (voz y pantalla). Las respuestas de solo voz deben evitar las referencias visuales y funcionar completamente como audio hablado, con indicaciones verbales para orientar al usuario. Las respuestas multimodales dividen el contenido: la voz se utiliza para resúmenes conversacionales y el tono emocional, y la pantalla, para los datos detallados y el texto extenso. Indique en los prompts a los LLM que devuelvan una salida estructurada (JSON con campos para voz y elementos visuales) a fin de facilitar su distribución. Diseñe la gestión de turnos con finales de respuesta claros, gestión natural de las interrupciones y compatibilidad explícita con la repetición. Tenga siempre en cuenta la accesibilidad: para los usuarios que más lo necesitan, la voz suele ser la interfaz principal.

Gratis para empezar

Aprende AI Prompt Engineering con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
53
Lecciones
199

Preguntas frecuentes

¿La lección «Agentes de voz y texto multimodales» es gratis?

Sí — el texto completo de «Agentes de voz y texto multimodales» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Prompt Engineering, actualiza a CoddyKit PRO. El curso de AI Prompt Engineering incluye 4 lecciones en total.

¿Qué aprenderé en «Agentes de voz y texto multimodales»?

Coordine las respuestas habladas con el texto en pantalla en sistemas de agentes de voz. Practicas AI Prompt Engineering con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar AI Prompt Engineering?

No se requiere experiencia previa. AI Prompt Engineering en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Agentes de voz y texto multimodales»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de AI Prompt Engineering?

Sí. Cada lección de AI Prompt Engineering incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Patrones de prompts TTS para un habla natural
  2. SSML y control de la prosodia
  3. Diseño de personalidades para IA de voz
  4. Agentes de voz y texto multimodales
← Volver a AI Prompt Engineering