Kayıttan önceki ilk ses saniyesinden önce alınmış onay ile Romence ve Rusça konuşmayı metne dönüştürme.
Sesi gerçek zamanlı veya dosyadan yazıya döküyoruz, müşteri görüşmelerinde Romence ile Rusça arasında çeviri yapıyoruz ve metni zaman damgaları, ses dışa aktarımı ve bir onay iziyle teslim ediyoruz. Konuşma tanımayı sağlayıcılar üzerinden, kendi gateway'imiz aracılığıyla çalıştırıyoruz; kendi Romence modelimiz araştırmadır, ürün değil.
Zaten kurduklarımızDouă implementări proprii, ambele deschise și citate. Prima e o aplicație de transcriere în flux, cu backend Express de 3.378 de linii în 25 de fișiere și 37 de teste pe care le-am rulat azi — toate trec; ea conține partea pe care nimeni nu o construiește din entuziasm: o poartă de consimțământ care refuză captura când nu există acord înregistrat. A doua rulează în producție, la clienți reali: mesajele vocale primite pe canalele de mesagerie sunt transcrise, iar răspunsul scris de un operator în română este rescris în limba clientului înainte de a pleca. Ce NU intră în „delivered” și e scris ca atare în pagină: modelul propriu de recunoaștere și sinteză în română este cercetare — nu are demonstrație publică, nu are interfață de programare, iar pe acuratețe în română pierde față de sistemele comerciale mari. Serviciul se vinde pe ce rulează, nu pe ce studiem.
Transkripsiyon, Romence’de iki konuşmacı birbirini bölüyor, sayılar hızlı söyleniyor ve bir müşteri cümlenin ortasında Rusçaya geçiyor olana kadar çözülmüş gibi görünür. O zaman üç gerçek sorun ortaya çıkar: karşınızdaki dil için hangi modeli seçersiniz, bir konuşma turunun nerede bittiğini nasıl anlarsınız ve sizi kaydetmeye kim izin verdi? Üçüyle de ilgileniyoruz ve sonuncusunu politika paragrafı olarak değil, kod sorunu olarak ele alıyoruz.
Akış içi transkripsiyon uygulamamızda tarayıcı hiçbir zaman sağlayıcı anahtarını almaz. Backend’den, varsayılan olarak on beş dakika geçerli tek kullanımlık bir jeton ister; bu jetonla transkripsiyon bağlantısını açar. Jeton veren rota varsayılan olarak kapalıdır ve yalnızca üretim dışı açık bir ayarla açılabilir; çünkü bu, paranın tüketildiği rotadır. Ham transkripsiyonun üzerinde bir dil modeli analizi çalışır; birinin kullanılamaması oturumu durdurmasın diye yedek modellerin sıralı bir listesi vardır.
Özellikle önem verdiğimiz kısım izin kapısıdır. Herhangi bir ses parçasını kabul etmeden önce sunucu, ilgili oturum için iptal edilmemiş bir onay satırı ister. Yoksa 451 ile ve Rumence bir mesajla yanıt verir. Veritabanı yanıt vermezse, her şeyi reddeder — 503, “geçmesine izin ver” değil. Zaten doğrulanmış oturumlar on dakikalık bir önbellekten geçer, böylece kısa bir kesinti devam eden bir kaydı bölmez. Bir yapılandırma hatasıyla aşılmasın diye yazılmıştır.
Müşterilerde zaten çalışan kısım farklıdır ve daha az gösterişlidir: mesajlaşma kanallarında alınan bir sesli mesaj metne dönüşür ve dil, ses dosyasından tahmin edilerek değil, konuşmanın son sekiz mesajına oy vererek seçilir. Ters yönde, bir çalışma arkadaşı Romence yanıt verdiğinde, onun metni müşterinin diline sıkı talimatlarla yeniden yazılır — bilgi eklemez, fiyat veya süre uydurmaz, operatöre karşı çıkmaz ve operatör metnini yalnızca aktarılacak veri olarak işler, asla model için talimat olarak değil.
Neleri kapsıyor
Çalışma, bileşenlerine ayrılmış hâliyle
Ses öncesi doğrulanmış onay
Rıza kapısı, geçerli oturum için rıza defterinde iptal edilmemiş bir satır ister. Bu olmadan: 451, Romence mesajla. Veritabanı çöktüğünde: 503, yani ret, geçiş değil. Zaten doğrulanmış oturumlar 10 dakikalık bir önbellekten geçer, böylece doğrulama her ses parçasında veritabanına vurmaz.
Tek kullanımlık jeton, anahtar sunucuda kalır
Sayfa, gerçek zamanlı transkripsiyon için arka uçtan bir jeton ister; varsayılan olarak 900 saniye geçerlidir ve bununla sağlayıcıya bağlantı açar. Hesap anahtarı hiçbir zaman tarayıcıya ulaşmaz. Sağlayıcıya istek 30 saniyelik zaman aşımına sahiptir ve bu sürenin aşılması sonsuz bekleme değil, açık bir hata döndürür.
Akış halinde transkripsiyon, bağlamdan seçilen dille
Üretimde, mesajlaşma kanallarında sesli mesajın dili son sekiz konuşma mesajı üzerinden oyla belirlenir — Rusça baskınsa Rusça, aksi halde Romence — ve ancak ondan sonra tanıma çağrılır; dil ipucu açıkça iletilir. Dosya biçimi uzantıdan değil, ilk 12 bayttan tanınır, çünkü Meta kanallarındaki sesli mesajlar nasıl adlandırılırlarsa adlandırılsınlar `ogg` olarak gelir.
Operatör → müşteri çevirisi, sınırları promptta yazılı
Bir meslektaş iç bir başlıkta Romence yanıt verdiğinde, müşteriye giden mesaj müşterinin dilinde yeniden yazılır. Kurallar kodda açıktır: bilgi eklemez, ayrıntı, fiyat, saat veya vaat uydurmaz, operatöre karşı çıkmaz ve operatörün metni model için talimat olarak değil, yalnızca iletilecek veri olarak ele alınır — stil ifadesi değil, komut enjeksiyonuna karşı bir önlem.
Transkript üzerinde analiz, sırayla yedek modellerle
Ortaya çıkan metin üzerinde bir dil modeli analizi çalışır; kodda sıralı bir alternatif model listesi vardır, böylece bir erişilemezlik kaliteyi düşürür, oturumu durdurmaz. Analiz modeli yapılandırmadan değiştirilebilir, yeniden devreye alma olmadan.
Üç biçimde ses dışa aktarımı, açık başarısızlıkla
WAV dış araçlar olmadan üretilir. FLAC ve MP3 `ffmpeg` ister; eksikse sunucu gerekçesiyle 501 döner ve işlem takılırsa 60 saniye sonra durdurulur ve hatanın ilk iki bin karakteriyle 504 döner. Başarısız olan bir dışa aktarma nedenini söyler.
Kota ve maliyetten ayrı sayım
Harcanan dakikalar veritabanında atomik olarak bir prosedürle düşülür ve maliyet sağlayıcı bazında ayrı bir deftere yazılır. Bunlar iki farklı şeydir ve farklı bozulur: maliyet satırı oturuma bağlanamazsa, maliyet bilgisinin kaybolmaması için ilişkisiz olarak kaydedilir.
Kullanıcı başına ve adres başına değil, üç trafik eşiği
Jeton verme, analiz ve dışa aktarma ayrı sınırlara sahiptir ve sayım anahtarı varsa doğrulanmış kullanıcıdır, IP adresi değil — aksi halde ortak bir ağın arkasındaki tek saldırgan kullanıcı tüm meslektaşlarının kotasını tüketirdi.
Mevcut akışta, mesajlaşma kanallarında transkripsiyon
Bir müşteriden alınan sesli mesaj, başka bir araç açılmadan aynı konuşmada metne dönüşür. Tanıma ve sentez doğrudan sağlayıcıya değil, bizim ağ geçidimizden geçer; dolayısıyla tüketim diğerlerinin yanında aynı yerde görünür.
Nasıl görünüyor
Süreç, adım adım.
01
Herhangi bir koddan önce kayıt hakkını belirleriz
Kim konuşuyor, kim bilgilendiriliyor, kim onay veriyor, kim kaydı saklıyor ve ne kadar süreyle. Sonuç, bir çekmecede duran bir belge değil, kapının yapılandırmasıdır: müşteri durumunda tam olarak ne anlama geldiğiyle „mevcut onay” ve eksik olduğunda ne olduğu.
02
Dili ve ses koşullarını dikkate alarak zinciri seçiyoruz
Romence ve Rusça farklı davranır; sıkıştırılmış bir telefon görüşmesine karşılık bir masa mikrofonu da öyle. Model seçimi, dil indisi ve segmentasyon stratejisi, temiz bir demoya değil, müşterinin gerçek materyalinden alınan örnekler üzerinde yapılır.
03
Akışı baştan sona kuruyor ve bilerek bozuyoruz
Jeton, bağlantı, transkripsiyon, analiz, dışa aktarma. Sonra gerçekten yaşanan durumları kontrol ediyoruz: eksik onay, oturumun ortasında çöken veritabanı, süresi dolmuş jeton, `ffmpeg` yok, sağlayıcı kullanılamaz. Her biri neyin bozulduğunu söyleyen bir mesaj vermelidir.
04
Sayaçlar ve sınırlar açık şekilde teslim ediyoruz
Dakika sayımı, maliyet kaydı, kullanıcı başına trafik eşikleri ve günlükler. Bunlar olmadan, ilk olay hafızadan konuşulur.
Cinci pași, în ordinea în care se execută: acordul verificat în registru (fără el, drumul se oprește aici); jetonul de unică folosință emis de server, cu cheia rămasă pe server; transcrierea în flux la furnizor; analiza peste transcript, cu modele de rezervă în ordine; exportul textului și al audio-ului. Primul pas e singurul care poate opri tot restul, și e desenat ca poartă, nu ca etapă.
Veriler
Neye dokunuyoruz, nerede duruyorlar ve ne kadar kalıyorlar
Veri koruma sorumlusu olan herkesin soracağı sorular — o sormadan önce burada sorulmuş hâliyle.
Onay kayıtları
Oturum başına bir satır, çalışma alanı, oturum kimliği ve iptal anı ile; onay geçerli olduğu sürece alan boş kalır. Doğrulama tam olarak iptalin yokluğunu arar. Ses kaydetme hakkı için tek doğruluk kaynağıdır ve yalnızca kayıt sırasında değil, her oturumdan önce sorgulanır.
Ses, transcript ve analiz
Ham ses, transkripsiyon bağlantısı üzerinden sağlayıcıya gider; bizde saklanan şey transcript, zaman damgaları ve analiz sonucudur, ayrıca kullanıcının istediği dışa aktarımlardır. Tam olarak neyin saklandığı ve ne kadar süreyle saklandığı, ilk kayıt öncesinde proje bazında belirlenir — bir kurul, bir tıbbi toplantı ve bir ticari arama için yanıtlar aynı değildir.
Ses nereye gidiyor ve kime
Konuşma tanıma sağlayıcılarına ve analiz modeline, bizim gateway üzerinden. Liste, başlatmadan önce sözleşmede her birinin adıyla yazılır; çünkü beyan edilmemiş bir alt işleyici teknik bir eksiklik değil, hukuki bir sorundur.
Tüketim kaydı
Tüketilen dakikalar veritabanında atomik olarak düşülür ve maliyet oturum ve sağlayıcı bazında ayrı yazılır. Bunlar iki ayrı kayıt tam da birindeki hatanın diğerini bozmasını önlemek içindir.
Dokunmadıklarımız
Müşteri kayıtları üzerinde model eğitmiyoruz ve bir ses sağlayıcısının çıktısını rakip bir model kurmak ya da test etmek için kullanmıyoruz — bu, kullandığımız sağlayıcının şartlarında açıkça yasaktır ve teknik olarak uygun olsa bile uyduğumuz bir sınırdır.
Bir vaka
Başlamayan bir oturum ve bunun neden doğru davranış olduğu
Durum
Birden fazla katılımcılı bir toplantı senaryosu; transkripsiyonun tarayıcıdan başlaması gerekiyordu ve kaydın saklanması planlanıyordu. Çoğu transkripsiyon aracının bozulduğu durum: biri, katılımcıların onayı bir yere kaydedilmeden önce „kaydet”e basar.
Ne kurduk
Onay kontrolünü, bir uyarı ekranında değil, isteğin akışı üzerinde yaptık. Sunucu, ilk ses parçasını kabul etmeden önce mevcut oturum için geri alınmamış bir onay satırı arar. Arıza durumundaki davranışı da bilerek yazdım: onayları tutan veritabanı yanıt vermezse, istek 503 ile reddedilir, geçmesine izin verilmez. Zaten doğrulanmış oturumlar on dakika boyunca bir önbellekte kalır; böylece kısa bir kesinti devam eden bir kaydı bölmez. Sağlayıcıya jeton veren rota varsayılan olarak kapatıldı; yalnızca üretim dışı bir ayarla açıkça açılabilir.
Ne çıktı
Kayıtlı bir onay olmadan yakalama 451 ve Rumence bir mesaj döndürür, olay oturum ve çalışma alanıyla günlüklenir. Davranış, onayın enjekte edilmesiyle veritabanı olmadan çalışan testlerle kapsanır. Backend paketi 37 test içerir; bugünkü çalıştırmada hepsi geçer.
Vakanın söylemedikleri
Uygulama yayınlanmış değil — bizim tarafımızda çalışıyor, kayıt olabileceğiniz bir sayfası yok ve belirli bir görüşmeyi kaydetme hakkı müşteriye aittir: biz bunu teknik olarak uygularız, vermeyiz. Bir sınırlama daha var: geçit, onayın varlığını denetler, hukuki niteliğini değil. Onay metni kötü yazılmışsa, kod onu aynen uygular.
Sorular
İnsanların aramadan önce bize sordukları
Hangi dilleri yazıya geçiriyorsunuz?
Rumence ve Rusça ile çalışıyoruz, çünkü gerçek sorunlarımızın ortaya çıktığı ve kendi materyalimiz üzerinde doğrulayabildiğimiz diller bunlar. Diğer diller teknik olarak aynı sağlayıcılar üzerinden mümkündür, ancak bir şey vaat etmeden önce sizin kayıtlarınız üzerinde bir deneme yaparız — bir dilin çalışıp çalışmaması sağlayıcı sayfasındaki listeye değil, sese bağlıdır.
Rumence için kendi konuşma tanıma modeliniz var mı?
Araştırmada var, üründe değil, ve bu ikisini karıştırmamak önemli. Kendi yönümüzün kamuya açık bir demosu yok, uygulama programlama arayüzü yok ve telefonisi yok; ayrıca Rumence tanıma doğruluğunda ölçümlerimiz büyük ticari sistemlerin gerisinde kaldığımızı gösteriyor. Bunu yayımlıyoruz çünkü bu, kendi test düzeneğimiz üzerinde elde ettiğimiz sonucumuz. Bugün sattığımız hizmet, sağlayıcılar üzerinde, bizim gateway’imiz aracılığıyla çalışıyor.
Bir görüşmeyi kim kaydedebilir ve yetkisi yoksa ne yaparsınız?
Hak, kuruluma başlamadan önce müşteriyle duruma göre belirlenir — bizim aktarabileceğimiz bir şey değildir. Bizim yaptığımız şey bunu kodda uygulamaktır: mevcut oturum için kaydedilmiş onay olmadan sunucu yakalamayı 451 ve Rumence bir mesajla reddeder. Onayları tutan veritabanı yanıt vermezse, o durumda da 503 ile reddeder. Onayın yokluğunu sessiz geçişe dönüştürecek bir ayar yoktur.
Sağlayıcıdaki anahtarım tarayıcıya gelir mi?
Hayır. Sayfa, yazıya döküm oturumu için backend’den tek kullanımlık bir jeton ister; bu jeton varsayılan olarak 900 saniye geçerlidir ve bağlantıyı onunla açar. Hesap anahtarı sunucuda kalır. Ayrıca jeton veren rota varsayılan olarak kapalıdır ve yalnızca üretim dışı açık bir ayarla açılabilir, çünkü bu rota para harcar.
Yazıya döküm ne kadar doğru?
Bu, modelden çok sese bağlıdır: mikrofon, üst üste konuşmalar, rakamlar, özel adlar, arka plan gürültüsü. Materyalinizi duymadan size bir oran vermiyoruz, çünkü bir ürün fişinden alınmış bir oran sizin toplantılarınız hakkında hiçbir şey söylemez. Yaptığımız şey, gerçek kayıtlar üzerinde bir denemedir; hataları da ortaya koyarız — genelde rakamlarda ve adlarda bozulur, cümlelerde değil.
Operatör ile müşteri arasında gerçek zamanlı konuşmaları çeviriyor musunuz?
Evet, ve üretimde zaten tek bir yönde çalışıyor: ekip arkadaşınız yanıtı Rumence yazar, mesaj müşteriye müşterinin dilinde gider. Kurallar kodda katıdır — eklenmiş bilgi yok, uydurulmuş fiyat veya süre yok, operatöre ters düşme yok. Ters yön, müşteriden operatöre olan kısım, bugün sesli mesajların yazıya dökülmesiyle çözülüyor; müşterinin metnini operatöre otomatik çeviri her yerde açık değil ve bunu sonra değil, önceden söylüyoruz.
Hangi ses formatlarını kabul ediyorsunuz ve ne geri alıyorum?
Format, uzantıdan değil dosyanın içeriğinden tanınır — WAV, OGG, MP3 ve M4A açıkça işlenir, mesajlaşma kanallarındaki sesli mesajlar ise genelde OGG olarak gelir. Transcripti alırsınız, istenirse analizi ve dışa aktarılmış sesi: `ffmpeg` sunucuda varsa bağımsız WAV, FLAC ve MP3. Yoksa sunucu bunu özel bir kodla söyler, genel bir hatayla başarısız olmaz.
Modellerinizi eğitmek için kayıtlarımızı kullanıyor musunuz?
Hayır. Ayrıca, rakip bir modeli eğitmek veya test etmek için ses sağlayıcılarının çıktısını da kullanmıyoruz — kullanım koşulları bunu açıkça yasaklıyor ve biz, kendi araştırma yönümüz açısından da, bunu yapmamanın bize rahat geleceği yerlerde bile, buna uyuyoruz.
Transkripsiyon sağlayıcısı bir toplantının ortasında çöktüğünde ne olur?
Oturum, boş bir ekranla değil, nedeni adlandıran bir hatayla durur. Analiz için kodda sıralı bir yedek model listesi vardır, bu yüzden orada kullanılamazlık akışı durdurmak yerine kaliteyi düşürür. Gerçek zamanlı konuşma tanıma için sağlayıcılar arasında otomatik yedekliliğimiz yoktur ve bu gerçek bir sınırlamadır, eksiklik değil.
Bunlardan 13 tanesi depolarımızdaki kod ve dosyalardır. Adlarını ya da satırlarını yayımlamıyoruz: hepsi bir arada, tek bir sayfada, yalnızca bize ait olmayan sistemlerin nasıl kurulduğunu fazla net anlatırdı. İstek üzerine, depoda sizinle birlikte gözden geçiriyoruz — doğrulama hâlâ mümkün, sadece bir görüşme içinde yapılıyor.