Danışman: Araş.Gör.Dr. Sevgi Harman

Öğrenciler: Enes Zeren, Emirhan Başaran

Matematik Mühendisliği Tasarım Projesi

HAZIRCEVAP AI TELESEKRETER ÇALIŞMASI


Proje Hakkında

Bu proje, telefon AI telesekreteri için gerçek zamanlı soru-cevap eşleştirme sistemidir. Kullanıcının sesli sorusunu metne çevirdikten sonra, semantik anlamına göre veritabanındaki en uygun cevabı bulur ve ses dosyasını oynatır.

Hedef

<500ms gecikme ile >85% doğrulukta cevap bulma. Turing testinden geçebilen doğal dil anlama.

Teknoloji

SBERT (Sentence-BERT) ile 768 boyutlu semantic embedding. FAISS ile milisaniye seviyesinde arama.

Performans

Preprocessing: ~0.5ms
Embedding: ~55ms
FAISS Search: ~2ms
Toplam: ~57ms

STT (Speech-to-Text)

Deepgram Nova-2 ile ses dalgası → metin dönüşümü. 50ms parçalara bölünmüş, spektrogram analizi. ~200ms gecikme.

Intent Matching

Soru-soru eşleştirme yaklaşımı. "randevu alabilir miyim" ile "randevu istiyorum" aynı intent olarak algılanıyor.

TTS (Text-to-Speech)

Önceden kaydedilmiş insan sesi cevaplar. Her intent için ayrı MP3 dosyası. Doğal ve samimi ses tonu.

Sistem Mimarisi

1

Speech-to-Text

Deepgram Nova-2
Ses → Metin dönüşümü
Süre: ~200ms
Doğruluk: %95+

2

Text Preprocessing

Normalizasyon
Unicode NFKC
Whitespace cleanup
Süre: ~0.5ms

3

SBERT Embedding

768D Vektör
Sentence Transformers
L2 normalized
Süre: ~55ms

4

FAISS Search

498 Soru Tarama
Kosinüs benzerliği
Top-3 sonuç
Süre: ~2ms

5

Audio Response

MP3 Oynatma
Insan sesi
Önceden kaydedilmiş
Süre: ~40ms

Sistem Aşamaları

1. Adım: Text Preprocessing

Metni temizleme ve normalize etme

Ne Yapıyor?

Speech-to-Text (STT) çıktısı genelde dağınık gelir: fazla boşluklar, garip unicode karakterler, tutarsız noktalamalar. Bu aşama metni BERT'in anlayabileceği temiz bir formata getirir.

Adımlar:

  • Unicode Normalizasyon (NFKC): Farklı şekillerde yazılmış karakterleri standartlaştırır
  • Whitespace Cleanup: Fazla boşlukları tek boşluğa indirir
  • Trim: Baş ve sondaki boşlukları kaldırır

Performans:

Ortalama 0.5ms sürer. Çok hızlı çünkü sadece string işlemleri yapıyor, makine öğrenmesi yok.

Kod Örneği

# Input (STT çıktısı)
text = " Yarın için randevu alabilir miyim? "
# Step 1: Unicode Normalization
text = unicodedata.normalize("NFKC", text)
# Step 2: Whitespace cleanup
text = re.sub(r"\s+", " ", text)
# Step 3: Trim
text = text.strip()
# Output
# "Yarın için randevu alabilir miyim?"

Örnek Dönüşüm

# Örnek 1: Fazla boşluk
Input: "merhaba dünya"
Output: "merhaba dünya"
# Örnek 2: Unicode
Input: "café"
(é = combining char) Output: "café"
(é = single char) # Örnek 3: Trim
Input: " test "
Output: "test"

Neden Bu Adım Önemli?

STT sistemleri bazen tutarsız çıktı verir. Aynı cümle farklı zamanlarda farklı boşluklarla gelebilir. Eğer normalize etmezsek, "randevu alabilir miyim" ile "randevu alabilir miyim" (fazla boşluklu) farklı vektörler üretir ve eşleşme başarısı düşer. Bu adım %5-10 doğruluk artışı sağlar.

Gerçek Hayat Örneği

Senaryo: Kullanıcı "yarın için randevu" diye söylüyor (kelimeler arasında duraklamalar var). STT bu duraklamaları fazla boşluk olarak yazabiliyor. Preprocessing bu boşlukları tek boşluğa indiriyor, böylece veritabanındaki "yarın için randevu" sorusuyla mükemmel eşleşiyor.

2. Adım: SBERT Embedding

Cümleyi 768 boyutlu vektöre dönüştürme

Ne Yapıyor?

Temizlenmiş cümleyi 768 boyutlu bir sayı vektörüne çeviriyor. Bu vektör cümlenin "anlamını" temsil ediyor. Benzer anlamlı cümleler benzer vektörler üretiyor.

SBERT Nedir?

Sentence-BERT, BERT'in sentence-level için optimize edilmiş versiyonu. Siamese network yapısıyla eğitilmiş, paraphrase detection'da çok başarılı.

Vektör Boyutu Neden 768?

  • BERT Base standardı
  • Yeterince ekspresif
  • Çok büyük değil (hızlı hesaplama)
  • Literature'da yaygın kullanılıyor

Performans:

Ortalama 55ms. Pipeline'ın en yavaş kısmı ama GPU kullanılırsa 15ms'ye düşer.

Nasıl Çalışıyor?

# Model yükleme
model = SentenceTransformer( "emrecan/bert-base-turkish-cased-mean-nli-stsb-tr" )
# Cümleyi embed et
text = "randevu alabilir miyim"
embedding = model.encode( [text], normalize_embeddings=True )[0]
# Sonuç: 768 boyutlu numpy array
# embedding.shape = (768,)
# embedding[:5] = [0.0234, -0.0456, 0.0789, ...]

Vektör Özellikleri

# 768 boyut, her biri -1 ile +1 arası
Boyut: 768 Range: [-1.0, +1.0] L2 Norm: 1.0 (normalized)
# Örnek vektör
[ 0.0234, # Dim 0 -0.0456, # Dim 1 0.0789, # Dim 2 ... 0.0123 # Dim 767 ]

Neden Bu Adım Önemli?

İnsanlar aynı şeyi farklı kelimelerle söyler: "randevu alabilir miyim" = "randevu istiyorum" = "termin ayarlayabilir miyiz". SBERT bu farklı cümleleri benzer vektörlere çeviriyor (kosinüs benzerliği >0.85). Klasik keyword matching bu paraphraseları yakalayamaz.

Benzerlik Örneği

Cümle 1: "randevu alabilir miyim" → v1
Cümle 2: "randevu istiyorum" → v2
Benzerlik: cos(v1, v2) = 0.93

Cümle 3: "fatura ne kadar" → v3
Benzerlik: cos(v1, v3) = 0.34

SBERT semantic farkı doğru algılıyor!

3. Adım: FAISS Search

En benzer soruyu 498 soru arasında bulma

Ne Yapıyor?

Kullanıcının sorusunu (768D vektör), veritabanındaki 498 hazır soruyla karşılaştırıyor. En yüksek kosinüs benzerliğine sahip top-3 soruyu buluyor.

FAISS Nedir?

Facebook AI Research tarafından geliştirilen similarity search kütüphanesi. Milyonlarca vektör arasında milisaniye seviyesinde arama.

Kosinüs Benzerliği:

sim(v1, v2) = v1 · v2 (normalized vektörler için)
Sonuç: -1 (tam zıt) ile +1 (tam aynı) arası

⏱Performans:

498 soru için ~2ms. SIMD (AVX2/AVX512) optimizasyonu sayesinde 8-16 paralel işlem.

FAISS Kullanımı

# FAISS index oluştur
import faiss embedding_dim = 768 index = faiss.IndexFlatIP(embedding_dim)
# 498 soru vektörünü ekle
question_embeddings = ...
# (498, 768) numpy array
index.add(question_embeddings)
# Kullanıcı sorusunu ara
query_embedding = ...
# (1, 768)
distances, indices = index.search(query_embedding, k=3) # distances[0] = [0.9347, 0.8923, 0.7845] # indices[0] = [42, 15, 89]

Threshold Mekanizması

if similarity >= 0.55: confidence = "HIGH"
# Cevabı ver
elif similarity >= 0.40: confidence = "MEDIUM"
# "Doğru anladım mı?" diye sor
else: confidence = "LOW"
# "Anlayamadım, tekrar eder misiniz?"

Neden FAISS?

Brute Force: 498 soru × 768 boyut = 383,040 çarpım (~10ms)
FAISS (SIMD): Paralel işlemle 8-16x hızlanma (~2ms)

Real-time uygulama için kritik! Ayrıca milyonlarca soruya scale edilebilir (IVF index ile). Production'da endüstri standardı.

Arama Örneği

Kullanıcı: "yarın için randevu almak istiyorum"

Rank 1: "randevu alabilir miyim" → 0.9347
Rank 2: "randevu istiyorum" → 0.9234
Rank 3: "termin ayarlayabilir miyiz" → 0.8567

→ En yüksek skor: 0.9347 (HIGH confidence)
→ Seçilen cevap: "Tabii, randevunuz alındı!"

4. Adım: Cevap Seçimi & Audio Oynatma

Final cevabı belirleme ve ses dosyası oynatma

Ne Yapıyor?

FAISS'ten gelen en yüksek skorlu sorunun cevabını veritabanından alıyor ve ilgili ses dosyasını oynatıyor.

Intent ID Mapping:

Her soru bir intent ID'ye bağlı:
Soru 1 → Intent ID: 220 → Cevap + Audio

Audio Format:

  • Format: MP3, 48kHz, 128kbps
  • Süre: 2-5 saniye ortalama
  • Kayıt: Profesyonel insan sesi
  • Load Time: ~40ms

Toplam Süre:

0.5ms + 55ms + 2ms + 40ms = ~98ms
Hedef (<500ms) testlerde tutarlı sonuçlar alınıyor.

Veri Yapısı

{ "id": 220, "intent": "reservation_make", "questions": [ "randevu alabilir miyim", "randevu istiyorum", "termin ayarlayabilir miyiz" ], "answer": "Tabii, randevunuz alındı!", "audio_file": "audio/tr/reservation_make.mp3" }

Audio Pipeline

# 1. Intent ID'den cevap bul
matched_question_idx = indices[0][0] answer_id = question_to_answer_map[matched_question_idx] qa_pair = qa_database[answer_id]
# 2. Audio dosyasını yükle
audio_file = qa_pair["audio_file"] audio = AudioSegment.from_mp3(audio_file)
# 3. Telefon hattına gönder ve oynat
play_audio(audio)

Neden Önceden Kaydedilmiş Ses?

TTS (Text-to-Speech) vs Kaydedilmiş Ses:

TTS Dezavantajları:
• Robotik ses (Düşük Turing test başarısı)
• Gecikme (+100-200ms)
• Tutarsız telaffuz

Kaydedilmiş Ses Avantajları:
- Doğal insan sesi (Yüksek Turing test başarısı)
- Minimal gecikme (~40ms)
- Tutarlı kalite
- Marka kimliği (duygulu ve tutarlı bir konuşma sesi)

Tüm Senaryo

00:00ms - Kullanıcı: "yarın için randevu alabilir miyim"
00:00ms - 200ms - STT: Ses → Metin
200ms - 201ms - Preprocessing: Temizleme
201ms - 256ms - SBERT: Embedding
256ms - 258ms - FAISS: En benzer soru bulma
258ms - 298ms - Audio: MP3 yükleme
298ms - Oynatma başlıyor: "Tabii, randevunuz alındı!"

✅ Toplam: 298ms (Hedef <500ms karşılandı!)

Matematiksel Görselleştirme

KOSİNÜS BENZERLİĞİ (COSINE SIMILARITY)
Ne Yapıyor?
İki cümlenin ne kadar benzer olduğunu ölçüyoruz.
Açı küçükse → Benzer | Açı büyükse → Farklı

ADIM 1: Üç Cümleyi Vektöre Çevir
Soru 1: "rezervasyon yaptırmak istiyorum" → v₁ (768 boyutlu vektör)
Soru 2: "rezervasyon yaptırabilir miyim" → v₂ (768 boyutlu vektör)
Soru 3: "evcil hayvanımla gelebilir miyim" → v₃ (768 boyutlu vektör)

ADIM 2: Kosinüs Benzerliği Hesapla

cos(θ) = (v₁ · v₂) / (|v₁| × |v₂|) v₁ · v₂ = (v₁₁×v₂₁) + (v₁₂×v₂₂) + ... + (v₁₇₆₈×v₂₇₆₈) = 0.9969 (Çok benzer!)
v₁ · v₃ = (v₁₁×v₃₁) + (v₁₂×v₃₂) + ... + (v₁₇₆₈×v₃₇₆₈) = 0.4532 (Farklı!)

ADIM 3: Açıları Bul

θ₁₂ = arccos(0.9969) = 4.5° → ÇOK BENZER! θ₁₃ = arccos(0.4532) = 63.0° → FARKLI!
Yorum:
İki rezervasyon sorusu neredeyse aynı (4.5° açı) Evcil hayvan sorusu tamamen farklı bir konu (63° açı)
Kullanıcı Sorusu
Benzer Rezervasyon Sorusu
Farklı Konu (Evcil Hayvan)
EMBEDDING SPACE (768D → 2D Projeksiyon)
Ne Yapıyor?
768 boyutlu vektörleri 2 boyuta indirip harita gibi gösteriyoruz.
Benzer sorular → Aynı bölgede (cluster) | Farklı sorular → Uzakta
ADIM 1: Boyut İndirgeme (768D → 2D)
Her soru aslında 768 boyutlu bir nokta: "rezervasyon yaptırmak istiyorum" = [0.12, -0.45, 0.78, ..., 0.23]
(768 sayı) İnsanlar 768 boyutu göremez → 2 boyuta indirgiyoruz (t-SNE ile)
ADIM 2: Mesafeleri Koru
Orijinal uzayda yakın olan vektörler → 2D'de de yakın olmalı Uzak olanlar → 2D'de de uzak
ADIM 3: Cluster'ları Gözlemle
🟦 Rezervasyon soruları → Sol üst bölge (cluster)
🟩 Fiyat soruları → Sağ alt bölge
🟥 Adres soruları → Sol alt bölge
🟨 Evcil Hayvan soruları → Sağ üst bölge
Yorum: Aynı tip sorular birbirine yakın → BERT benzer anlamları öğrenmiş!
Yeni soru gelince → En yakın cluster'a bakıyoruz (FAISS)
Örnek: "yarın rezervasyon yapmak istiyorum" → 🟦
Rezervasyon cluster'ına düşer → FAISS en yakın noktayı bulur → Doğru cevabı verir ✅
Rezervasyon
Fiyat
Adres
Evcil Hayvan
Diğer

Gerçek Zamanlı Speech-to-Text Demo

Deepgram Nova-2 Özellikleri:

  • Gerçek Streaming: WebSocket ile kelime kelime anında sonuç
  • Çok Düşük Latency: ~300ms gecikme
  • Interim + Final: Geçici ve kesin sonuçlar ayrı gösteriliyor
  • Otomatik Noktalama: Noktalama işaretleri dahil
  • End of Speech: Konuşma bitişi otomatik algılanıyor
Dil: Türkçe (tr) | Model: Nova-2
Bağlantı kapalı
Streaming transkripsiyon burada gerçek zamanlı görünecek...

Canlı Demo

Burada SBERT kütüphanesi python kodu içerisinde kullanılmıştır

API durumu kontrol ediliyor...
Text Preprocessing
-
Metin temizleniyor ve normalize ediliyor...
SBERT Embedding
-
768 boyutlu semantic vektör oluşturuluyor...
FAISS Search
-
498 soru arasında en benzer 3 tanesi bulunuyor...
Cevap Seçimi
-
En yüksek skorlu cevap seçiliyor...

Gerçek Zamanlı Çıktılar

Preprocessing
// Orijinal "-"
// Normalize "-"
// Token sayısı -
// Süre - ms
Embedding

// Boyut (768,)
// L2 Norm 1.0000
// İlk 10 değer
[-]
// Süre - ms
FAISS Search
// Toplam soru -
// Top-3 Benzerlikler
// Süre - ms
Final Sonuç
// Benzerlik -
// Güven -
// Toplam süre - ms
// Intent ID -
// Cevap -

Projede Kullanılan Akademik Makaleler ve Kaynaklar

1
Devlin, J., Chang, M. W., Lee, K., & Toutanova, K.
"BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding"
arXiv preprint arXiv:1810.04805 (2018)
🔗 https://arxiv.org/abs/1810.04805
2
Reimers, N., & Gurevych, I.
"Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks"
EMNLP 2019
🔗 https://arxiv.org/abs/1908.10084
3
Johnson, J., Douze, M., & Jégou, H.
"Billion-scale similarity search with GPUs"
IEEE Transactions on Big Data (2019)
🔗 https://arxiv.org/abs/1702.08734
4
Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., Kaiser, Ł., & Polosukhin, I.
"Attention is All You Need"
NeurIPS 2017
🔗 https://arxiv.org/abs/1706.03762

Ek Kaynaklar

5
Cer, D., Yang, Y., Kong, S. Y., Hua, N., Limtiaco, N., John, R. S., ... & Kurzweil, R.
"Universal Sentence Encoder"
arXiv:1803.11175 (2018)
🔗 https://arxiv.org/abs/1803.11175
6
Mikolov, T., Chen, K., Corrado, G., & Dean, J.
"Efficient Estimation of Word Representations in Vector Space"
arXiv:1301.3781 (2013)
🔗 https://arxiv.org/abs/1301.3781
7
Schweter, S.
"BERTurk - BERT models for Turkish"
GitHub Repository (2020)
🔗 https://github.com/stefan-it/turkish-bert

Online Kaynaklar ve Araçlar

8
Hugging Face
"emrecan/bert-base-turkish-cased-mean-nli-stsb-tr"
Model Repository
🔗 https://huggingface.co/emrecan/bert-base-turkish-cased-mean-nli-stsb-tr
9
Facebook AI Research
"FAISS - A library for efficient similarity search"
GitHub Repository & Documentation
🔗 https://github.com/facebookresearch/faiss
10
Sentence-Transformers Team
"Sentence-Transformers: State-of-the-Art Text Embeddings"
Official Documentation
🔗 https://www.sbert.net/