İçeriğe geç
HA_

← Tüm yazılar

· 3 dk okuma

Konuşmayı kaynağında düzeltin

Urduca transkriptlerdeki çöpü temizleyen bir filtrenin neden gerçek konuşmayı da sildiği ve kötü transkripsiyonun çözümünün neden bir sesli asistanın metinle sonradan ne yaptığında değil, nasıl duyduğunda yattığı.

voice-aiarchitecture

Makine çevirisi. Orijinalini okuyun

VoxRange, gerçek telefon çağrılarını Urduca ve insanların gerçekten konuştuğu, dil değiştirmeli Urduca-İngilizce karışımında yanıtlayan yapay zeka asistanları çalıştırıyor. Baş mimarı benim. Bu yazı, o pipeline’ın duyma kısmında yaptığımız bir hatayı ve bundan çıkardığım kuralı anlatıyor.

Belirti

Urduca çağrılarda konuşmadan metne dönüştürme, Urduca transkriptlerin ortasında sürekli olarak dağınık Latin alfabeli metinler üretiyordu. Dar bantlı telefon sesi, karışık diller ve isimler transkripsiyonu zaten zorlaştırıyor ve bu parçalar durumu daha da kötüleştiriyordu: transkript ne diyorsa asistan ona yanıt veriyor.

Akla gelen ilk çözüm çıktıyı temizlemekti. Bir asistan Urduca için ayarlanmışsa ve bir parça Latin alfabesiyle geliyorsa, asistan görmeden onu at.

Filtre neden yanlıştı

Filtre çalıştı, yani çöp ortadan kalktı. Gerçek konuşma da kalktı.

Arayanlar tek bir alfabenin içinde kalmaz. Urducanın büyük bir kısmı Roman Urdu olarak Latin harfleriyle yazılır ve gündelik konuşmaların çoğu bir kelime ya da bütün bir ifade için İngilizceye geçer. Uydurma bir örnek: "mera appointment confirm kar dein" sıradan bir istektir ve her kelimesi Latin harfleriyle yazılmış gerçek konuşmadır. Latin alfabeli metni silen bir kural bu cümleyi gürültüden ayırt edemez, çünkü kural çalıştığında değerlendirilecek tek şey alfabedir ve sorun alfabe değildir.

Filtreyi geri aldık. Daha dar bir filtre kaldı: bu çağrılarda makul olarak gerçek konuşma olamayacak alfabeler, örneğin Kiril ya da CJK karakterleri, hâlâ atılıyor, çünkü onları silmenin gerçek bir bedeli yok.

Çöp aslında nereden geliyor

Dağınık parçalar, duyma aşamasının hatalı davrandığının bir belirtisiydi; dolayısıyla çözüm de oraya ait:

  • Konuşma sonu tespiti. Ses etkinliği tespiti, arayanın konuşmayı ne zaman bitirdiğine karar verir. Çok erken karar verirse bir konuşma sırası parçalara bölünür ve bir kelimenin parçası, bir konuşma modelinin kendinden emin bir saçmalığa dönüştürdüğü türden bir sestir.
  • Dil sabitleme. Modelin her kısa klipte tahmin yürütmesine izin vermek yerine hangi dili beklemesi gerektiğini söylemek, bir gürültü patlamasında başka bir dile kaymasını önler.
  • Kelime dağarcığı. Modelin hiç görmediği isimler, yerler ve alana özgü kelimeler, isabete yakın tahminler olarak geri gelir. Modele duyacağı kelimeleri vermek, tahminleri onarmaktan daha ucuzdur.

Bunların her biri modelin ne duyduğunu ya da ne beklediğini değiştirir. Hiçbiri arayanın söylediği hiçbir şeyi atmaz.

İlgili ders: ayarların kayması

Konuşma sonu tespiti tek bir değere bağlıdır: arayanın bitirdiğine karar vermeden önce ne kadar sessizlik bekleneceği. Bu değeri daha önceki çağrı sorunlarından sonra ayarlamıştık. Sonraki bir çağrıda değer yeniden agresif bir seviyeye dönmüştü ve asistan arayanların sözünü cümle ortasında kesiyordu. Başta kötü transkriptlere yol açan parçalanmış konuşma sıraları da geri gelmişti.

Değer yalnızca bir sunucunun ortamında duruyordu. Kodda ya da geçmişinde ayarlanmış değeri tutan hiçbir şey yoktu, dolayısıyla değişmesini engelleyen de hiçbir şey yoktu. Bunun gibi bir ayar değeri, onu okuyan kodun yanında, sürüm kontrollü yapılandırmada ve neden o değere ayarlandığına dair bir notla birlikte durmalı:

# voice-runtime config, versioned with the code
# How long to wait in silence before ending the caller's turn.
# Too short cuts callers off and fragments transcripts.
END_OF_SPEECH_SILENCE_MS: <tuned value>

Aynı çağrı ikinci bir şey daha öğretti. Bir konuşma sırasındaki ölü sessizlik birkaç aşamanın toplamıdır: konuşma sonunu beklemek, transkripsiyon, bilgi getirme, LLM ve konuşma sentezi. Bunların bazılarının süresi ölçülüyordu, birininki ölçülmüyordu. Bir konuşma sırasının her aşaması ölçülmeden neyin optimize edileceğine karar veremezsiniz, çünkü ölçmediğiniz aşama, sonunda hakkında tahmin yürüteceğiniz aşamadır.

Aynı şeyi inşa eden birine ne söylerdim

  1. Bir model çöp ürettiğinde, onu silecek bir kural yazmadan önce buna neden olan aşamayı bulun. Çıktı filtreleri nedenleri göremez.
  2. Herhangi bir temizleme kuralına güvenmeden önce onu, dil değiştirme dahil, gerçek ve dağınık konuşmayla test edin.
  3. Ayar değerlerini yalnızca bir sunucunun ortamında değil, gerekçesiyle birlikte sürüm kontrollü yapılandırmada tutun.
  4. Herhangi birini optimize etmeden önce bir konuşma sırasının her aşamasını ölçün.