Çok Modlu Ses ve Metin Aracıları
Sesli aracı sistemlerinde konuşulan yanıtları ekrandaki metinle eşgüdümleme.
Çok Modlu Ses ve Metin Aracıları, CoddyKit'te ücretsiz bir AI Prompt Engineering dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Prompt Engineering öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Prompt Engineering kursu toplamda 4 dersten oluşur.
Yalnızca Sesli ve Çok Kipli Bağlamlar
Sesli yapay zekâ ajanları temelde birbirinden farklı iki bağlamda çalışır:
- Yalnızca sesli: Akıllı hoparlörler, IVR ve telefon görüşmeleri; kullanıcılar yalnızca sesi duyar, ekran görmez
- Çok kipli: Mobil uygulamalar, web uygulamaları ve araç panoları; kullanıcılar hem ekranı görebilir hem de aynı anda sesi duyabilir (AND)
Bu bağlamlar farklı yanıt stratejileri gerektirir. Yalnızca sesli bağlamda her şey seslendirilmelidir. Çok kipli bağlamda, seslendirilenleri ekranda gösterilenlerle koordine edebilirsiniz.
Yalnızca Sesli Yanıtlar İçin İstemler
Yalnızca sesli bağlamlarda LLM, görsel ögeler olmadan tamamen işe yarayan yanıtlar üretmelidir. Bu nedenle ekran ögelerine gönderme yapılmamalı, görsel olarak taranması gereken listeler kullanılmamalı ve yalnızca biçimlendirmeyle anlam kazanan içeriklere yer verilmemelidir.
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)Seslendirilen ve Ekrandaki Metni Eş Güdümleme
Çok kipli bağlamlarda içeriği ses ve ekran arasında paylaştırabilirsiniz. Ses; konuşmaya dayalı, duygusal ve dinamik içeriği aktarır. Ekran ise yoğun bilgileri, tabloları ve uzun metinleri gösterir.
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)Sesli Ajanlar İçin LLM Çıktısını Yapılandırma
Sesli ajan uygulamalarında LLM'yi, ayrıştırabileceğiniz yapılandırılmış bir çıktı döndürecek şekilde yönlendirin; böylece içeriği ses ve ekran için ayrı ayrı işleyip yönlendirebilirsiniz. JSON veya önceden tanımlanmış bir bölüm biçimi bu iş için uygundur.
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'))Sesli Ajanlar İçin Konuşma Dökümü Biçimlendirme
Sesli ajan konuşmaları hata ayıklama, mevzuata uygunluk ve kalite incelemesi amacıyla konuşma dökümleri olarak günlüğe kaydedilmelidir. Dökümleri; konuşmacının kimliğini, zaman damgalarını ve hem ses hem de görsel (visual) çıktıları içerecek şekilde biçimlendirin.
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')Sesli Girdi Hatalarını Yönetme
Sesli ajanlar, konuşma tanıma hatalarını (kelimelerin yanlış duyulması, tamamlanmamış ifadeler veya arka plan gürültüsü) uygun bir şekilde ele almalıdır. LLM'yi belirsiz girdileri algılayıp bunlardan kurtulacak şekilde yönlendirin.
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'))Sesli Konuşmalarda Söz Alma Sırası
Metin sohbetinden farklı olarak sesli iletişim, söz alma sırasının açıkça yönetilmesini gerektirir. Ajan ne zaman konuşmayı bırakıp dinlemesi gerektiğini, kullanıcı da ajanın ne zaman konuşmayı bitirdiğini anlamalıdır. Doğal bitiş işaretleri içeren yanıtlar üretecek istemler tasarlayın.
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])Araya Girme Durumlarını Yönetme
Kullanıcılar sesli ajanların sözünü keser. Sistem, araya girme durumlarını (VAD — ses etkinliği algılama yoluyla) algılamalı ve ajanı konuşmaya uygun şekilde devam etmesi ya da yön değiştirmesi için yönlendirmelidir. LLM'yi konuşma sırasında ortaya çıkan konu değişikliklerini kabul edecek şekilde yönlendirin.
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))Sese Eşlik Eden Ekran
Ekran mevcut olduğunda, ekrandaki içeriği seslendirilen içeriği tamamlayacak, onu tekrarlamayacak şekilde tasarlayın. Ekran ayrıntıları, ses ise gezinmeyi ve duygusal etkileşimi üstlenmelidir.
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'
})Erişilebilirlik Konuları
Sesli yapay zekâ, görme engeli veya hareket kısıtlılığı bulunan kullanıcılar için başlı başına bir erişilebilirlik özelliğidir. Ajanınızı, temel arayüzleri olarak sese güvenen kullanıcıları da destekleyecek şekilde tasarlayın.
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])Sesli Ajan Yanıtlarını Sınama
Sesli ajan yanıtlarını sınamak, metin yanıtlarını sınamaktan farklı bir yaklaşım gerektirir. Hem seslendirilen sesi (prozodi, anlaşılabilirlik ve doğallık) hem de görsel (visual) bileşeni (eksiksizlik ve biçimlendirme) değerlendirmeniz gerekir. Metin olarak iyi okunan bir yanıt, seslendirildiğinde kulağa tuhaf gelebilir.
Ajan çıktılarını TTS motorunuzu kullanarak sese dönüştüren ve ardından otomatik bir kalite denetimi uygulayan bir sınama iş akışı oluşturun: cümle uzunluğu, kısaltmaların telaffuzu, Markdown kalıntılarının bulunmaması ve söz alma sırası sinyalleri.
Bilgi Kontrolü: Yalnızca Sesli Olma Kısıtı
Yalnızca sesli bir bağlamda (ekransız akıllı hoparlör), hangi tür ajan yanıtı en uygun (MOST) olur?
Özet: Çok Kipli Ses ve Metin Ajanları
Sesli ajanlar iki kipte çalışır: yalnızca sesli (ekransız) ve çok kipli (ses + ekran). Yalnızca sesli yanıtlar görsel göndermelerden kaçınmalı ve sözlü yönlendirmelerle tamamen ses olarak işe yaramalıdır. Çok kipli yanıtlar içeriği paylaşır: ses, konuşmaya dayalı özetler ve duygusal ton için; ekran ise ayrıntılı veriler ve uzun metinler için kullanılır. Kolay yönlendirme amacıyla LLM'leri yapılandırılmış çıktı (seslendirilecek ve görsel alanları içeren JSON) döndürecek şekilde yönlendirin. Net yanıt bitişleri, uygun araya girme yönetimi ve açık tekrar desteğiyle söz alma sırasını tasarlayın. Erişilebilirliği her zaman dikkate alın; ses, ona en çok ihtiyaç duyan kullanıcılar için çoğu zaman temel arayüzdür.
Sıkça Sorulan Sorular
“Çok Modlu Ses ve Metin Aracıları” dersi ücretsiz mi?
Evet — “Çok Modlu Ses ve Metin Aracıları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Prompt Engineering kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Prompt Engineering kursu toplamda 4 dersten oluşur.
“Çok Modlu Ses ve Metin Aracıları” dersinde ne öğreneceğim?
Sesli aracı sistemlerinde konuşulan yanıtları ekrandaki metinle eşgüdümleme. AI Prompt Engineering ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Prompt Engineering öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Prompt Engineering, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Çok Modlu Ses ve Metin Aracıları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Prompt Engineering dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Prompt Engineering dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Doğal Konuşma İçin TTS İstem Kalıpları
- SSML ve Prozodi Denetimi
- Sesli Yapay Zeka Persona Tasarımı
- Çok Modlu Ses ve Metin Aracıları