Traverba: 3 ASR Modeli, Yerel Bir LLM ve Kamera OCR Çalıştıran Flutter Uygulaması — Tamamı Cihazda

Traverba'yı geliştirdim — hiçbir bulut API'si kullanmadan telefonunuzda tamamen çalışan gerçek zamanlı bir çeviri uygulaması. Ses tanıma, 108 dilde çeviri, 92 yazı sisteminde kamera OCR, ekran çevirisi katmanı, dosya transkripsiyonu ve 7 kişiye kadar Bluetooth üzerinden çevrimdışı grup sohbeti.

Uygulamanın tamamı Flutter ve ağır işleri üstlenen yerel platform kodu ile inşa edildi. Uygulamanın neler yapabildiğini, Flutter'ın neden doğru seçim olduğunu ve her iki platformda da ürünü yayına alırken karşılaştığım en büyük zorlukları aktarıyorum.

Uygulama Neler Yapıyor

Traverba'nın tamamı çevrimdışı çalışan beş temel özelliği var:

Canlı Sesli Çeviri — Bir dilde konuşun, çeviriyi başka bir dilde sesli ve yazılı olarak alın. Üç mod: uygulama içi, kayan sistem ses yakalama (Zoom/Teams/Meet sesini çevirir) ve kayan mikrofon. Hedef dilde otomatik sesli okuma.

Kamera Çevirisi — Kameranızı bir menüye, tabelaya, forma veya belgeye doğrultun. İki OCR motoru: hızlı okumalar için Basic mod (ML Kit), CJK, Arapça, Kiril ve Devanagari gibi karmaşık yazı sistemleri için Professional mod (PaddleOCR). 92 dil destekler. Uygulama, yabancı metni görüntünün üzerinde doğrudan çevrilmiş metinle değiştirir.

Ekran Çevirisi — Herhangi bir uygulama içindeki metni çeviren kayan bir katman. Anime izliyor, Korece haber okuyor, Japonca bir oyun oynuyor veya WeChat mesajı mı alıyorsunuz? Katman düğmesine dokunun, metin yerinde çevrilsin. Uygulama değiştirmenize gerek yok.

Dosya Transkripsiyonu — Ses veya video dosyalarını (mp3, m4a, wav, mp4) içe aktarın ve zaman damgalı, yan yana kaynak + çeviri transkriptleri alın.

Çevrimdışı Grup Sohbeti — 7 kişiye kadar Bluetooth mesh üzerinden bağlanabilir. Her kişi kendi dilinde konuşur. Her mesaj, tüm katılımcıların dillerine gerçek zamanlı olarak çevrilir. İnternet yok. Sunucu yok. Her telefon ASR ve çevirisini bağımsız olarak kendi işler.

Tüm bunlar telefonun işlemcisinde yerel olarak çalışır. API anahtarı yok, sunucu maliyeti yok, cihazdan çıkan veri yok.

Neden Flutter

Projenin başında Flutter, React Native ve tamamen yerel (ayrı Swift + Kotlin kod tabanları) seçeneklerini değerlendirdim.

Tek kod tabanından platformlar arası geliştirme zorunluydu. Bu kadar karmaşık bir uygulama için iki yerel kod tabanını tek başına yöneten bir geliştirici olarak bu yaklaşım gerçekçi değildi. Dart UI katmanı — ayarlar, sohbet balonları, transkript görünümleri, katılım turu, indirme sayfaları, dil seçiciler — toplam kodun yaklaşık %60'ını oluşturuyor. Bunu iki kez yazmak proje süresini ikiye katlardı.

Flutter'ın platform kanalı sistemi yerel entegrasyonu uygulanabilir kıldı. Yapay zeka yoğun işler (ASR çıkarımı, LLM çevirisi, OCR, Bluetooth mesh, kayan katmanlar), platform kanalları ve method kanalları aracılığıyla yerel Swift/Kotlin üzerinde çalışır. Flutter yapay zeka çalışma zamanı olmaya çalışmaz — yerel motorları birbirine bağlayan UI ve orkestrasyon katmanıdır.

Performans yeterliydi. Bu tür bir uygulama için Flutter'a ilişkin temel endişe gecikmedir — ASR → çeviri → TTS zincirini bir konuşmada bağlarken her milisaniye önemlidir. Pratikte Flutter katmanı, ağır hesaplama yerel kodda gerçekleştiği için ihmal edilebilir gecikme ekler. Dart katmanı durum yönetimini, yönlendirmeyi ve UI güncellemelerini üstlenir; bunların hepsini başarıyla yapar.

Sıcak yeniden yükleme, UI iterasyonunu büyük ölçüde hızlandırdı. Her biri birden fazla durum ve moda sahip beş farklı özellik yüzeyi (ses, kamera, ekran, dosya, grup sohbeti) ile yeniden derleme yapmadan UI'yi yineleyebilmek önemli bir verimlilik çarpanıydı.

Mimari: Orkestratör Olarak Flutter

Uygulama açık bir ayrımı izler:

Flutter/Dart katmanı şunları yönetir:

  • Tüm UI (Material 3, telefon ve tablet için uyarlanabilir düzenler)
  • Durum yönetimi ve özellik yönlendirmesi
  • Dil/yerel seçimi ve kullanıcı tercihleri
  • İsteğe bağlı modeller için indirme yönetimi
  • Coin ekonomisi ve abonelik kapısı
  • Katılım rehberli turu

Yerel katman şunları yönetir (platform kanalları aracılığıyla):

  • ASR çıkarımı (sherpa-onnx / whisper.cpp)
  • LLM çevirisi (cihaz içi çalışma zamanı üzerinden Gemma)
  • Geleneksel ML çevirisi (ONNX NMT modelleri)
  • Kamera OCR (ML Kit + PaddleOCR)
  • Metin-okuma sentezi
  • Grup sohbeti için Bluetooth mesh
  • Kayan katman (ekran çevirisi + sistem ses yakalama)
  • Bellek bütçesi yönetimi ve model yükleme/tahliye

Bu katmanlar arasındaki köprü, iyi tanımlanmış sözleşmelere sahip bir dizi platform kanalıdır. Dart tarafı komutlar gönderir ("Kantonca için ASR başlat", "bu metni Japonca'dan İngilizce'ye çevir", "ekranı yakala ve OCR yap"). Yerel taraf sonuçları zaman uyumsuz olarak döndürür.

Üç ASR Modeli, Otomatik Yönlendirme

Hiçbir tek konuşma tanıma modeli tüm dilleri iyi bir şekilde kapsamaz. Bazı diller için düşük kaliteyi kabul etmek yerine uygulama, üç özelleşmiş model ile gönderilir:

  • Parakeet İngilizce optimize. İndirme gerektirmeden anında İngilizce ASR için uygulamayla birlikte paketlenir.
  • Whisper.cpp 30'dan fazla dilde geniş çok dilli kapsam.
  • Qwen3-ASR Özel Kantonca desteğiyle CJK optimize.

Kullanıcı bir kaynak dil seçtiğinde Dart yönlendirme katmanı en iyi modeli seçer ve yerel tarafa hangi motorun etkinleştirileceğini söyler. Kullanıcı hiçbir zaman model seçimini görmez veya yönetmez.

Zor kısım bellektir. Bu modeller RAM'de 500MB ile 1,9GB arasında değişir. Üçünü aynı anda yüklemek çoğu telefonu çökertir. Yerel bellek istatistiklerini sorgulayan Dart ile yazılmış bir bellek bütçesi planlayıcısı, neyin yüklendiğini izler ve yeni bir modelin yüklenmesi gerektiğinde en az son kullanılan modeli tahliye eder. Arka uç tercih deposu, her belirli cihazda hangi hesaplama arka ucunun (NPU, GPU, CPU) çalıştığını hatırlar; böylece sonraki çalıştırmalar başarısız arka uçları atlar.

İki Çeviri Katmanı ile 108 Dil

Çeviri iki yol üzerinden gerçekleşir:

Katman 1 — Geleneksel NMT modelleri (61 dil): Hızlı, düşük bellek tüketimi, iyi kaynaklara sahip dil çiftleri için yüksek kalite. Her iki platformda da sherpa-onnx aracılığıyla çalışan ONNX modelleri.

Katman 2 — Cihaz içi Gemma LLM (47 ek dil): Özel NMT modeli olmayan diller için (Yoruba, Amharca, Lao, Myanmar ve diğerleri), nicelendirilmiş bir Gemma 2B modeli çeviriyi yerel olarak gerçekleştirir. Katman 1'den yavaştır, ancak geleneksel modellerin yetersiz kaldığı dillere kapsamı genişletir.

Dart katmanı, dil çiftine göre hangi katmanın kullanılacağını yönetir. Kullanıcı birleşik bir deneyim görür.

Kamera OCR: Çift Motor, 92 Dil

Kamera çevirisi, kullanıcı tarafından seçilebilen iki motor çalıştırır:

Basic mod, Google ML Kit'in cihaz içi metin tanımayı kullanır. Hızlı, Latin, Kiril ve CJK'yı iyi işler. Gerçek zamanlı vizör kullanımı için uygundur.

Professional mod, cihaz üzerinde çalışan PaddleOCR kullanır. Karmaşık düzenler, karışık yazı sistemleri, eğimli metin ve düşük kontrast için daha iyi doğruluk. Daha fazla hesaplama gerektirdiğinden coin kapısı kullanır (her yakalama için 5 coin).

Zor yoldan öğrenilen bir ders: iOS varsayılan olarak yalnızca Latin OCR yazı sistemi modelini paketler. CJK, Devanagari ve Arapça, Podfile'a yazı sistemine özgü pod'ların açıkça eklenmesini gerektirir. Hata tamamen sessizdir — ML Kit desteklenmeyen yazı sistemleri için hata olmadan boş sonuçlar döndürür. ML Kit ile iOS'ta çok dilli OCR geliştiriyorsanız Podfile'ınızı kontrol edin.

Kayan Katman: Flutter Değil, Yerel

Ekran çevirisi ve sistem sesi özellikleri, Flutter'ın işleme yüzeyinin dışında yerel katmanlar olarak çalışır. Android'de bu, Kotlin ile yazılmış bir sistem katmanı servisidir. iOS'ta Swift'teki ekran yakalama API'lerini kullanır.

Bu katmanlar, platform kanalları aracılığıyla Flutter çeviri motoruna geri iletişim kurar. Mimari zorluk yaşam döngüsü yönetimidir — ana Flutter etkinliği arka plana alınırken katman canlı kalmalıdır.

Kritik bir ders: iOS'ta yerel köprü örneklerinin güçlü bir şekilde tutulması gerekir (statik veya bir singleton tarafından). Köprü, hiçbir şeyin tutmadığı bir örnek değişkeni ise ARC onu çöp toplayacak ve tüm işleyici kapanışları sessizce işlevsiz hale gelecektir. Köprü toplandığı için indirme ilerleme göstergesi %0'da takılı kaldı ve günlerimi kaybettim. Çökme yok, hata yok, sadece sessiz başarısızlık.

Bluetooth Grup Sohbeti

Çevrimdışı grup sohbeti bir Bluetooth mesh protokolü kullanır. Her telefon hem alıcı hem de röle olarak görev yapar. Mesajlar bağlı tüm cihazlara yayınlanır. Her cihaz kendi ASR ve çevirisini bağımsız olarak çalıştırır — "ana" veya "sunucu" telefon yoktur.

Flutter sohbet UI'sını, mesaj durumunu ve katılımcı yönetimini işler. Bluetooth yığını tamamen yereldir (iOS'ta CoreBluetooth, Android Bluetooth API) ve platform kanalları aracılığıyla köprülenir.

Toplam ardışık düzen gecikmesi (ses → ASR → çeviri → yayın → görüntüleme) yaklaşık 1 saniyedir. Dart UI iyimser görüntüleme kullanır (gönderimde hemen "çevriliyor..." gösterir), böylece konuşma duyarlı hissettirir.

Sayılarla Traverba

  • Diller: Toplam 108 (61 ML + 47 Yapay Zeka)
  • ASR dilleri: 30 cihaz içi konuşma tanıma
  • OCR dilleri: 92 kamera metin tanıma
  • Uygulama temel boyutu: ~150MB + indirilebilir modeller
  • Platformlar: Tek Flutter kod tabanından iOS + Android
  • Dart/Flutter kodu: Toplam kod tabanının ~%60'ı (UI, durum, yönlendirme, iş mantığı)
  • Yerel kod: ~%40 (ASR, LLM, OCR, Bluetooth, katmanlar, bellek yönetimi)
  • Ekip büyüklüğü: 1

Flutter'ın Bu Projede Öne Çıkan Yönleri

Karmaşık UI için tek kod tabanı. Beş özellik yüzeyi, her birinde birden fazla mod, indirme sayfaları, katılım turu, uyarlanabilir düzenler — bunu bir kez yazmak, solo bir geliştirici olarak ürünü çıkarıp çıkaramamak arasındaki farktı.

Platform kanalları iyi tasarlanmış. Dart ile yerel kod arasındaki köprü temiz, iyi belgelenmiş ve güvenilir. Ağır hesaplamanın yerel olduğu ancak kullanıcı deneyiminin Flutter olduğu bir uygulama için bu tam olarak doğru mimardir.

Hızlı iterasyon için sıcak yeniden yükleme. Düzenleri ayarlamak, durumları test etmek, UX akışlarını yinelemek — sıcak yeniden yükleme, yüzlerce UI değişikliğinde iterasyon süresini dakikalardan saniyelere indirdi.

Ekosistem olgun. Durum yönetimi (Riverpod), navigasyon, yerelleştirme (117 yerel), uyarlanabilir tasarım — Flutter ekosistemi bunların tümü için ürün kalitesinde çözümlere sahip.

Zorluklar

Bellek baskısı Flutter'ın kör noktasıdır. Flutter ince taneli bellek kontrolü sunmaz. Flutter motoru ile birlikte birden fazla yerel ML modelini birlikte yüklerken belleği yerel düzeyde yönetmeniz ve bunu Dart'a aktarmanız gerekir. "Uygulamam ne kadar RAM kullanıyor" veya "sistem bellek baskısı nedir" için yerleşik bir Flutter API'si yoktur.

Yerel katman yaşam döngüsü. Flutter yüzeyinin dışında çalışan kayan katmanlar mimari açıdan karmaşıktır. Katman etkinken Flutter etkinliği arka plana alınabilir. Köprüyü canlı tutmak, durum senkronizasyonunu yönetmek ve platforma özgü yaşam döngüsü olaylarını işlemek, Flutter'ın soyutlayamayacağı önemli miktarda yerel kod gerektirdi.

iOS derleme karmaşıklığı. ML Kit yazı sistemi pod'larıyla CocoaPods, yetkilendirmeler (ASR + LLM'yi birlikte yüklemek için artırılmış bellek sınırı), App Tracking Transparency zamanlaması, kod imzalama — iOS derleme ardışık düzeninde Flutter'ın araçlarının tam olarak yönetemediği çok sayıda parçalar var.

Deneyin

Traverba her iki platformda da ücretsiz. Ses, kamera, ekran çevirisi ve metin çevirisi ücretsiz ve sınırsız. Premium (ayda $1,99), grup sohbetini, dosya transkripsiyonunu ve toplantı özetlerini açar.

Google Play ve App Store üzerinden edinin. Daha fazla bilgi için traverba.com adresini ziyaret edin.

Mimari, Flutter + yerel entegrasyon desenleri veya genel olarak cihaz içi yapay zeka hakkındaki sorularınızı yanıtlamaktan memnuniyet duyarım.