Agen Suara dan Teks Multimodal
Selaraskan respons lisan dengan teks di layar dalam sistem agen suara.
Agen Suara dan Teks Multimodal adalah pelajaran AI Prompt Engineering gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Prompt Engineering, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Konteks Hanya Suara vs Multimodal
Agen AI suara beroperasi dalam dua konteks yang pada dasarnya berbeda:
- Hanya suara: Pengeras suara pintar, IVR, panggilan telepon — pengguna hanya mendengar audio, tanpa layar
- Multimodal: Aplikasi seluler, aplikasi web, dasbor mobil — pengguna dapat melihat layar DAN mendengar audio secara bersamaan
Konteks ini memerlukan strategi respons yang berbeda. Dalam konteks hanya suara, semuanya harus diucapkan. Dalam konteks multimodal, Anda dapat menyelaraskan hal yang diucapkan dengan hal yang ditampilkan.
Menyusun Prompt untuk Respons Hanya Suara
Dalam konteks hanya suara, LLM harus menghasilkan respons yang berfungsi sepenuhnya tanpa visual. Artinya, jangan merujuk pada elemen layar, jangan menggunakan daftar yang memerlukan pemindaian visual, dan jangan menyertakan konten yang hanya masuk akal jika diformat.
VOICE_ONLY_SYSTEM_PROMPT = (
'You are a voice-only assistant. The user cannot see any screen.\n\n'
'Requirements:\n'
'- Never reference visual elements ("tap here", "see the chart", "the blue button")\n'
'- Never use numbered or bulleted lists — use spoken sequences instead:\n'
' BAD: "1. First do X 2. Then do Y"\n'
' GOOD: "Start by doing X. When that is done, do Y."\n'
'- Limit responses to what can be comfortably spoken in 30 seconds\n'
'- Offer to give more detail rather than overwhelming the user\n'
'- Use verbal signposts: "First", "Next", "Finally"\n'
'- Read out all important data: codes, dates, amounts as full words'
)
print(VOICE_ONLY_SYSTEM_PROMPT)Menyelaraskan Teks yang Diucapkan dan di Layar
Dalam konteks multimodal, Anda dapat membagi konten antara audio dan layar. Audio menangani konten percakapan, emosional, dan dinamis. Layar menangani informasi padat, tabel, dan teks panjang.
MULTIMODAL_SYSTEM_PROMPT = (
'You are a multimodal assistant with both a voice and a screen.\n\n'
'When responding, consider what each modality does best:\n\n'
'SPEAK (voice):\n'
'- Conversational summary, emotional tone, key highlights\n'
'- Guide the user to look at the screen when needed:\n'
' "I have shown the details on screen. The key number to notice is..."\n\n'
'SHOW (screen):\n'
'- Detailed data, tables, long lists, code, maps, images\n\n'
'When your response includes structured data, respond in this format:\n'
'SPOKEN: <what to say aloud>\n'
'VISUAL: <what to display on screen in markdown>'
)
# Example LLM output for multimodal response:
EXAMPLE_MULTIMODAL_OUTPUT = (
'SPOKEN: Your top three expenses this month are food, transport, and entertainment. '
'Food was the biggest, almost double your budget. Check the screen for the full breakdown.\n\n'
'VISUAL: | Category | Budget | Actual | Difference |\n'
'|---|---|---|---|\n'
'| Food | $400 | $780 | -$380 |\n'
'| Transport | $150 | $162 | -$12 |\n'
'| Entertainment | $100 | $145 | -$45 |'
)
print(EXAMPLE_MULTIMODAL_OUTPUT)Menyusun Keluaran LLM untuk Agen Suara
Untuk aplikasi agen suara, minta LLM mengembalikan keluaran terstruktur yang dapat Anda uraikan dan salurkan secara terpisah ke audio atau layar. JSON atau format bagian yang telah ditentukan dapat digunakan dengan baik.
import anthropic
import json
client = anthropic.Anthropic(api_key='sk-ant-...')
VOICE_AGENT_SYSTEM = (
'You are a financial voice assistant. For each response, return JSON with:\n'
'{\n'
' "spoken": "Short spoken response (max 2 sentences)",\n'
' "visual_title": "Header for the on-screen card (optional)",\n'
' "visual_content": "Detailed content for screen (markdown, optional)",\n'
' "action_label": "Button label if action needed (optional)",\n'
' "action_type": "one of: none, confirm, navigate, call"\n'
'}\n'
'Return only the JSON object.'
)
def voice_agent_query(user_message):
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=500,
system=VOICE_AGENT_SYSTEM,
messages=[{'role': 'user', 'content': user_message}]
)
try:
response_data = json.loads(r.content[0].text)
return response_data
except json.JSONDecodeError:
return {'spoken': r.content[0].text, 'visual_content': None}
result = voice_agent_query('What is my account balance?')
print('SPEAK:', result.get('spoken'))
print('SHOW:', result.get('visual_content', 'Nothing to display'))Memformat Transkrip untuk Agen Suara
Percakapan agen suara harus dicatat sebagai transkrip untuk penelusuran kesalahan, kepatuhan, dan peninjauan kualitas. Format transkrip harus memuat identitas pembicara, stempel waktu, serta keluaran audio dan visual.
import datetime
import json
class VoiceTranscript:
def __init__(self, session_id):
self.session_id = session_id
self.turns = []
def add_user_turn(self, text, audio_duration_ms=None):
self.turns.append({
'speaker': 'user',
'timestamp': datetime.datetime.utcnow().isoformat(),
'text': text,
'audio_duration_ms': audio_duration_ms,
})
def add_agent_turn(self, spoken_text, visual_content=None, action=None):
self.turns.append({
'speaker': 'agent',
'timestamp': datetime.datetime.utcnow().isoformat(),
'spoken': spoken_text,
'visual': visual_content,
'action': action,
})
def save(self, filepath):
with open(filepath, 'w') as f:
json.dump({'session_id': self.session_id, 'turns': self.turns}, f, indent=2)
print(f'Transcript saved: {filepath}')
# Usage
transcript = VoiceTranscript('session_001')
transcript.add_user_turn('What is my balance?', audio_duration_ms=1200)
transcript.add_agent_turn('Your balance is four hundred dollars.', visual_content='Balance: $400')
transcript.save('/tmp/session_001_transcript.json')Menangani Kesalahan Masukan Suara
Agen suara harus menangani kesalahan pengenalan ucapan dengan baik — salah mendengar kata, ucapan yang tidak lengkap, atau kebisingan latar belakang. Minta LLM mendeteksi dan memulihkan diri dari masukan yang ambigu.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-...')
AMBIGUITY_HANDLING_SYSTEM = (
'You are a voice assistant. User input comes from speech recognition '
'and may contain transcription errors.\n\n'
'When input seems unclear or ambiguous:\n'
'1. State what you think the user might have meant.\n'
'2. Ask a single clarifying yes/no question to confirm.\n'
'3. Never ask more than one question at a time.\n'
'4. Offer the most likely interpretation as the default.\n\n'
'Example:\n'
'Input: "transfer five hundred to john or gene" (ambiguous name)\n'
'Response: "It sounds like you want to transfer five hundred dollars. '
'Did you mean John Smith or Gene Lee?"'
)
def handle_voice_input(user_speech):
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=200,
system=AMBIGUITY_HANDLING_SYSTEM,
messages=[{'role': 'user', 'content': user_speech}]
)
return r.content[0].text
print(handle_voice_input('pay the electric company bill thing'))Pergantian Giliran dalam Percakapan Suara
Berbeda dari percakapan teks, suara memerlukan pengelolaan giliran yang jelas. Agen harus mengetahui kapan harus berhenti berbicara dan mendengarkan, sementara pengguna harus mengetahui kapan agen selesai. Rancang prompt yang menghasilkan respons dengan tanda akhir yang alami.
TURN_TAKING_SYSTEM = (
'You are a voice assistant. Responses must be designed for spoken conversation:\n\n'
'End each response with exactly ONE of:\n'
'- A direct question inviting the user to respond\n'
'- A clear statement that the task is complete (e.g., "That is done.")\n'
'- An explicit offer to continue (e.g., "Is there anything else?")\n\n'
'Never end mid-thought. Never trail off. '
'Avoid open-ended statements that leave the user unsure if they should speak.\n\n'
'GOOD endings:\n'
'- "The transfer is complete. Would you like a confirmation number?"\n'
'- "That is all I have. Is there anything else?"\n'
'BAD endings:\n'
'- "You might also want to consider..." (open, unclear)\n'
'- "The balance is..." (incomplete)'
)
print(TURN_TAKING_SYSTEM[:300])Menangani Interupsi
Pengguna dapat menyela agen suara. Sistem harus mendeteksi interupsi (melalui VAD — deteksi aktivitas suara), lalu meminta agen melanjutkan atau mengarahkan percakapan kembali dengan baik. Minta LLM menerima perubahan topik di tengah percakapan.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-...')
INTERRUPTION_SYSTEM = (
'You are a voice assistant. Users may interrupt mid-conversation.\n\n'
'If the user changes topic abruptly, smoothly acknowledge the change:\n'
'"Of course. Let us switch to that." Then answer the new question.\n\n'
'If the user says something like "wait", "stop", "hold on":\n'
'Pause and say "Sure, take your time" and wait for them to continue.\n\n'
'If the user repeats a question, they likely did not hear the answer:\n'
'Say "Let me repeat that." and say it again more slowly.\n\n'
'Never express frustration at interruptions or repetition.'
)
def handle_conversation(turns):
"""Handle multi-turn voice conversation with interruptions."""
messages = []
for speaker, text in turns:
messages.append({'role': speaker, 'content': text})
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=200,
system=INTERRUPTION_SYSTEM,
messages=messages
)
return r.content[0].text
# Simulate an interruption scenario
conversation = [
('user', 'What is my balance?'),
('assistant', 'Your checking account balance is four hundred dollars and—'),
('user', 'Actually wait, can you tell me my savings instead?'),
]
print(handle_conversation(conversation))Pendamping di Layar untuk Suara
Saat layar tersedia, rancang konten di layar agar melengkapi (bukan mengulang) audio yang diucapkan. Layar menangani detail; suara menangani navigasi dan keterlibatan emosional.
def render_multimodal_response(agent_output):
"""
Render a voice agent response to both TTS and screen components.
agent_output: dict with 'spoken', 'visual_content', 'action_label'
"""
# Route to TTS
spoken = agent_output.get('spoken', '')
if spoken:
send_to_tts(spoken) # Your TTS function
print(f'[AUDIO] {spoken}')
# Route to screen
visual = agent_output.get('visual_content')
if visual:
render_card_on_screen(visual) # Your UI function
print(f'[SCREEN] {visual[:100]}')
# Optional action button
action_label = agent_output.get('action_label')
if action_label:
show_action_button(action_label) # Your UI function
print(f'[BUTTON] {action_label}')
def send_to_tts(text):
print(f'TTS: {text}')
def render_card_on_screen(content):
print(f'Screen card: {content[:50]}')
def show_action_button(label):
print(f'Button: {label}')
# Test it
render_multimodal_response({
'spoken': 'I found three flights to New York.',
'visual_content': '| Flight | Departs | Price |\n|---|---|---|\n| AA101 | 08:00 | $299 |',
'action_label': 'Book cheapest'
})Pertimbangan Aksesibilitas
AI suara itu sendiri merupakan fitur aksesibilitas bagi pengguna dengan gangguan penglihatan atau kesulitan motorik. Rancang agen Anda agar juga mendukung pengguna yang mengandalkan suara sebagai antarmuka utama.
ACCESSIBILITY_VOICE_SYSTEM = (
'This voice assistant serves users who may be using voice as their '
'primary access method due to disability or preference.\n\n'
'Guidelines:\n'
'- Never require the user to see a screen to complete a task.\n'
'- Read out all information that matters, including confirmation codes, '
'totals, and status messages.\n'
'- Offer to repeat any information: '
'"I can repeat that if you would like."\n'
'- Describe any actions you took: '
'"I have sent the confirmation to your email."\n'
'- Accept multiple phrasings for the same command — users phrase '
'voice commands inconsistently.\n'
'- Confirm all destructive or financial actions before executing:\n'
' "Just to confirm: you want to transfer $500 to John. Is that right?"'
)
print(ACCESSIBILITY_VOICE_SYSTEM[:300])Menguji Respons Agen Suara
Menguji respons agen suara memerlukan pendekatan yang berbeda dari menguji respons teks. Anda harus mengevaluasi audio yang diucapkan (prosodi, kejelasan, kealamian) dan komponen visual (kelengkapan, pemformatan). Respons teks yang terbaca dengan baik mungkin terdengar janggal saat diucapkan.
Buat pipeline pengujian yang mengubah keluaran agen menjadi audio menggunakan mesin TTS Anda, lalu terapkan pemeriksaan kualitas otomatis: panjang kalimat, pelafalan singkatan, tidak adanya artefak markdown, dan tanda pergantian giliran.
Pemeriksaan Pemahaman: Batasan Hanya Suara
Dalam konteks hanya suara (pengeras suara pintar tanpa layar), jenis respons agen manakah yang PALING sesuai?
Rangkuman: Agen Suara dan Teks Multimodal
Agen suara beroperasi dalam dua mode: hanya suara (tanpa layar) dan multimodal (suara + layar). Respons hanya suara harus menghindari rujukan visual dan berfungsi sepenuhnya sebagai audio yang diucapkan, dengan penanda verbal. Respons multimodal membagi konten: suara untuk rangkuman percakapan dan nuansa emosional, layar untuk data terperinci dan teks panjang. Minta LLM mengembalikan keluaran terstruktur (JSON dengan bidang lisan/visual) agar mudah disalurkan. Rancang pengelolaan giliran dengan akhir respons yang jelas, penanganan interupsi yang baik, dan dukungan pengulangan yang eksplisit. Selalu pertimbangkan aksesibilitas — suara sering menjadi antarmuka utama bagi pengguna yang paling membutuhkannya.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Agen Suara dan Teks Multimodal” gratis?
Ya — teks lengkap “Agen Suara dan Teks Multimodal” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Prompt Engineering, upgrade ke CoddyKit PRO. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Agen Suara dan Teks Multimodal”?
Selaraskan respons lisan dengan teks di layar dalam sistem agen suara. Kamu berlatih AI Prompt Engineering dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Prompt Engineering?
Tidak diperlukan pengalaman sebelumnya. AI Prompt Engineering di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Agen Suara dan Teks Multimodal” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Prompt Engineering ini?
Ya. Setiap pelajaran AI Prompt Engineering menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pola Prompt TTS untuk Ucapan Alami
- SSML dan Pengendalian Prosodi
- Merancang Persona Kecerdasan Buatan Suara
- Agen Suara dan Teks Multimodal