Flujos de trabajo de agentes de audio + texto
Tuberías completas de transcripción → razonamiento → respuesta de audio.
Flujos de trabajo de agentes de audio + texto es una lección gratuita de AI Agents en CoddyKit. Esta es la lección 2 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 Agents, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Agents incluye 4 lecciones en total.
Descripción general de una canalización de agentes de audio y texto
Una canalización de agentes de audio y texto convierte contenido entre el mundo hablado y el escrito. El flujo canónico es: entrada de audio → transcripción con Whisper → agente de texto → salida de audio mediante TTS. Esto permite crear asistentes de voz, analizar llamadas, resumir reuniones y ofrecer interfaces manos libres.
Formatos de audio compatibles
OpenAI Whisper acepta: mp3, mp4, mpeg, mpga, m4a, wav y webm. El tamaño máximo de archivo es de 25 MB. Para archivos más grandes, debe dividir o comprimir el audio antes de enviarlo.
Para obtener la mejor calidad de transcripción y el menor tamaño de archivo, grabe o convierta siempre el audio a mono de 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)Transcripción de audio con Whisper
El endpoint audio.transcriptions.create de OpenAI encapsula Whisper. Pase el objeto de archivo y el nombre del modelo y, opcionalmente, una indicación del idioma (acelera el procesamiento y evita detecciones incorrectas) y un prompt (prepara el vocabulario para términos específicos del dominio).
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)Transcripción con marcas de tiempo
Para analizar reuniones o realizar una diarización de hablantes, solicite el formato verbose_json. Este formato devuelve marcas de tiempo por palabra o segmento, lo que permite localizar momentos exactos del audio para consultarlos o recortarlos.
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'}]}Procesamiento del agente de texto
Después de la transcripción, el texto pasa por el agente LLM como un mensaje de texto normal. Incluya un prompt del sistema que establezca el contexto: este texto procede de una intervención hablada, por lo que puede contener palabras de relleno y oraciones incompletas.
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].textTexto a voz con OpenAI TTS
Convierta la respuesta de texto del agente de nuevo en voz mediante la API TTS de OpenAI. Elija una voz (alloy, echo, fable, onyx, nova, shimmer) y un modelo (tts-1 para mayor velocidad, tts-1-hd para mayor calidad). Guarde el resultado como archivo mp3 o transmítalo directamente.
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'
)Transmisión de la salida de audio
Para obtener respuestas de voz en tiempo real, transmita el audio TTS en fragmentos en lugar de esperar al archivo completo. El helper stream_to_file de OpenAI o la iteración manual de fragmentos le permite comenzar a reproducir el audio mientras el resto aún se está generando.
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 WebSocketDivisión de archivos de audio largos
Los archivos de audio de más de 25 MB deben dividirse antes de enviarlos a Whisper. Utilice la biblioteca pydub para dividirlos por intervalos de tiempo y procesar cada fragmento de forma independiente; después, concatene las transcripciones.
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)Pipeline de audio en tiempo real
Un pipeline en tiempo real captura la entrada del micrófono en fragmentos, envía cada fragmento a Whisper a medida que llega y transmite de vuelta la salida TTS, creando un ciclo de conversación de voz casi en tiempo real. El principal desafío es gestionar la latencia en cada etapa.
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)Detección de idioma y enrutamiento automático
Whisper detecta automáticamente el idioma hablado. Utilice el idioma detectado para dirigir la conversación a la persona adecuada del agente o para establecer el idioma del TTS en la respuesta.
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)Gestión del ruido de fondo y del audio de baja calidad
El audio de baja calidad reduce la precisión de la transcripción. Algunas medidas prácticas son preprocesarlo con reducción de ruido (la biblioteca noisereduce), añadir vocabulario del dominio en el prompt de Whisper, validar la confianza de la transcripción y solicitar aclaraciones cuando la confianza sea baja.
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.'
}Comprobación de conocimientos
¿Qué función cumple el parámetro prompt de Whisper?
Repaso: flujos de trabajo de agentes de audio y texto
¡Excelente! Estos son los puntos clave:
- Whisper: admite mp3/wav/m4a, entre otros; el máximo es de 25 MB. Divida los archivos grandes con pydub
- Marcas de tiempo: utilice
verbose_jsoncontimestamp_granularitiespara obtener la temporización de los segmentos - TTS: OpenAI TTS ofrece varias voces; transmita fragmentos para reducir la latencia
- Detección de idioma: Whisper lo detecta automáticamente; dirija la solicitud a la voz o al agente correctos según el idioma detectado
- Pipeline en tiempo real: almacenar en búfer los fragmentos de audio → transcribir → agente → transmitir TTS
Siguiente tema: comprensión de vídeo en agentes: extracción de fotogramas y razonamiento temporal.
Preguntas frecuentes
¿La lección «Flujos de trabajo de agentes de audio + texto» es gratis?
Sí — el texto completo de «Flujos de trabajo de agentes de audio + texto» 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 Agents, actualiza a CoddyKit PRO. El curso de AI Agents incluye 4 lecciones en total.
¿Qué aprenderé en «Flujos de trabajo de agentes de audio + texto»?
Tuberías completas de transcripción → razonamiento → respuesta de audio. Practicas AI Agents 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 Agents?
No se requiere experiencia previa. AI Agents 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 2 de 4.
¿Cuánto tiempo toma la lección «Flujos de trabajo de agentes de audio + texto»?
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 Agents?
Sí. Cada lección de AI Agents 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
- Agentes de imagen + texto con Claude Vision y GPT-4V
- Flujos de trabajo de agentes de audio + texto
- Comprensión de vídeo en agentes
- Patrones de razonamiento entre modalidades