Blog
·7 dk okuma·Seyit Ahmet Kutuzman

Telefon altyapısını neden kendimiz işletiyoruz

Sesli yapay zekâ ürünlerinin çoğu aynı yerden başlar: telefoni tarafını hazır bir sağlayıcıya bırak, sesi konuşma tanımaya ver, cevabı seslendirmeden geçir. Bu mimari çalışır — ta ki gerçek bir operatör şebekesine, gerçek bir Türkçe konuşmaya çarpana kadar. Biz sinyalleşme ve ses katmanını kendimiz işletiyoruz. Bu yazı, o kararın neye mal olduğu ve ne kazandırdığı hakkında.

Karar maliyetle ilgili değildi. Telefoni kalemi, bir sesli ajanın dakika maliyetinin en küçük parçasıdır. Karar, kontrol edemediğimiz bir katmanın ürünün en kritik özelliğini belirliyor olmasıyla ilgiliydi: konuşmanın doğal hissettirmesi ve çağrının hiç düşmemesi.

Sorun gecikme değil, gecikmenin nerede oluştuğu

Ses telefondan çıkar, operatörün şebekesinden geçer, bir medya sunucusuna ulaşır, oradan konuşma tanımaya, dil modeline, seslendirmeye gider ve aynı yoldan geri döner. Zincirin her halkası kendi payını ekler.

Yönetilen bir telefoni katmanı kullandığınızda bu zincirin ilk ve son halkaları size kapalıdır. Sesin hangi codec ile taşındığını, nerede yeniden örneklendiğini (resample), tampon boyutlarını göremezsiniz. Ölçebildiğiniz tek şey toplam süre, iyileştirebildiğiniz tek yer ortadaki model seçimidir. Bir noktadan sonra model değiştirerek kazanacağınız süre biter.

Bizim kazanç alanımız tam olarak orasıydı. Ses hattını uçtan uca 48 kHz çalıştırıp aradaki yeniden örnekleme adımlarını kaldırdığımızda, tek bir model değiştirmeden ölçülebilir bir iyileşme elde ettik. Bu, ancak kendi işlettiğiniz bir hatta yapabileceğiniz bir müdahaledir.

Türkiye şebekesi hazır davranışla çalışmıyor

En somut örnek: çağrı yönlendirme. SIP dünyasında X-Forwarded-For başlığı, adı üstünde, bir IP adresi taşır — çağrının hangi ara sunucudan geldiğini söyler. Açık kaynak telefoni yazılımları bu başlığı görünce kaynak adresi onunla değiştirir.

Türkiye'deki bazı operatörler bu başlığı amacı dışında kullanıyor: çağrı yönlendirmede içine IP değil, yönlendirilen telefon numarasını koyuyorlar. Sonuç, standart davranışta şu oluyor: kaynak adres bir telefon numarasıyla eziliyor, operatör ağ geçidi IP eşleşmesi bozuluyor ve yönlendirilen çağrı "tanımsız kullanıcı çağrısı" diye reddediliyor. Yani müşterinin santralinden yönlendirdiği çağrı hiç ulaşmıyor.

Bu bir hata değil, bir uyumsuzluk. Yazılım standarda göre doğru davranıyor; operatör standardın dışına çıkıyor. Arada kalan, çağrısı düşen işletme oluyor.

Bizim çözümümüz basit ama ancak sinyalleşme katmanı sizinse uygulanabilir: başlığı yalnızca gerçekten bir IP adresi taşıdığında dikkate al, telefon numarası taşıyorsa yok say. Üç satırlık bir düzeltme, aynı gün içinde çıktı. Yönetilen bir platformda bu düzeltmeyi yapamazsınız — destek talebi açar, sıraya girersiniz.

Ses kalitesi: 48 kHz Opus, düşmeyen bağlantı

Telefon şebekesinin varsayılanı dar banttır — 8 kHz. Sesli bir ajan için bu, konuşma tanımanın da seslendirmenin de eli kolu bağlı çalışması demek. Hattı Opus codec ile 48 kHz tam banda çıkardık ve şu ayarlarla çalıştırıyoruz:

  • Tam bant 48 kHz — hem gönderme hem alma yönünde pazarlık ediliyor, tek yönlü değil
  • İleri hata düzeltme (FEC) açık — paket kaybı olan şebekelerde ses kopmadan devam ediyor
  • Asimetrik örnekleme hızı desteği — karşı taraf PSTN üzerinden 8 kHz G.711 ile bağlandığında çağrı düşmüyor, kalite otomatik iniyor
  • Çağrı başına bit hızı pazarlığı — hat kalitesine göre uyarlanıyor
  • En yüksek karmaşıklık seviyesi — sesli AI için kaliteyi CPU'ya tercih ettik

"Bağlantıdan kopmadan" derken kastettiğimiz şey bu listenin ikinci ve üçüncü maddesi. Gecikmeyi düşürmenin kolay yolu sesi daha agresif sıkıştırmaktır; rakam güzelleşir, ses kötüleşir, paket kaybında çağrı düşer. Kaliteyi koruyarak ölçtüğümüz süreler ayrı bir yazıda.

Kendi yazdığımız katmanlar

  • SIP yönlendirici — gelen çağrıyı kaynağına göre (operatör mü, iç servis mi) doğru işleyiciye dağıtır
  • Operatör uyum katmanı — Türkiye'deki operatörlerin standart dışı davranışları için
  • Codec ve ses hattı yapılandırması — 48 kHz uçtan uca, gereksiz dönüşümler elenmiş
  • Yankı ve gürültü bastırma — hoparlörden dönen kendi sesimizi konuşma sanmamak
  • Söz kesme (barge-in) — müşteri konuşmaya başladığı anda ajanın susması ve üretilmiş sesin iptali
  • Duraksama yönetimi — "ııı", "eee" gibi düşünme seslerinde ajanın lafa girmemesi

Son madde küçük görünür ama Türkçe telefon konuşmasında en çok fark yaratan şeydir. İnsanlar cümle ortasında duraksar. Hazır bir konuşma sırası mantığı bu duraksamayı "konuşma bitti" sanar ve ajan lafa girer. Bir kere olduğunda müşteri karşısındakinin makine olduğunu anlar ve konuşmanın tonu değişir.

Bunun bedeli ne oldu

Dürüst olmak gerekirse: hız. Kendi telefoni katmanınızı işlettiğinizde, yönetilen bir platformun bir haftada eklediği entegrasyonu siz daha uzun sürede eklersiniz. Operatör tarafındaki her davranış değişikliğini kendiniz takip eder, kendiniz karşılarsınız. Bir şey bozulduğunda arayacağınız bir destek hattı yoktur — nöbetteki kişi sizsiniz.

Karşılığında elimizde şu var: bir müşteri "yönlendirdiğim çağrılar düşüyor" dediğinde, sebebini bulup düzeltmek için kimseden izin beklemiyoruz. Türkiye'de çalışan bir sesli AI ürünü için bu, konforlu bir tercih değil; zorunluluk.

AvaritCall'ın telefon ve ses altyapısı, Seyit Ahmet Kutuzman'ın özel mühendislik ürünüdür. Bu yazıdaki örnekler üretimde çalışan sistemden alınmıştır.

AltyapıTelefoniMühendislik

Diğer yazılar

Gecikme sayılarımız: ABD'de 0,45 sn, Avrupa'da 0,6 sn, Türkiye'de 0,8 sn

Sesli AI'da tek bir gecikme rakamı vermek yanıltıcıdır. Coğrafyaya göre değişir. Kendi ölçtüğümüz sayıları ve bu sayıların neyi kapsadığını paylaşıyoruz.

Türkçe sesleri neden kendimiz eğittik

Hazır seslendirme servisleri Türkçe'yi konuşabiliyor. Ama telefonda, gerçek bir konuşmanın içinde, hâlâ yabancı aksanlı bir Türkçe duyuyorsunuz. Sebebi ve çözümü.