0Pricing
AI Agents · Lekcja

Przepływy pracy agentów audio i tekstu

Potoki transkrypcji → rozumowania → odpowiedzi audio od początku do końca.

Przepływy pracy agentów audio i tekstu to bezpłatna lekcja AI Agents na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Agents, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Agents zawiera 4 lekcji w sumie.

Przegląd potoku agenta audio-tekstowego

Potok agenta audio-tekstowego umożliwia konwersję między światem mowy i tekstu. Kanoniczny przebieg to: dźwięk wejściowy → transkrypcja Whisper → agent tekstowy → dźwięk TTS na wyjściu. Umożliwia to tworzenie asystentów głosowych, analizę rozmów, podsumowywanie spotkań i obsługę interfejsów bez użycia rąk.

Obsługiwane formaty audio

OpenAI Whisper obsługuje formaty: mp3, mp4, mpeg, mpga, m4a, wav, webm. Maksymalny rozmiar pliku wynosi 25 MB. Większe pliki należy podzielić lub skompresować przed wysłaniem.

Aby uzyskać najlepszą jakość transkrypcji i najmniejszy rozmiar pliku, należy zawsze nagrywać lub konwertować dźwięk do formatu mono z częstotliwością 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)

Transkrypcja audio za pomocą Whisper

Endpoint audio.transcriptions.create firmy OpenAI udostępnia interfejs do modelu Whisper. Należy przekazać obiekt pliku, nazwę modelu oraz opcjonalnie wskazówkę dotyczącą języka (przyspiesza działanie i zapobiega błędnemu wykryciu) i prompt (wstępnie ukierunkowuje słownictwo na terminy charakterystyczne dla danej dziedziny).

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)

Transkrypcja ze znacznikami czasu

W przypadku analizy spotkań lub diarizacji mówców należy zażądać formatu verbose_json. Zwraca on znaczniki czasu na poziomie słów lub segmentów, dzięki czemu można wskazać dokładne momenty w nagraniu do wykorzystania w odwołaniach lub przycinania.

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

Przetwarzanie tekstu przez agenta

Po transkrypcji tekst jest przekazywany do agenta LLM jako zwykła wiadomość tekstowa. Należy dołączyć prompt systemowy określający kontekst: tekst pochodzi z wypowiedzi ustnej, więc należy spodziewać się słów wypełniających i niepełnych zdań.

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

Synteza mowy za pomocą OpenAI TTS

Odpowiedź tekstową agenta należy ponownie przekształcić na mowę za pomocą API TTS firmy OpenAI. Należy wybrać głos (alloy, echo, fable, onyx, nova, shimmer) oraz model (tts-1 zapewnia większą szybkość, a tts-1-hd lepszą jakość). Wynik można zapisać jako plik mp3 lub przesyłać strumieniowo bezpośrednio.

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

Strumieniowe przesyłanie dźwięku

Aby uzyskać odpowiedzi głosowe w czasie rzeczywistym, należy przesyłać dźwięk TTS w fragmentach zamiast czekać na wygenerowanie całego pliku. Funkcja pomocnicza OpenAI stream_to_file lub ręczna iteracja po fragmentach pozwala rozpocząć odtwarzanie dźwięku, gdy reszta jest jeszcze generowana.

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

Dzielenie długich plików audio

Pliki audio większe niż 25 MB należy podzielić przed wysłaniem do Whisper. Należy użyć biblioteki pydub do podziału według przedziałów czasowych, niezależnie przetworzyć każdy fragment, a następnie połączyć transkrypcje.

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)

Potok audio działający w czasie rzeczywistym

Potok działający w czasie rzeczywistym przechwytuje dane z mikrofonu w postaci fragmentów, wysyła każdy fragment do Whisper po jego otrzymaniu i przesyła z powrotem wynik TTS — tworząc niemal rzeczywistą pętlę rozmowy głosowej. Największym wyzwaniem jest zarządzanie opóźnieniami na każdym etapie.

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)

Wykrywanie języka i automatyczne kierowanie

Whisper automatycznie wykrywa język wypowiedzi. Wykryty język można wykorzystać do skierowania rozmowy do właściwej persony agenta lub do ustawienia języka TTS dla odpowiedzi.

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)

Obsługa szumu tła i nagrań niskiej jakości

Niska jakość dźwięku pogarsza dokładność transkrypcji. Praktyczne sposoby ograniczenia tego problemu obejmują wstępne przetwarzanie z redukcją szumów (biblioteka noisereduce), dodanie słownictwa dziedzinowego do parametru prompt Whisper, weryfikację pewności transkrypcji oraz prośbę o doprecyzowanie, gdy pewność jest niska.

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

Sprawdzenie wiedzy

Do czego służy parametr prompt modelu Whisper?

Podsumowanie: potoki agentów audio-tekstowych

Doskonale! Najważniejsze informacje:

  • Whisper: obsługuje formaty mp3/wav/m4a i inne, maksymalny rozmiar pliku wynosi 25 MB; duże pliki należy dzielić za pomocą pydub
  • Znaczniki czasu: należy użyć verbose_json wraz z timestamp_granularities do określania czasu segmentów
  • TTS: OpenAI TTS oferuje różne głosy; przesyłanie fragmentów strumieniowo zmniejsza opóźnienie
  • Wykrywanie języka: Whisper wykrywa język automatycznie; na podstawie wykrytego języka należy wybrać właściwy głos lub agenta
  • Potok działający w czasie rzeczywistym: buforowanie fragmentów audio → transkrypcja → agent → strumieniowe przesyłanie TTS

Następny temat: rozumienie wideo przez agentów — ekstrakcja klatek i rozumowanie temporalne.

Często zadawane pytania

Czy lekcja „Przepływy pracy agentów audio i tekstu” jest bezpłatna?

Tak — pełny tekst „Przepływy pracy agentów audio i tekstu” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Agents, przejdź na CoddyKit PRO. Kurs AI Agents zawiera 4 lekcji w sumie.

Co nauczysz się w „Przepływy pracy agentów audio i tekstu”?

Potoki transkrypcji → rozumowania → odpowiedzi audio od początku do końca. Ćwiczysz AI Agents z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć AI Agents?

Nie wymagamy żadnego doświadczenia. AI Agents w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Przepływy pracy agentów audio i tekstu”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji AI Agents?

Tak. Każda lekcja AI Agents zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Agenci obrazu i tekstu z Claude Vision i GPT-4V
  2. Przepływy pracy agentów audio i tekstu
  3. Rozumienie wideo przez agentów
  4. Wzorce rozumowania między modalnościami
← Powrót do AI Agents