Agents vocaux et textuels multimodaux
Coordonnez les réponses vocales avec le texte affiché à l’écran dans les systèmes d’agents vocaux.
Agents vocaux et textuels multimodaux est une leçon AI Prompt Engineering gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Prompt Engineering, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Prompt Engineering comprend 4 leçons au total.
Contextes uniquement vocaux et multimodaux
Les agents d’IA vocale fonctionnent dans deux contextes fondamentalement différents :
- Uniquement vocal : Enceintes connectées, systèmes téléphoniques IVR et appels téléphoniques — les utilisateurs n’entendent que l’audio et ne disposent d’aucun écran
- Multimodal : Applications mobiles, applications web et tableaux de bord automobiles — les utilisateurs peuvent voir un écran AND entendre de l’audio simultanément
Ces contextes nécessitent des stratégies de réponse différentes. En mode uniquement vocal, tout doit être prononcé. En mode multimodal, vous pouvez coordonner ce qui est prononcé et ce qui est affiché.
Concevoir des invites pour des réponses uniquement vocales
Dans les contextes uniquement vocaux, le LLM doit produire des réponses qui fonctionnent entièrement sans éléments visuels. Cela signifie qu’il ne doit faire aucune référence aux éléments affichés à l’écran, proposer de listes nécessitant une lecture visuelle ni fournir de contenu qui n’a de sens qu’avec une mise en forme.
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)Coordonner le texte parlé et affiché à l’écran
Dans les contextes multimodaux, vous pouvez répartir le contenu entre l’audio et l’écran. L’audio prend en charge le contenu conversationnel, émotionnel et dynamique. L’écran prend en charge les informations denses, les tableaux et les textes longs.
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)Structurer la sortie de LLM pour les agents vocaux
Pour les applications d’agents vocaux, demandez au LLM de renvoyer une sortie structurée que vous pouvez analyser et acheminer séparément vers l’audio ou l’écran. JSON ou un format de sections défini fonctionne 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'))Formater les transcriptions des agents vocaux
Les conversations avec des agents vocaux doivent être enregistrées sous forme de transcriptions pour le débogage, la conformité et l’examen de la qualité. Formatez les transcriptions de manière à saisir l’identité du locuteur, les horodatages ainsi que les sorties audio et visuelles (visual).
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')Gérer les erreurs d’entrée vocale
Les agents vocaux doivent gérer avec élégance les erreurs de reconnaissance vocale — mots mal compris, énoncés incomplets ou bruit de fond. Demandez au LLM de détecter les entrées ambiguës et de les corriger.
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'))Gestion des tours de parole dans les conversations vocales
À la différence du chat textuel, la voix nécessite une gestion explicite des tours de parole. L’agent doit savoir quand cesser de parler et écouter, et l’utilisateur doit savoir quand l’agent a fini. Concevez des invites qui produisent des réponses avec des signaux de fin naturels.
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])Gestion des interruptions
Les utilisateurs interrompent les agents vocaux. Le système doit détecter les interruptions (au moyen de VAD — détection d’activité vocale) et demander à l’agent de reprendre ou de réorienter la conversation avec naturel. Demandez au LLM d’accepter les changements de sujet en cours de conversation.
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))Contenu à l’écran complémentaire à la voix
Lorsqu’un écran est disponible, concevez le contenu affiché à l’écran pour compléter (et non dupliquer) l’audio prononcé. L’écran gère les détails ; la voix gère la navigation et l’engagement émotionnel.
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'
})Considérations d’accessibilité
L’IA vocale constitue en elle-même une fonctionnalité d’accessibilité pour les utilisateurs ayant une déficience visuelle ou des difficultés motrices. Concevez également votre agent pour les utilisateurs qui dépendent de la voix comme interface principale.
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])Tester les réponses d’un agent vocal
Tester les réponses d’un agent vocal exige une approche différente de celle utilisée pour tester des réponses textuelles. Vous devez évaluer à la fois l’audio parlé (prosodie, clarté et naturel) et le composant visuel (exhaustivité et mise en forme). Une réponse textuelle qui se lit bien peut sembler maladroite lorsqu’elle est prononcée.
Construisez une chaîne de test qui convertit les sorties de l’agent en audio à l’aide de votre moteur TTS, puis applique un contrôle qualité automatisé : longueur des phrases, prononciation des abréviations, absence d’artefacts de mise en forme et signaux de tours de parole.
Vérification des connaissances : contrainte du mode uniquement vocal
Dans un contexte uniquement vocal (une enceinte connectée sans écran), quel type de réponse d’agent est le MOST approprié ?
Récapitulatif : agents vocaux et textuels multimodaux
Les agents vocaux fonctionnent selon deux modes : uniquement vocal (sans écran) et multimodal (voix + écran). Les réponses uniquement vocales doivent éviter les références visuelles et fonctionner entièrement comme un contenu audio parlé, avec des repères verbaux. Les réponses multimodales répartissent le contenu : la voix présente les synthèses conversationnelles et le ton émotionnel, tandis que l’écran affiche les données détaillées et les textes longs. Demandez aux LLM de renvoyer une sortie structurée (JSON avec des champs « parlé » et « visual ») pour faciliter l’acheminement. Concevez la gestion des tours de parole avec des fins de réponse claires, une gestion élégante des interruptions et une possibilité explicite de répétition. Tenez toujours compte de l’accessibilité : la voix constitue souvent une interface principale pour les utilisateurs qui en ont le plus besoin.
Questions Fréquemment Posées
La leçon « Agents vocaux et textuels multimodaux » est-elle gratuite ?
Oui — le texte complet de « Agents vocaux et textuels multimodaux » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Prompt Engineering, passe à CoddyKit PRO. Le cours AI Prompt Engineering comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Agents vocaux et textuels multimodaux » ?
Coordonnez les réponses vocales avec le texte affiché à l’écran dans les systèmes d’agents vocaux. Tu pratiques AI Prompt Engineering avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer AI Prompt Engineering ?
Aucune expérience préalable n'est requise. AI Prompt Engineering sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Agents vocaux et textuels multimodaux » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon AI Prompt Engineering ?
Oui. Chaque leçon AI Prompt Engineering inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Schémas de prompts TTS pour une parole naturelle
- SSML et contrôle de la prosodie
- Concevoir la personnalité d’une IA vocale
- Agents vocaux et textuels multimodaux