0Pricing
AI Agents · Lección

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].text

Texto 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 WebSocket

Divisió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_json con timestamp_granularities para 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

  1. Agentes de imagen + texto con Claude Vision y GPT-4V
  2. Flujos de trabajo de agentes de audio + texto
  3. Comprensión de vídeo en agentes
  4. Patrones de razonamiento entre modalidades
← Volver a AI Agents