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].textSynteza 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 WebSocketDzielenie 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_jsonwraz ztimestamp_granularitiesdo 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
- Agenci obrazu i tekstu z Claude Vision i GPT-4V
- Przepływy pracy agentów audio i tekstu
- Rozumienie wideo przez agentów
- Wzorce rozumowania między modalnościami