Flux de travail d’agents audio + texte
Transcription → raisonnement → réponse audio, de bout en bout.
Flux de travail d’agents audio + texte est une leçon AI Agents gratuite sur CoddyKit. Ceci est la leçon 2 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 Agents, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Agents comprend 4 leçons au total.
Présentation de la chaîne de traitement d'un agent audio-texte
La chaîne de traitement d'un agent audio-texte convertit le monde parlé en monde écrit, et inversement. Le flux classique est le suivant : entrée audio → transcription par Whisper → agent textuel → sortie audio TTS. Cela permet de créer des assistants vocaux, d'analyser des appels, de résumer des réunions et de proposer des interfaces mains libres.
Formats audio pris en charge
OpenAI Whisper accepte les formats suivants : mp3, mp4, mpeg, mpga, m4a, wav et webm. La taille maximale d’un fichier est de 25 MB. Pour les fichiers plus volumineux, vous devez diviser ou compresser l’audio avant de l’envoyer.
Pour obtenir la meilleure qualité de transcription et la taille de fichier la plus réduite, enregistrez ou convertissez toujours l’audio en mono à 16 kHz.
import os
SUPPORTED_FORMATS = {'.mp3', '.mp4', '.mpeg', '.mpga', '.m4a', '.wav', '.webm'}
MAX_FILE_SIZE_BYTES = 25 * 1024 * 1024 # 25 MB
def validate_audio_file(path: str) -> dict:
ext = os.path.splitext(path)[1].lower()
size = os.path.getsize(path) if os.path.exists(path) else 0
return {
'path': path,
'format_ok': ext in SUPPORTED_FORMATS,
'size_ok': size <= MAX_FILE_SIZE_BYTES,
'size_mb': round(size / 1024 / 1024, 2),
'extension': ext
}
# Usage:
info = validate_audio_file('meeting.wav')
print(info)Transcrire de l’audio avec Whisper
Le point de terminaison audio.transcriptions.create d’OpenAI encapsule Whisper. Transmettez l’objet fichier, le nom du modèle et, facultativement, une indication de langue (pour accélérer le traitement et éviter les erreurs de détection) ainsi qu’une instruction (pour préparer le vocabulaire correspondant aux termes propres à votre domaine).
from openai import OpenAI
client = OpenAI(api_key='YOUR_OPENAI_API_KEY')
def transcribe_audio(
audio_path: str,
language: str = 'en',
prompt: str = ''
) -> str:
with open(audio_path, 'rb') as audio_file:
transcript = client.audio.transcriptions.create(
model='whisper-1',
file=audio_file,
language=language,
prompt=prompt, # e.g. 'Python, NestJS, TypeScript, API'
response_format='text'
)
return transcript
text = transcribe_audio('user_query.mp3', language='en',
prompt='Kubernetes, microservices, Docker')
print('Transcription:', text)Transcription avec horodatage
Pour analyser une réunion ou effectuer une diarisation des locuteurs, demandez le format verbose_json. Celui-ci renvoie des horodatages au niveau des mots ou des segments, ce qui vous permet de localiser les moments exacts de l’audio à citer ou à découper.
def transcribe_with_timestamps(audio_path: str) -> dict:
from openai import OpenAI
client = OpenAI(api_key='YOUR_OPENAI_API_KEY')
with open(audio_path, 'rb') as f:
result = client.audio.transcriptions.create(
model='whisper-1',
file=f,
response_format='verbose_json',
timestamp_granularities=['segment']
)
# result.segments: list of {start, end, text}
segments = [
{'start': s.start, 'end': s.end, 'text': s.text}
for s in result.segments
]
return {'full_text': result.text, 'segments': segments}
# Example output structure:
# {'full_text': 'Hello team...', 'segments': [{'start': 0.0, 'end': 2.3, 'text': 'Hello team'}]}Traitement par l’agent de texte
Après la transcription, le texte est transmis à l’agent LLM sous la forme d’un message texte ordinaire. Incluez une instruction système qui définit le contexte : ce texte provient d’une intervention orale, vous devez donc vous attendre à trouver des mots de remplissage et des phrases incomplètes.
import anthropic
VOICE_AGENT_SYSTEM = (
'You are a helpful voice assistant. The user\'s message was transcribed from speech '
'and may contain filler words ("um", "uh"), false starts, or incomplete sentences. '
'Interpret the intent charitably and respond concisely in 1-3 sentences. '
'Your response will be converted to speech, so avoid markdown, lists, or code blocks.'
)
def voice_agent_respond(transcription: str) -> str:
client = anthropic.Anthropic(api_key='YOUR_ANTHROPIC_API_KEY')
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=256,
system=VOICE_AGENT_SYSTEM,
messages=[{'role': 'user', 'content': transcription}]
)
return response.content[0].textSynthèse vocale avec OpenAI TTS
Convertissez la réponse textuelle de l’agent en parole à l’aide de l’API TTS d’OpenAI. Choisissez une voix (alloy, echo, fable, onyx, nova ou shimmer) et un modèle (tts-1 pour la rapidité, tts-1-hd pour la qualité). Enregistrez le résultat dans un fichier mp3 ou diffusez-le directement.
from openai import OpenAI
from pathlib import Path
client = OpenAI(api_key='YOUR_OPENAI_API_KEY')
def text_to_speech(
text: str,
output_path: str = 'response.mp3',
voice: str = 'nova',
model: str = 'tts-1'
) -> str:
response = client.audio.speech.create(
model=model,
voice=voice,
input=text,
response_format='mp3'
)
Path(output_path).write_bytes(response.content)
print(f'TTS audio saved to {output_path}')
return output_path
# Full pipeline:
tts_file = text_to_speech(
'The weather in London is currently 15 degrees and partly cloudy.',
voice='nova'
)Sortie audio en continu
Pour les réponses vocales en temps réel, diffusez l’audio TTS par blocs au lieu d’attendre la génération du fichier complet. L’utilitaire stream_to_file d’OpenAI ou l’itération manuelle sur les blocs vous permet de commencer la lecture audio pendant que le reste est encore en cours de génération.
from openai import OpenAI
client = OpenAI(api_key='YOUR_OPENAI_API_KEY')
def stream_tts_to_file(text: str, output_path: str):
# OpenAI SDK streams the audio response
with client.audio.speech.with_streaming_response.create(
model='tts-1',
voice='nova',
input=text,
response_format='mp3'
) as response:
response.stream_to_file(output_path)
print(f'Streamed to {output_path}')
def stream_tts_chunks(text: str):
"""Yield raw audio bytes for piping to an audio player."""
with client.audio.speech.with_streaming_response.create(
model='tts-1',
voice='nova',
input=text
) as response:
for chunk in response.iter_bytes(chunk_size=4096):
yield chunk # pipe to audio player or WebSocketDiviser les fichiers audio longs
Les fichiers audio de plus de 25 MB doivent être divisés avant d’être envoyés à Whisper. Utilisez la bibliothèque pydub pour les diviser selon des intervalles de temps et traiter chaque bloc indépendamment, puis concaténez les transcriptions.
from pydub import AudioSegment
import os
def split_audio(
path: str,
chunk_minutes: int = 10
) -> list:
audio = AudioSegment.from_file(path)
chunk_ms = chunk_minutes * 60 * 1000
chunks = []
os.makedirs('audio_chunks', exist_ok=True)
for i, start in enumerate(range(0, len(audio), chunk_ms)):
chunk = audio[start:start + chunk_ms]
chunk_path = f'audio_chunks/chunk_{i:03d}.mp3'
chunk.export(chunk_path, format='mp3')
chunks.append(chunk_path)
return chunks
def transcribe_long_audio(path: str) -> str:
chunks = split_audio(path, chunk_minutes=10)
transcripts = []
for chunk_path in chunks:
text = transcribe_audio(chunk_path)
transcripts.append(text)
# Clean up chunks
for chunk_path in chunks:
os.remove(chunk_path)
return ' '.join(transcripts)Chaîne de traitement audio en temps réel
Une chaîne de traitement en temps réel capture l’entrée du microphone par blocs, envoie chaque bloc à Whisper dès sa réception et renvoie la sortie TTS en continu, créant ainsi une boucle de conversation vocale presque en temps réel. Le principal défi consiste à gérer la latence à chaque étape.
import asyncio
import time
async def realtime_voice_loop(mic_stream, speaker_stream, client):
"""
mic_stream: async generator yielding audio bytes
speaker_stream: async callable accepting audio bytes
"""
buffer = b''
BUFFER_THRESHOLD = 50 * 1024 # ~3 seconds at 16kHz mono mp3
async for audio_chunk in mic_stream:
buffer += audio_chunk
if len(buffer) >= BUFFER_THRESHOLD:
t0 = time.time()
# Save buffer to temp file
with open('/tmp/voice_chunk.mp3', 'wb') as f:
f.write(buffer)
buffer = b''
# Transcribe
text = transcribe_audio('/tmp/voice_chunk.mp3')
print(f'Transcribed ({time.time()-t0:.1f}s): {text}')
# Agent response
reply = voice_agent_respond(text)
# TTS and stream to speaker
for audio_bytes in stream_tts_chunks(reply):
await speaker_stream(audio_bytes)Détection de la langue et routage automatique
Whisper détecte automatiquement la langue parlée. Utilisez la langue détectée pour orienter la conversation vers la persona appropriée de l’agent ou pour définir la langue TTS de la réponse.
def transcribe_and_detect_language(audio_path: str) -> dict:
from openai import OpenAI
client = OpenAI(api_key='YOUR_OPENAI_API_KEY')
with open(audio_path, 'rb') as f:
result = client.audio.transcriptions.create(
model='whisper-1',
file=f,
response_format='verbose_json'
)
return {
'text': result.text,
'language': result.language, # e.g. 'english', 'spanish'
'duration': result.duration
}
LANGUAGE_VOICE_MAP = {
'english': 'nova',
'spanish': 'alloy',
'french': 'echo',
'german': 'fable'
}
def respond_in_detected_language(audio_path: str) -> str:
info = transcribe_and_detect_language(audio_path)
voice = LANGUAGE_VOICE_MAP.get(info['language'], 'nova')
reply = voice_agent_respond(info['text'])
return text_to_speech(reply, voice=voice)Gérer le bruit de fond et la mauvaise qualité audio
Un audio de mauvaise qualité réduit la précision de la transcription. Mesures pratiques : prétraitez l’audio avec une réduction du bruit (bibliothèque noisereduce), ajoutez le vocabulaire du domaine dans l’prompt de Whisper, validez le niveau de confiance de la transcription et demandez une clarification lorsque ce niveau est faible.
def transcribe_with_quality_check(
audio_path: str,
min_confidence_words: int = 3
) -> dict:
from openai import OpenAI
import string
client = OpenAI(api_key='YOUR_OPENAI_API_KEY')
with open(audio_path, 'rb') as f:
result = client.audio.transcriptions.create(
model='whisper-1',
file=f,
response_format='verbose_json',
timestamp_granularities=['word']
)
# Word count as a basic quality proxy
words = result.text.translate(
str.maketrans('', '', string.punctuation)
).split()
quality_ok = len(words) >= min_confidence_words
return {
'text': result.text,
'word_count': len(words),
'quality_ok': quality_ok,
'fallback_message': None if quality_ok else 'I could not hear you clearly. Please repeat.'
}Vérification des connaissances
Que fait le paramètre prompt de Whisper ?
Récapitulatif : flux de travail d’agents audio-texte
Excellent ! Points essentiels :
- Whisper : prend en charge mp3, wav, m4a, etc., avec une taille maximale de 25 MB ; divisez les fichiers volumineux avec pydub
- Horodatages : utilisez
verbose_jsonavectimestamp_granularitiespour obtenir le minutage des segments - TTS : TTS d’OpenAI avec plusieurs voix ; diffusez les blocs pour réduire la latence
- Détection de la langue : Whisper détecte automatiquement la langue ; orientez la requête vers la voix ou l’agent approprié selon la langue détectée
- Chaîne de traitement en temps réel : mettre en mémoire tampon les blocs audio → transcrire → agent → diffuser le TTS
Ensuite : la compréhension vidéo par les agents — extraction d’images et raisonnement temporel.
Questions Fréquemment Posées
La leçon « Flux de travail d’agents audio + texte » est-elle gratuite ?
Oui — le texte complet de « Flux de travail d’agents audio + texte » 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 Agents, passe à CoddyKit PRO. Le cours AI Agents comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Flux de travail d’agents audio + texte » ?
Transcription → raisonnement → réponse audio, de bout en bout. Tu pratiques AI Agents 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 Agents ?
Aucune expérience préalable n'est requise. AI Agents 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 2 sur 4.
Combien de temps prend la leçon « Flux de travail d’agents audio + texte » ?
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 Agents ?
Oui. Chaque leçon AI Agents 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
- Agents image + texte avec Claude Vision et GPT-4V
- Flux de travail d’agents audio + texte
- Compréhension vidéo par les agents
- Schémas de raisonnement multimodal