Skip to main content
Uygulama Geliştirme•18 dk okuma

Sesli Yapay Zekâ Ajanlarında Gecikme Bütçesi: Sessizlikten İlk Sese

Mustafa Kürşad BaşerMustafa Kürşad BAŞER
•
Sesli Yapay Zekâ Ajanlarında Gecikme Bütçesi: Sessizlikten İlk Sese

Ajanı yavaşlatan çoğu zaman model değil, bekleme

Özet (TL;DR)

  • İnsanlar soru ile cevap arasında ortalama 200 milisaniye kadar bekliyor. Bir ses platformunun endpointing için varsayılan beklemesi tek başına bunun iki katı olabiliyor, yani bütçe daha model çalışmadan aşılıyor.
  • Kullanıcının duyduğu gecikme, sunucu kaydında gördüğünüzden büyüktür. Ses ağı iki kez geçer: müşterinin sesi size gelirken ve ajanın sesi ona dönerken. Telefon tarafındaki jitter tamponu da buna eklenir.
  • Aşamaları sırayla değil iç içe çalıştırın. STT, LLM ve TTS stream olarak birbirine bağlandığında ilk ses, son token beklenmeden çıkar.
  • Tool call içeren turda LLM iki kez çalışır. O turu ayrı ölçün ve tool çalışırken ajanı konuşturun.
  • Bütçeyi p50 ile değil p95 ile kurun. Aşama p95'lerinin toplamı, uçtan uca p95'ten büyüktür, ikisini karıştırmayın.

Müşteri "yarın öğleden sonra müsait misiniz?" diye soruyor ve susuyor. Hattın öbür ucundaki ajan bir buçuk saniye ses vermiyor. Müşteri hattın düştüğünü düşünüp "alo?" diyor, ajan da tam o anda cevaba başlıyor. İki ses üst üste biniyor, ajan sözünün kesildiğini sanıp duruyor, müşteri bir daha soruyor. Konuşma üç tur sonra hâlâ aynı sorunun üstünde.

Bu tabloda tek bir suçlu aramak yanıltıcı. Kullanıcının sustuğu an ile ajanın ilk sesi arasında altı ayrı kalem var ve her biri birkaç yüz milisaniye isteyebiliyor. HeyPilot'ta asistanlar VAPI üzerinden çalışıyor. Beyin, ses ve transkripsiyon sağlayıcıları takılıp çıkarılabiliyor: LLM tarafında OpenAI, Anthropic Claude, Google Gemini ve Groq, ses tarafında ElevenLabs, Play.ht, Azure, Cartesia ve Deepgram. Bu esneklik gecikmeyi tek bir sayı gibi düşünmeyi imkânsız kılıyor, çünkü her kombinasyonun bütçesi başka. O yüzden önce gecikme bütçesini (latency budget) kalemlerine ayıracağım, sonra her kalemi düşürmenin yolunu ve hepsini nasıl ölçeceğinizi göstereceğim.

Çıta: insan konuşmasında 200 milisaniye

Stivers ve arkadaşları 2009'da Japoncadan Danimarkacaya, beş kıtadan on dilde gündelik konuşma kayıtlarını inceledi. Soru ile cevap arasındaki boşluğun ortalaması bütün veri kümesinde +208 ms çıktı. En hızlı dil Japoncaydı (+7 ms), en yavaşı Danimarkaca (+469 ms). Her dilde dağılımın tepesi 0 ile +200 ms arasındaydı. Yani diller arasında fark var ama hepsi aynı şeyi yapıyor: üst üste konuşmaktan da uzun sessizlikten de kaçınıyor.

İkinci referans telekomdan geliyor. ITU-T G.114, ağzınızdan çıkan sesin karşı tarafın kulağına varma süresi için şunu söylüyor: tek yön gecikme 150 ms'nin altında kalırsa uygulamaların çoğunda etkileşim pratikte fark edilmez (metindeki ifadeyle "essentially transparent"). Genel ağ planlamasında ise 400 ms aşılmamalı. Bu iki sayıyı karıştırmamak gerekiyor. G.114 yalnızca iletimi ölçüyor, cevap düşünme süresi onun konusu değil. Sesli ajanda ise iletim bütçenin yalnızca bir parçası, üstelik iki kez ödeniyor.

Skantze'nin 2021 tarihli derlemesi de konuşma sistemlerinin iki tipik derdini adıyla koyuyor: sık sık söz kesmek ve uzun yanıt gecikmesi. İkisi aynı ayarın iki ucunda duruyor, birini düzeltirken öbürünü bozmak çok kolay.

Bütçenin altı kalemi

Aşağıdaki tablo kalemleri sırasıyla veriyor. Sayı verdiğim her yerin kaynağı var. Sağlayıcıya, modele ve bölgeye göre değişen kalemlerde ise sayı vermiyorum, onları kendi trafiğinizde ölçmeniz gerekiyor.

AşamaNe harcıyorDayanaklı referans
1. Ses yakalama ve ağPaketleme, yayılım, yönlendirmeRTP'de G.711 için varsayılan paket 20 ms. Fiberde 5 µs/km
2. VAD ve endpointingSessizlik eşiği ya da turn detection modeliVAPI'de varsayılan bekleme 0,4 sn
3. STT final sonucuFinal transkriptin oturmasıSağlayıcıya göre değişir, ölçün
4. LLM ilk tokenPrompt'un işlenmesi, kuyruk, ağModel, prompt boyu ve bölgeye göre değişir
5. TTS ilk ses parçasıİlk sesin senteziSes ve sağlayıcıya göre değişir
6. Telefon hattıTranscoding, jitter tamponuTampon tepe değerinin yarısı kadar ekler (G.114)

1. Ses yakalama ve ağ

Telefon sesi G.711 ile saniyede 8.000 örnek ve 64 kbit/s olarak taşınıyor. Codec'in kendisi neredeyse bedava, G.114'ün tablosunda PCM için IP ortamındaki işlem gecikmesi 0,25 ile 0,375 ms arasında. Maliyet paketlemede: RFC 3551 ses için varsayılan paket aralığını 20 ms koyuyor. 20 ms'lik ses birikmeden paket yola çıkamaz.

Yayılım için G.114'ün planlama değeri fiberde 5 µs/km. İstanbul ile Frankfurt arası kuş uçuşu yaklaşık 1.870 km, bu da tek yönde en az 9 ms eder. İstanbul ile Virginia arası yaklaşık 8.400 km ve en az 42 ms. Gerçek kablo güzergâhı her zaman daha uzundur, yani bunlar alt sınır. Mobil şebeke için aynı tablo 80 ile 110 ms veriyor, ama o tablo 2003'ün şebekeleri için yazıldı. Bugün sizin müşterinizin hattında bu değer başka olabilir.

2. VAD ve endpointing

Ses etkinliği algılama (VAD) yalnızca "şu an ses var mı" sorusunu cevaplar. Asıl karar endpointing'de, yani konuşmanın bitip bitmediğine hükmedilen adımda verilir: kullanıcı sustu mu, yoksa nefes mi alıyor? En basit yöntem sabit bir sessizlik eşiği. Eşik kısa olursa ajan söz keser, uzun olursa her tura aynı bekleme eklenir.

VAPI'nin konuşma ayarları sayfası bu kalemin ne kadar büyük olabileceğini açıkça gösteriyor. Asistanın kullanıcı sustuktan sonra konuşmaya başlamadan önce beklediği süre olan waitSeconds varsayılan olarak 0,4 saniye. Bu, insan ortalamasının iki katı ve daha hiçbir model çalışmadı. Teknik destek gibi düşünerek konuşulan aramalar için doküman 1 saniyenin üstünü öneriyor. Anlamsal tarafta LiveKit'in turn detection modeli var. Bekleme süresini "kullanıcı hâlâ konuşuyor" olasılığına bağlayan varsayılan fonksiyon 200 + 8000 * x, yani bekleme 200 ms ile 8,2 saniye arasında gidip geliyor. Transkripsiyona dayalı yöntemde de noktalama gelmezse 1,5 saniye beklenen bir örnek veriliyor.

Türkçe için bir uyarı: aynı doküman LiveKit'i İngilizce için, VAPI'nin kendi modunu İngilizce dışındaki diller için öneriyor. Türkçede yüklem cümlenin sonunda geliyor ve "yarın saat üçte... gelebilir miyim" gibi bir cümlenin ortasındaki duraksama, eşik tabanlı bir sistem için cümle sonundan farksız. Telefon numarasını ya da T.C. kimlik numarasını gruplar hâlinde okuyan müşteri de her grubun arasında duruyor. Bekleme süresini bu tür duraksamaları içeren kendi Türkçe kayıtlarınızla deneyerek seçin.

3, 4 ve 5. STT, LLM ve TTS

Bu üç kalemin ortak noktası, değerlerinin seçtiğiniz sağlayıcıya, modele, bölgeye ve o anki yüke bağlı olması. Benim burada vereceğim bir sayı sizin kombinasyonunuz için yanlış olur. Değişmeyen ilkeler şunlar:

  • STT'nin interim (ara) sonuçları hızlı gelir ama değişebilir. Final sonuç endpointing kararından sonra oturur. LLM'i interim sonuçla erken ısıtıp final sonuçla doğrulamak, bu kalemi önceki kalemle üst üste bindirmenin yoludur.
  • LLM'in ilk token süresi prompt'un uzunluğuyla büyür. Uzun bir system prompt, her tura eklenen bilgi bankası parçaları ve şişen konuşma geçmişi, modelin ilk kelimeyi söylemeden önce okuması gereken metni büyütür.
  • TTS doğal bir tonlama için biraz metne ihtiyaç duyar. Tek kelimeyle sentez başlatmak tonlamayı bozar. Bütün paragrafı beklemek ise gecikmeyi bozar. Doğru birim ilk cümle ya da ilk yan cümledir.

6. Telefon hattı

SIP trunk üzerinden gelen çağrıda ses taşıyıcıdan geçer, gerekirse transcoding yapılır ve alıcı tarafta bir jitter tamponuna girer. Paketler ağda farklı sürelerde yol aldığı için tampon onları sıraya dizip sabit bir akışa çevirir. G.114 planlama için tamponun, tepe boyunun yarısı kadar gecikme eklediğini varsaymayı öneriyor ve verdiği örnekte 50 ms'lik değişkenliği karşılayacak bir tampon ortalamada 25 ms ekliyor. Bu kalemi siz yönetmiyorsunuz ama bütçeden düşmeniz gerekiyor.

Kalemleri üst üste değil, iç içe koymak

Altı kalem sırayla çalışırsa gecikme toplamlarına eşit olur. Stream olarak bağlandığında ise her aşama, öncekinin ilk çıktısıyla işe başlar. LLM token üretirken TTS ilk cümleyi seslendirir, ilk ses parçası hatta giderken model hâlâ ikinci cümleyi yazıyor olabilir. Ölçtüğünüz şey artık toplam değil, ilk sesin varış anı.

Üstte STT, LLM ve TTS aşamalarının sırayla çalıştığı uzun bir çizelge, altta aynı aşamaların stream olarak üst üste bindiği ve ilk sesin çok daha erken çıktığı kısa bir çizelge
Sıralı ve streaming pipeline. Şematik, ölçek yok.

Node.js'te bu zinciri kuruyorsanız, aşamaları EventEmitter'larla ya da stream'lerle bağlamak doğal yoldur. EventEmitter yazısındaki desen burada da geçerli: her aşama "ilk parça hazır" olayını yayar, bir sonraki aşama onu bekler, son çıktıyı değil. Bunun dışında bütçeden kalıcı olarak düşebileceğiniz kalemler var:

  • System prompt'a cevabı kısa bir onayla açmasını yazın ("Tabii, bakıyorum."). TTS'in ilk parçası ne kadar kısa metinden üretilirse o kadar erken çıkar.
  • "Hmm" ya da "bir saniye" gibi kısa sesler, model düşünürken hattı canlı tutar. Önceden kaydedilmiş bir dolgu hiç TTS beklemez. Ama her turda çalarsa kısa sürede yapay duyulur.
  • İlk mesaj çoğu asistanda sabittir. Bir kez sentezleyip saklarsanız çağrının ilk turunda TTS kalemi sıfıra iner. Selamlamada müşterinin adı gibi değişken bir parça varsa sabit kısmı önbellekten, değişken kısmı canlı üretin.
  • Orkestrasyonu yapan sunucu İstanbul'daki müşteriyle Virginia'daki bir STT arasında gidip geliyorsa, her sıralı istek okyanusu iki kez geçer. Fiberin alt sınırıyla bile bu, gidiş dönüş en az 84 ms eder. Mümkünse sağlayıcıları ve orkestrasyonu aynı bölgeye, telefon taşıyıcısına yakın bir yere koyun.

Tool call sırasında sessiz kalmamak

HeyPilot'ta randevular görüşme sırasında VAPI tool call'larıyla alınıyor. Tool call içeren bir tur bütçeyi ikiye katlar: model önce tool'u çağırmaya karar verir, tool çalışır, sonra model sonucu okuyup asıl cevabı üretir. Yani o turda iki ayrı ilk token süresi ve arada bir HTTP isteği var. Bu sırada hat sessiz kalırsa müşteri yine "alo?" der.

VAPI'nin custom tools dokümanı tool çalışırken söylenecek mesajları tanımlamaya izin veriyor: istek başlarken, bittiğinde, hata verdiğinde ve geciktiğinde. "Takviminize bakıyorum" gibi bir başlangıç mesajı tool'un süresini doldurur. Tool'un kendisini de hızlı tutun. Argümanları Zod gibi bir şemayla baştan doğrulamak, modelin bozuk bir argümanla tool'u ikinci kez çağırmasını ve turun üçüncü bir LLM çağrısına uzamasını önler.

Barge-in: susmayı bilen ajan

Kullanıcı ajanın sözünü kestiğinde ajanın hemen susması gerekir. Bunun üç zor tarafı var. Birincisi, TTS'i durdurmak yetmez. Sesin bir kısmı zaten taşıyıcıya gönderilmiş ve tamponlarda bekliyor olabilir, onları da boşaltmanız gerekir. İkincisi, modelin konuşma geçmişine ajanın üretip söylemediği cümleler girmemeli. Yarıda kalan cevabı, gerçekten çalınan kısmına kadar kırpın. Yoksa model, müşterinin hiç duymadığı bir bilgiyi söylemiş gibi devam eder.

Üçüncüsü yanlış tetiklenme. Müşterinin "hı hı" ya da "evet" gibi dinlediğini gösteren kısa sesleri söz kesme değildir. Arka plandaki televizyon da değildir. VAPI'nin stopSpeakingPlan ayarları bu dengeyi kuruyor. Varsayılan olarak 0,2 saniyelik ses ajanı durdurmaya yetiyor (voiceSeconds), kelime sayısı eşiği 0 (numWords) ve ajan kesildikten sonra 1 saniye bekleyip yeniden başlıyor (backoffSeconds). Klinik randevusu gibi kısa onayların çok olduğu senaryolar için doküman 2–3 kelimelik eşik öneriyor.

Uyarı

Eko, yanlış tetiklenmenin sinsi bir türü. Ajanın kendi sesi müşterinin cihazından ya da hattan geri dönerse VAD onu müşteri konuşması sanır ve ajan kendi sesini duyunca susar. Telefon hattında bunu cihazın kendi eko engellemesi ve şebekedeki eko gidericiler (ITU-T G.168) yönetir. Tarayıcı üzerinden yapılan görüşmelerde mikrofonun eko engelleme seçeneğinin açık olduğundan emin olun.

Ölçüm: kayıttan ve p95 ile

Platformların gösterdiği aşama metrikleri faydalıdır ama kullanıcının deneyimini ölçmez, en dürüst ölçüm kayıt üzerinden müşterinin son sesi ile ajanın ilk sesi arasındaki boşluktur. VAPI arama bittiğinde kaydı iki kanallı olarak da veriyor (stereoRecordingUrl), kanal sırasını kendi kaydınızda bir kez doğrulayın. Müşteri bir kanalda, asistan öbüründe olunca boşluğu ölçmek basit bir enerji eşiği işine dönüyor:

python
# İki kanallı arama kaydında müşterinin sustuğu an ile asistanın ilk sesi# arasındaki boşluğu ölçer. Kanal 0: müşteri, kanal 1: asistan.# Kullanım: python3 bosluk_olc.py kayit.wav [esik_dbfs]import mathimport structimport sysimport wave CERCEVE_MS = 10EN_KISA_KONUSMA_MS = 120   # bundan kısa ses patlaması konuşma sayılmazBIRLESTIR_MS = 300         # bundan kısa sessizlik aynı konuşmanın parçası  def kanallar(yol):    with wave.open(yol, "rb") as w:        assert w.getsampwidth() == 2 and w.getnchannels() == 2, "16 bit stereo bekleniyor"        hiz = w.getframerate()        ham = w.readframes(w.getnframes())    ornekler = struct.unpack(f"<{len(ham) // 2}h", ham)    return hiz, ornekler[0::2], ornekler[1::2]  def bolumler(sinyal, hiz, esik_dbfs):    n = hiz * CERCEVE_MS // 1000    aktif = []    for i in range(0, len(sinyal) - n + 1, n):        parca = sinyal[i:i + n]        rms = math.sqrt(sum(x * x for x in parca) / n) or 1e-9        aktif.append(20 * math.log10(rms / 32768) > esik_dbfs)    ham, bas = [], None    for k, a in enumerate(aktif + [False]):        if a and bas is None:            bas = k        elif not a and bas is not None:            ham.append([bas * CERCEVE_MS, k * CERCEVE_MS])            bas = None    birlesik = []    for b in ham:        if birlesik and b[0] - birlesik[-1][1] < BIRLESTIR_MS:            birlesik[-1][1] = b[1]        else:            birlesik.append(b)    return [b for b in birlesik if b[1] - b[0] >= EN_KISA_KONUSMA_MS]  def yuzdelik(degerler, p):    s = sorted(degerler)    return s[max(0, math.ceil(p / 100 * len(s)) - 1)]  # en yakın sıra yöntemi  def main():    yol = sys.argv[1]    esik = float(sys.argv[2]) if len(sys.argv) > 2 else -45.0    hiz, musteri, asistan = kanallar(yol)    m, a = bolumler(musteri, hiz, esik), bolumler(asistan, hiz, esik)    bosluklar = []    for bas, son in m:        sonraki = next((x for x in a if x[0] >= son), None)        ustune = next((x for x in a if x[0] < son < x[1]), None)        if ustune:            print(f"{son / 1000:7.2f} sn  müşteri asistanın sözünü kesti")            continue        if sonraki:            bosluk = sonraki[0] - son            bosluklar.append(bosluk)            print(f"{son / 1000:7.2f} sn  boşluk {bosluk:5d} ms")    print(f"tur: {len(bosluklar)}  p50: {yuzdelik(bosluklar, 50)} ms  "          f"p95: {yuzdelik(bosluklar, 95)} ms  en kötü: {max(bosluklar)} ms")  if __name__ == "__main__":    main()

Betiği denemek için bilinen boşluklarla yapay bir iki kanallı kayıt ürettim. Gerçek bir arama değil, beşinci turda tool call'u taklit eden uzun bir boşluk var. Ölçüm, verilen boşlukları birebir geri buluyor:

bash
$ python3 bosluk_olc.py test.wav2.30 sn  boşluk   640 ms   7.14 sn  boşluk   710 ms  12.65 sn  boşluk   820 ms  17.87 sn  boşluk   690 ms  23.46 sn  boşluk  2350 ms  29.91 sn  boşluk   760 ms  35.57 sn  boşluk   650 ms  39.62 sn  boşluk  1480 ms  45.20 sn  boşluk   700 ms  51.50 sn  boşluk   730 mstur: 10  p50: 710 ms  p95: 2350 ms  en kötü: 2350 ms

Burada iki ders var. Medyan 710 ms ve on turun sekizi buna yakın, ama müşterinin hatırlayacağı tur 2.350 ms'lik olan. Ortalamaya ya da medyana bakan bir panel bu turu gizler. İkinci ders kaydın nerede alındığıyla ilgili. Platformun kaydı sunucu tarafında alınır. Müşterinin sesinin size gelişi, ajanın sesinin ona dönüşü ve telefonun jitter tamponu bu kayıtta görünmez. Kullanıcının gerçekten yaşadığı süre bu sayının üstüne iki ağ yolu ve bir tampon ekler. Bunu görmek için arada bir gerçek bir telefondan arayıp görüşmeyi cihaz tarafında kaydedin ve aynı betiği o kayda da uygulayın.

Kaydın söylemediği şey, zamanın nereye gittiği. Bunun için her turda aşama zaman damgalarını loglayın ve damgaları tek bir saatten alın, çünkü farklı sunucuların saatleri birbirinden kayabilir. Logdaki epoch değerlerini okurken Unix zaman damgası dönüştürücüsü işinizi görür. Aşağıdaki betik bu logdan bütçe tablosu çıkarıyor:

python
# Her tur için aşama zaman damgalarından gecikme bütçesi çıkarır.# Girdi: JSON Lines, her satır bir tur. Alanlar çağrı başından itibaren ms.# Kullanım: python3 butce.py turlar.jsonlimport jsonimport mathimport sys ASAMALAR = ["konusma_sonu", "stt_son", "tur_karari",            "llm_ilk_token", "tts_ilk_ses", "hatta_ilk_ses"]  def yuzdelik(degerler, p):    s = sorted(degerler)    return s[max(0, math.ceil(p / 100 * len(s)) - 1)]  turlar = [json.loads(satir) for satir in open(sys.argv[1], encoding="utf-8")]sureler = {f"{a} -> {b}": [t[b] - t[a] for t in turlar]           for a, b in zip(ASAMALAR, ASAMALAR[1:])}toplam = [t[ASAMALAR[-1]] - t[ASAMALAR[0]] for t in turlar] print(f"{'aşama':<30}{'p50':>7}{'p95':>7}")for ad, d in sureler.items():    print(f"{ad:<30}{yuzdelik(d, 50):>7.0f}{yuzdelik(d, 95):>7.0f}")print(f"{'uçtan uca (sunucu tarafı)':<30}{yuzdelik(toplam, 50):>7.0f}{yuzdelik(toplam, 95):>7.0f}")print(f"aşama p95'lerinin toplamı: {sum(yuzdelik(d, 95) for d in sureler.values()):.0f} ms")en_kotu = sorted(turlar, key=lambda t: t[ASAMALAR[-1]] - t[ASAMALAR[0]])[-1]pay = max(sureler, key=lambda ad: en_kotu[ad.split(" -> ")[1]] - en_kotu[ad.split(" -> ")[0]])print(f"en yavaş tur: {en_kotu['tur']}, en büyük pay: {pay}")

Betiği 400 turluk yapay bir logla çalıştırdım. Dağılımları ben seçtim, hiçbir sağlayıcının ölçümü değiller. Amaç yalnızca p95'in nasıl davrandığını göstermek:

bash
$ python3 butce.py turlar.jsonlaşama                             p50    p95konusma_sonu -> stt_son           153    301stt_son -> tur_karari             404    554tur_karari -> llm_ilk_token       462   1046llm_ilk_token -> tts_ilk_ses      206    393tts_ilk_ses -> hatta_ilk_ses       30     50uçtan uca (sunucu tarafı)        1296   1858aşama p95'lerinin toplamı: 2344 msen yavaş tur: 358, en büyük pay: tur_karari -> llm_ilk_token

Son iki satıra dikkat edin. Aşamaların p95'lerini toplarsanız 2.344 ms bulursunuz, oysa uçtan uca p95 1.858 ms. Her aşamanın kötü günü aynı turda gelmiyor. Bütçeyi aşama p95'lerinin toplamıyla kurmak sizi gereğinden temkinli yapar. Uçtan uca p95'i hedef alıp aşamaları ona göre paylaştırmak daha gerçekçi. En yavaş turun en büyük payı hangi aşamada, o da son satırda yazıyor. İyileştirmeye oradan başlayın.

Sonuç

Bir hedef koyun ve onu kullanıcının kulağında ölçün: "sustuktan sonra ilk sese p95". Sonra bütçeyi kalemlerine dağıtın ve işe model değiştirerek değil, bekleme süresinden başlayın. Varsayılan 0,4 saniyelik bekleme her turda, her müşteriye, hiçbir modelin hızlandıramayacağı biçimde ödenir. Onu Türkçenin ritmine göre ayarlamak, ilk sesi önbellekten çalmak ve tool call turunu konuşarak doldurmak, daha hızlı bir LLM'e geçmekten önce gelir.

Sıkça Sorulan Sorular

Gerçek zamanlı speech-to-speech modeller bu bütçeyi ortadan kaldırır mı?
STT, LLM ve TTS'i tek modelde birleştirdikleri için o üç kalem arasındaki bekleme ve aktarma kalkar. Ağ yolu, telefon hattı, endpointing kararı ve tool call ise olduğu yerde kalır. Karşılığında her aşama için ayrı sağlayıcı seçme imkânını ve aşamaları ayrı ayrı ölçebilmeyi kaybedersiniz.
p95'e güvenmek için kaç tur ölçmem gerekir?
En yakın sıra yöntemiyle on turda p95 en kötü turun kendisidir. Yukarıdaki örnekte p95 ile en kötü değerin aynı çıkması bundan. Yirmi turda p95 ikinci en kötü değerdir. Tek bir uç değer sonucu belirlemesin istiyorsanız en az birkaç yüz tur toplayın ve tool call içeren turları ayrı bir grup olarak raporlayın, çünkü iki grubun dağılımı farklıdır.
Önceden kaydedilmiş dolgu sesi ile TTS'e ürettirilen dolgu arasında ne fark var?
Kayıtlı dolgu anında çalar, TTS kalemi sıfırdır. Bedeli ses uyumu: kaydın tını ve hızı asistanın sentez sesiyle aynı olmalı, yoksa müşteri iki farklı kişi duyar. Ses sağlayıcısını ya da sesi değiştirdiğinizde bütün dolgu kayıtlarını yeniden üretmeniz gerekir. Sağlayıcıların takılıp çıkarılabildiği bir yapıda bu kayıtları ses kimliğine bağlı bir önbellekte tutmak işi kolaylaştırır.
Tarayıcıdan yapılan sesli görüşmenin bütçesi telefonla aynı mı?
Hayır. WebRTC görüşmesinde taşıyıcı, SIP trunk ve çoğu transcoding adımı aradan çıkar ve tarayıcının kendi jitter tamponu ile eko engellemesi devreye girer. Buna karşılık kullanıcının Wi-Fi bağlantısı değişkenliği artırabilir. İki kanalı ayrı ölçün. Web widget'ı ile telefon numarası aynı asistanı kullanıyor olsa bile p95'lerin aynı çıkmasını beklemeyin.

Kaynakça

Bu yazıyı paylaş

Mustafa Kürşad Başer
Yazar

Mustafa Kürşad Başer

Kıdemli Yazılım Mühendisi

Karmaşık sorunlara zarif çözümler üretmekten keyif alan, tutkulu bir yazılım mühendisi. Kodlamanın ötesinde, teknoloji, sanat ve insan bilincinin kesişim noktalarını keşfetmekle derinden ilgileniyor.