Telegram Android 13.0.3 beta sürümünde (yapı 7179), kaydedilen sesli mesajlar metin olarak gönderilebiliyordu: duraklatma düğmesinin yanındaki "Aa" butonu, kaydı daha göndermeden önce yazıya döküyordu ve kullanıcı, karşı tarafa neyin gideceğini seçebiliyordu — metin mi yoksa sesin kendisi mi. Bu özellik, sadece Premium ile erişilebilir olarak belirtildi. Daha sonra, bu yazıya dökme özelliği, bir geliştiricinin geçici bir deneyi olarak beta sürümünden kaldırıldı; aynı yapının ikinci yeniliği ise kaldı — RNNoise sinir ağı tabanlı deneysel gürültü engellemeli sesli mesaj kaydı. Bu durum, beta sürümünü yükleyenleri ilgilendiriyor: kararlı 13.0.2 sürümünde ne biri ne de diğeri mevcut.
Beta Sürümünde Nasıl Görünüyordu
"Aa" butonu, kilitli kayıt modunda ortaya çıkıyordu — yani kayıt sırasında parmak mikrofon simgesinden yukarı kaydırıldığında ve kayıt basılı tutmaya gerek kalmadan devam ettiğinde. "Aa"ya basmak, yazıya dökülmüş metni gösteriyordu; geriye sadece ne göndereceğinizi seçmek kalıyordu. Sesli mesaj tamamlandığında veya kesildiğinde, beta sürümü onu yeniden yazıya dökmeyi teklif ediyordu.
Gürültü engellemeli kayıt, beta sürümünün deneysel ayarlarından etkinleştirilir. Gürültü, Telegram'ın sesli mesajları depoladığı ve ilettiği format olan Opus'a sıkıştırılmadan önce sesten kaldırılır. Aynı yapıdan bir uyarı: gürültü engelleme, müzik ve çok kısık sesli konuşma kayıtlarını bozabilir. Bu modda bir melodi mırıldanmak kötü bir fikirdir: ağ için müzik gürültü gibi görünür, nedeni aşağıda açıklanmıştır.
Neden Göndermeden Önce Yazıya Dökme Yeni Bir Mekanizma?
Telegram'da sesli mesajları yazıya dökme özelliği uzun zamandır var, ancak sadece sohbette zaten bulunan mesajlar için geçerli. Bunu sunucu yapar: istemci messages.transcribeAudio metodunu çağırır ve metodun iki parametresi vardır — sohbet ve içindeki mesaj numarası. Yanıt, yazıya dökme kimliği ve metinle birlikte gelir; uzun bir kayıt "işlemde" notuyla dönebilir ve bu durumda metin ayrı updateTranscribedAudio güncellemeleriyle tamamlanır.
Gönderilmemiş bir kaydın mesaj numarası yoktur, bu nedenle bu metot ona uygulanamaz. Dosyanın kendisini kabul eden bir metot, ne genel API şemasında (TDLib 8 Ekim itibarıyla) ne de 231 katmanlı Android 13.0.2 kaynak kodlarında bulunmamaktadır. Android'in sistem konuşma tanıyıcısı (android.speech) da 13.0.2 kodunda kullanılmamaktadır.
Beta sürümünün bu kısıtlamayı nasıl aştığı açık kaynaklı artefaktlardan anlaşılamıyor: 13.0.3 yapısının kaynak kodları yayınlanmadı, depo 13 Ekim'de yayınlanan 13.0.2 (7175) ile sona eriyor. Yeni düğmenin satırları çeviri platformunda da yok — bu, kişisel bir deney olduğu ve yerelleştirmeye ulaşmadığı versiyonuyla örtüşüyor. Koddan bir gerçek değil, bir hipotez: tanıma ya henüz genel şemada olmayan bir sunucu metodu aracılığıyla ya da cihazın kendisinde yapılıyordu.
Yazıya Dökme Şu Anda Kimler İçin Erişilebilir?
Alınan sesli mesajlar için kurallar istemci kodunda görülebilir. Yazıya dökme, sınırlama olmaksızın Premium'a dahildir — abonelik açıklamasında, gelen herhangi bir sesli mesajın yazıya dökülmesiyle ilgili bir satır bulunur. Premium olmadan sunucu deneme yazıya dökmeler sunar: bunların haftalık sayısı ve maksimum kayıt süresi istemci tarafından sunucu yapılandırmasından (transcribe_audio_trial_weekly_number ve transcribe_audio_trial_duration_max anahtarları) okunur. Ekim ayındaki yapılandırma anlık görüntülerinde maksimum süre 300 saniye, haftalık deneme sayısı ise 0 ile 2 arasında değişiyordu. Denemeler bittiğinde, istemci beklemek gereken tarihi gösterir veya Premium'u önerir.
RNNoise Nasıl Çalışır?
RNNoise, Xiph.Org tarafından BSD lisansı altında geliştirilen açık kaynaklı bir gürültü engelleme kütüphanesidir. Yazarı, Opus kodekinin yaratıcılarından Jean-Marc Valin'dir; yapısı 2017 tarihli makalesinde açıklanmıştır.
Yaklaşım hibrit bir yapıdadır. Klasik sinyal işleme, sesi 10 ms'lik (48 kHz'de 480 örnek) karelere böler ve her karenin spektrumunu, işitmenin frekansları ayırt etme şekline yakın genişlikte 22 banda ayırır. Önceki kareleri hatırlayan küçük bir rekürrent ağ, bant özelliklerine bakar ve her biri için 0 ile 1 arasında bir katsayı çıkarır: o bantta ne kadar enerji bırakılacağını belirler. Ayrı bir perde filtresi, sesin harmonikleri arasındaki gürültüyü temizler. Bu arada, ağ karede konuşma olup olmadığına dair bir olasılık da verir.
Ağ, yüzlerce frekans örneği yerine 22 katsayıyı yönettiği için küçüktür ve telefon işlemcisinde gerçek zamanlı çalışır. Dezavantajı ise, konuşmayı gürültüden ayırmak üzere eğitilmiş olmasıdır ve konuşmaya benzemeyen her şeyi gürültü olarak kabul eder. Müzikle ilgili uyarı buradan gelir; kısık ses de aynı nedenle kaybolur — bantlardaki özellikleri arka plana yakındır.
RNNoise Zaten Uygulamadaydı
Kütüphaneyi eklemeye gerek kalmadı. Kaynak kodları Android istemcisinin deposunda jni/voip/rnnoise altında bulunur, statik bir kütüphaneye derlenir ve uygulamanın ana yerel kütüphanesine gömülür. Şimdiye kadar video sohbetlerinde çalışıyordu: arama modülü, mikrofondan gelen her kareyi RNNoise'dan geçirir, konuşan göstergesi için konuşma değerlendirmesini alır ve video sohbeti ayarlarında "Gürültü Engelleme" etkinleştirildiğinde sesi temizlenmiş olanla değiştirir.
İstemci, sesli mesajları mikrofondan 48 kHz mono olarak kaydeder ve ses için Opus kodlayıcısıyla sıkıştırır. Kayıt frekansı RNNoise'un çalıştığı frekansla eşleştiği için, beta deneyimi mikrofon ile kodlayıcı arasına tek bir bağlantı eklemeye indirgeniyor — video sohbetlerinde uzun zamandır bulunan bağlantı.




