0Pricing
AI Agents · Урок

Рабочие процессы агентов с аудио и текстом

Расшифровка → рассуждение → аудиоответ: полный конвейер.

«Рабочие процессы агентов с аудио и текстом» — бесплатный урок AI Agents на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.

Обзор конвейера агента для аудио и текста

Конвейер агента для аудио и текста преобразует устную речь в письменный текст и обратно. Канонический поток: входной аудиосигнал → транскрибирование Whisper → текстовый агент → выходной аудиосигнал TTS. Это позволяет создавать голосовых помощников, анализировать звонки, составлять краткие сведения о встречах и работать с интерфейсами без помощи рук.

Поддерживаемые аудиоформаты

OpenAI Whisper поддерживает следующие форматы: mp3, mp4, mpeg, mpga, m4a, wav, webm. Максимальный размер файла — 25 MB. Файлы большего размера необходимо разделить или сжать перед отправкой.

Для наилучшего качества расшифровки и минимального размера файла всегда записывайте или преобразуйте аудио в моно с частотой 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)

Расшифровка аудио с помощью Whisper

Конечная точка audio.transcriptions.create в OpenAI оборачивает Whisper. Передайте объект файла и имя модели, а также при необходимости подсказку с указанием языка (это ускоряет обработку и предотвращает ошибочное определение) и промпт (он подготавливает словарь для специализированных терминов).

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)

Расшифровка с временными метками

Для анализа встреч или диаризации говорящих запросите формат verbose_json. Он возвращает временные метки на уровне слов или сегментов, позволяя находить в аудио точные моменты для ссылок или вырезания фрагментов.

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

Обработка текста агентом

После расшифровки текст передаётся агенту на основе LLM как обычное текстовое сообщение. Включите системный промпт, задающий контекст: этот текст получен из устной реплики, поэтому в нём могут быть слова-паразиты и незаконченные предложения.

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

Преобразование текста в речь с помощью OpenAI TTS

Преобразуйте текстовый ответ агента обратно в речь с помощью API OpenAI TTS. Выберите голос (alloy, echo, fable, onyx, nova, shimmer) и модель (tts-1 для скорости, tts-1-hd для качества). Сохраните результат как файл mp3 или передавайте его напрямую потоком.

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

Потоковая выдача аудио

Для голосовых ответов в реальном времени передавайте аудио TTS фрагментами, не дожидаясь формирования всего файла. Вспомогательная функция OpenAI stream_to_file или ручной перебор фрагментов позволяет начать воспроизведение аудио, пока остальная часть ещё создаётся.

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

Разделение длинных аудиофайлов

Аудиофайлы размером более 25 MB необходимо разделить перед отправкой в Whisper. Используйте библиотеку pydub, чтобы разделить аудио по временным интервалам и обработать каждый фрагмент отдельно, а затем объединить расшифровки.

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)

Конвейер обработки аудио в реальном времени

Конвейер обработки в реальном времени захватывает входной сигнал с микрофона фрагментами, отправляет каждый фрагмент в Whisper по мере его поступления и передаёт результат TTS обратно потоком, создавая почти мгновенный цикл голосового разговора. Главная сложность — управление задержкой на каждом этапе.

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)

Определение языка и автоматическая маршрутизация

Whisper автоматически определяет язык речи. Используйте определённый язык, чтобы направить разговор подходящей персоне агента или задать язык TTS для ответа.

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)

Обработка фонового шума и низкого качества аудио

Низкое качество аудио снижает точность расшифровки. Практические меры: предварительно обработайте аудио с подавлением шума (библиотека noisereduce), добавьте специализированную лексику в prompt Whisper, проверьте уверенность расшифровки и попросите уточнить сказанное, если уверенность низкая.

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

Проверка знаний

Что делает параметр prompt Whisper?

Повторение: рабочие процессы агента для аудио и текста

Отлично! Главное:

  • Whisper: поддерживает mp3, wav, m4a и другие форматы; максимальный размер — 25 MB; большие файлы следует разделять с помощью pydub
  • Временные метки: используйте verbose_json с параметром timestamp_granularities для определения времени сегментов
  • TTS: OpenAI TTS предлагает несколько голосов; передавайте фрагменты потоком для уменьшения задержки
  • Определение языка: Whisper определяет язык автоматически; направляйте запрос к подходящему голосу или агенту на основе определённого языка
  • Конвейер обработки в реальном времени: буферизация аудиофрагментов → расшифровка → агент → потоковая передача TTS

Далее: понимание видео агентами — извлечение кадров и рассуждение о последовательности событий.

Часто задаваемые вопросы

Урок «Рабочие процессы агентов с аудио и текстом» бесплатный?

Да — полный текст урока «Рабочие процессы агентов с аудио и текстом» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.

Чему я научусь в уроке «Рабочие процессы агентов с аудио и текстом»?

Расшифровка → рассуждение → аудиоответ: полный конвейер. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Agents?

Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Рабочие процессы агентов с аудио и текстом»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Agents?

Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Агенты, работающие с изображениями и текстом: Claude Vision и GPT-4V
  2. Рабочие процессы агентов с аудио и текстом
  3. Понимание видео агентами
  4. Шаблоны кросс-модального рассуждения
← Назад к AI Agents