Aliran Kerja Ejen Audio + Teks
Saluran transkripsi → penaakulan → respons audio dari hujung ke hujung.
Aliran Kerja Ejen Audio + Teks ialah pelajaran Ejen AI percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Ejen AI, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Ejen AI merangkumi sejumlah 4 pelajaran.
Gambaran Keseluruhan Saluran Paip Ejen Audio-Teks
Saluran paip ejen audio-teks menukar antara dunia pertuturan dan tulisan. Aliran piawainya ialah: audio masuk → transkripsi Whisper → ejen teks → audio TTS keluar. Ini membolehkan pembantu suara, analisis panggilan, rumusan mesyuarat dan antara muka tanpa menggunakan tangan.
Format Audio yang Disokong
OpenAI Whisper menerima: mp3, mp4, mpeg, mpga, m4a, wav, webm. Saiz maksimum fail ialah 25 MB. Untuk fail yang lebih besar, anda mesti membahagikan atau memampatkan audio sebelum menghantarnya.
Sentiasa rakam atau tukarkan audio kepada mono 16 kHz untuk mendapatkan kualiti transkripsi terbaik dan saiz fail paling kecil.
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)Transkripsi Audio dengan Whisper
Titik akhir audio.transcriptions.create OpenAI menggunakan Whisper. Hantar objek fail, nama model dan, secara pilihan, petunjuk bahasa (lebih pantas serta mengelakkan pengesanan yang tersilap) dan gesaan (menyediakan kosa kata awal untuk istilah khusus domain).
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)Transkripsi dengan Cap Masa
Untuk analisis mesyuarat atau pemisahan penutur, minta format verbose_json. Format ini mengembalikan cap masa pada peringkat perkataan atau segmen, yang membolehkan anda mencari detik tepat dalam audio untuk rujukan atau pemotongan.
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'}]}Pemprosesan oleh Ejen Teks
Selepas transkripsi, teks dihantar melalui ejen LLM sebagai mesej teks biasa. Sertakan gesaan sistem yang menetapkan konteks: teks ini berasal daripada ujaran lisan, jadi jangkakan kata pengisi dan ayat yang tidak lengkap.
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].textTeks kepada Pertuturan dengan OpenAI TTS
Tukarkan respons teks ejen kembali kepada pertuturan menggunakan API TTS OpenAI. Pilih suara (alloy, echo, fable, onyx, nova, shimmer) dan model (tts-1 untuk kelajuan, tts-1-hd untuk kualiti). Simpan hasilnya sebagai fail mp3 atau strimkan terus.
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'
)Penstriman Keluaran Audio
Untuk respons suara masa nyata, strimkan audio TTS dalam bahagian-bahagian kecil dan bukannya menunggu fail penuh. Pembantu OpenAI stream_to_file atau lelaran bahagian secara manual membolehkan anda mula memainkan audio sementara selebihnya masih dijana.
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 WebSocketMembahagikan Fail Audio Panjang
Fail audio yang lebih besar daripada 25 MB mesti dibahagikan sebelum dihantar kepada Whisper. Gunakan pustaka pydub untuk membahagikannya mengikut selang masa dan memproses setiap bahagian secara berasingan, kemudian gabungkan transkripsi tersebut.
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)Aliran Kerja Audio Masa Nyata
Aliran kerja masa nyata menangkap masukan mikrofon dalam bahagian-bahagian kecil, menghantar setiap bahagian kepada Whisper sebaik sahaja diterima dan menstrimkan keluaran TTS kembali — lalu menghasilkan gelung perbualan suara yang hampir masa nyata. Cabaran utamanya ialah mengurus kependaman pada setiap peringkat.
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)Pengesanan Bahasa dan Penghalaan Automatik
Whisper mengesan bahasa yang dituturkan secara automatik. Gunakan bahasa yang dikesan untuk menghalakan perbualan kepada persona ejen yang betul atau menetapkan bahasa TTS untuk respons tersebut.
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)Mengendalikan Hingar Latar Belakang dan Audio Berkualiti Rendah
Audio berkualiti rendah menjejaskan ketepatan transkripsi. Langkah mitigasi yang praktikal termasuk praproses dengan pengurangan hingar (pustaka noisereduce), menambahkan kosa kata domain dalam prompt Whisper, mengesahkan keyakinan transkripsi dan meminta penjelasan apabila keyakinan rendah.
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.'
}Semakan Pengetahuan
Apakah fungsi parameter Whisper prompt?
Kesimpulan: Aliran Kerja Ejen Audio-Teks
Cemerlang! Perkara utama:
- Whisper: menyokong mp3/wav/m4a dan sebagainya, maksimum 25 MB; bahagikan fail besar dengan pydub
- Cap masa: gunakan
verbose_jsondengantimestamp_granularitiesuntuk pemasaan segmen - TTS: OpenAI TTS dengan pilihan suara; strimkan bahagian-bahagian kecil untuk kependaman rendah
- Pengesanan bahasa: Whisper mengesan bahasa secara automatik; halakan kepada suara atau ejen yang betul berdasarkan bahasa yang dikesan
- Aliran kerja masa nyata: tampan bahagian audio → transkripsi → ejen → strim TTS
Seterusnya: pemahaman video dalam ejen — pengekstrakan bingkai dan penaakulan temporal.
Pelajari Ejen AI dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 60
- Pelajaran
- 239
Soalan Lazim
Adakah pelajaran “Aliran Kerja Ejen Audio + Teks” percuma?
Ya — teks penuh “Aliran Kerja Ejen Audio + Teks” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Ejen AI, tingkat taraf kepada CoddyKit PRO. Kursus Ejen AI merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Aliran Kerja Ejen Audio + Teks”?
Saluran transkripsi → penaakulan → respons audio dari hujung ke hujung. Anda berlatih Ejen AI menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Ejen AI?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Ejen AI di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Aliran Kerja Ejen Audio + Teks” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Ejen AI ini?
Ya. Setiap pelajaran Ejen AI menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Ejen Imej + Teks dengan Claude Vision dan GPT-4V
- Aliran Kerja Ejen Audio + Teks
- Pemahaman Video dalam Ejen
- Corak Penaakulan Rentas Modaliti