Metin tabanlı arayüzler, yapay zeka uygulamalarının mevcut manzarasını domine etse de, insan-bilgisayar etkileşiminin geleceği doğal ve akıcı sesli sohbetlerde yatıyor. OpenAI'nin Whisper'ını sağlam bir konuşmadan metne (STT) dönüştürme için, LangChain'i Büyük Dil Modeli (LLM) mantığını orkestrasyon için ve bir Metinden Sese (TTS) motorunu birleştirerek, gerçekten canlı hissettiren sohbet robotları oluşturabiliriz. Bu rehber, böyle bir sistemin mimarisini ve uygulamasını, gecikme optimizasyonuna ve güvenilir entegrasyona odaklanarak adım adım anlatıyor.
Mimariyi Anlama
Koda dalmadan önce, veri akışını anlamak kritik öneme sahiptir. Ses destekli bir bot tipik olarak dört aşamalı bir boru hattını izler:
- Ses Yakalama: Kullanıcı girdisini bir mikrofon veya ses dosyasından kaydetme.
- Transkripsiyon: Ham ses baytlarını Whisper kullanarak metne dönüştürme.
- Mantık İşleme: Metni LangChain üzerinden işleyerek bağlama duyarlı bir yanıt oluşturma.
- Sentez: Oluşturulan metni bir TTS hizmeti kullanarak tekrar sese dönüştürme.
Buradaki zorluk gecikmedir. Kullanıcılar gerçek zamanlı yanıtlar bekler. Bu nedenle, hem Whisper'da hem de LLM sağlayıcısında akış (streaming) yetenekleri esastır. Ayrıca, sessiz girdiler veya konuşma dışı sesler için hata yönetimi, sonsuz döngüleri önlemek için sağlam olmalıdır.
Ortamı Kurma
Python 3.9+ yüklü olduğundan emin olun. Gerekli kütüphaneleri pip ile yükleyin:
pip install openai-whisper langchain langchain-openai gtts soundfile
Not: Burada basitlik ve ücretsiz kullanım için gtts (Google Metinden Sese) kullanılmaktadır, ancak üretim uygulamaları daha yüksek sadakat için OpenAI TTS veya Azure Speech Services'i tercih edebilir.
Uygulama: Çekirdek Boru Hattı
Aşağıda, entegrasyonu gösteren özetlenmiş bir örnek bulunmaktadır. Bir üretim ortamında, birden fazla kullanıcıyı eşzamanlı olarak işlemek için bu adımları FastAPI gibi asenkron bir çerçeveye sararsınız.
import whisper
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
import gtts
import io
# Verimlilik için Whisper modelini bir kez yükleyin
model = whisper.load_model("base")
# LangChain LLM'ini başlatın
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)
def transcribe_audio(audio_file_path: str) -> str:
"""
Whisper kullanarak ses dosyasını metne dönüştürür.
"""
result = model.transcribe(audio_file_path)
return result['text'].strip()
def generate_response(user_input: str, chat_history: list) -> str:
"""
Transkript metni ve geçmişi LLM'e gönderir.
"""
system_prompt = "Sen yardımcı bir sesli asistansın. Yanıtlarını kısa ve sohbet tarzında tut."
messages = [
SystemMessage(content=system_prompt),
*chat_history,
HumanMessage(content=user_input)
]
response = llm.invoke(messages)
return response.content
def synthesize_speech(text: str, output_file_path: str) -> None:
"""
gTTS kullanarak metni MP3'e dönüştürür.
"""
tts = gtts.TTS(text=text, lang='en')
tts.save(output_file_path)
# Ana Çalışma Akışı
if __name__ == "__main__":
# Ses girdisini simüle edin (gerçekte bu, bir mikrofon akışından gelir)
audio_path = "user_input.wav"
# 1. Transkript Et
print("Ses işleniyor...")
text_input = transcribe_audio(audio_path)
print(f"Kullanıcı şunu söyledi: {text_input}")
if not text_input:
print("Konuşma algılanmadı.")
exit()
# 2. Yanıt Oluştur
print("Düşünüyor...")
chat_history = [] # Gerçek bir uygulamada bu kalıcı olarak saklanırdı
bot_response = generate_response(text_input, chat_history)
print(f"Bot şunu diyor: {bot_response}")
# 3. Sentezle
print("Ses üretiliyor...")
output_path = "bot_response.mp3"
synthesize_speech(bot_response, output_path)
print(f"Ses {output_path} dosyasına kaydedildi")
Üretim İçin Optimizasyonlar
Bunu gerçek zamanlı etkileşim için uygulanabilir kılmak için, bu gelişmiş teknikleri göz önünde bulundurun:
1. Akış (Streaming) Whisper
Standart Whisper, tüm ses dosyasını işler. Canlı sohbetler için parçalı işleme (chunked processing) gerekir. whisper-streaming gibi kütüphaneler veya WebRTC ses akışları kullanmak, ses söylenirken transkript etmenizi sağlar ve bu da ilk jetona kadar geçen süreyi (TTFT) önemli ölçüde azaltır.
2. Önbellekleme ve Bağlam Yönetimi
LLM'ler pahalıdır. Tüm sohbet geçmişini her seferinde göndermek yerine, yalnızca gerektiğinde ilgili bağlamı almak için LangChain üzerinden bir vektör veritabanı uygulayın. Son turları hızlı tutmak için kısa süreli oturum hafızası olarak Redis kullanın.
3. Ses Formatı Optimizasyonu
Ses girdinizi Whisper'a geçirmeden önce her zaman 16kHz mono'ya normalize edin. Bu standart format, ön işleme süresini en aza indirir ve farklı mikrofonlar arasında tutarlı transkripsiyon doğruluğunu sağlar.
Kenar Durumlarını İşleme
Ses arayüzleri, metne kıyasla benzersiz zorluklarla karşı karşıyadır:
- Arka Plan Gürültüsü: Whisper sağlamdır, ancak aşırı gürültülü ortamlar halüsinasyonlara neden olabilir. Transkripsiyondan önce sessiz dönemleri filtrelemek için Silero VAD gibi bir Ses Aktivite Algılayıcı (VAD) uygulayın.
- Kesinti İşleme: Bot TTS yaparken kullanıcı konuşuyorsa, bir barge-in (kesme) mekanizmasına ihtiyacınız vardır. Bu, TTS çalmayı anında durdurabilen gerçek zamanlı ses izleme gerektirir.
- Hata Düzeltme: Transkripsiyon güveni düşükse, LLM tahmin etmek yerine açıklama sormalıdır. Whisper'dan gelen güven skorunu istem bağlamına (prompt context) iletebilirsiniz.
Sonuç
Whisper, LangChain ve TTS'nin entegrasyonu, ses öncelikli yapay zeka uygulamaları için güçlü bir temel oluşturur. Temel boru hattı basit olsa da, bir demo ile üretim hazır bir sistem arasındaki fark, gecikme yönetimi, sağlam hata işleme ve bağlam optimizasyonunda yatar. Konuşma modelleri doğruluk ve hızda iyileşmeye devam ettikçe, doğal ses arayüzleri geliştirmek için giriş bariyeri hiç olmadığı kadar düşük. Yukarıda özetlenen modüler yaklaşımla başlayın, çeşitli ses örnekleriyle kapsamlı testler yapın ve gecikme metrikleriniz üzerinde iterasyon yapın. Yapay zeka asistanlarının bir sonraki nesli sadece dinlemeyecek—onlar anlayacak, yanıt verecek ve insani hissettirecek.