Traverba: Aplikasi Flutter yang Menjalankan 3 Model ASR, LLM Tempatan, dan OCR Kamera — Semuanya Di Peranti

Saya membina Traverba — penterjemah masa nyata yang berjalan 100% pada telefon anda tanpa sebarang API awan. Pengecaman suara, terjemahan merentasi 108 bahasa, OCR kamera dalam 92 skrip, hamparan terjemahan skrin, transkripsi fail, dan sembang kumpulan luar talian melalui Bluetooth untuk sehingga 7 orang.

Keseluruhan aplikasi dibina dengan Flutter ditambah kod platform natif untuk kerja-kerja berat. Berikut adalah apa yang dilakukan oleh aplikasi ini, mengapa Flutter adalah pilihan yang tepat, dan cabaran terbesar yang saya hadapi semasa melancarkannya ke pengeluaran di iOS dan Android.

Apa yang Dilakukan oleh Aplikasi Ini

Traverba mempunyai lima ciri teras, semuanya berjalan secara luar talian:

Terjemahan Suara Langsung — Bercakap dalam satu bahasa, dengar dan baca terjemahan dalam bahasa lain. Tiga mod: dalam aplikasi, tangkapan audio sistem terapung (menterjemah audio dari Zoom/Teams/Meet), dan mikrofon terapung. Bacaan automatik dalam bahasa sasaran.

Terjemahan Kamera — Arahkan kamera anda ke menu, papan tanda, borang, atau dokumen. Dua enjin OCR: Mod Basic (ML Kit) untuk bacaan cepat, Mod Professional (PaddleOCR) untuk skrip kompleks seperti CJK, Arab, Cyrillic, dan Devanagari. Menyokong 92 bahasa. Aplikasi menggantikan teks asing dengan teks terjemahan terus pada imej.

Terjemahan Skrin — Hamparan terapung yang menterjemah teks dalam mana-mana aplikasi. Sedang menonton anime, membaca berita Korea, bermain permainan Jepun, atau menerima mesej WeChat? Ketik butang hamparan dan teks diterjemahkan di tempat. Tanpa perlu bertukar aplikasi.

Transkripsi Fail — Import fail audio atau video (mp3, m4a, wav, mp4) dan dapatkan transkrip sumber + terjemahan bersebelahan dengan cap masa.

Sembang Kumpulan Luar Talian — Sehingga 7 orang berhubung melalui jaringan Bluetooth. Setiap orang bercakap dalam bahasa mereka sendiri. Setiap mesej diterjemahkan ke dalam bahasa setiap peserta secara masa nyata. Tanpa internet. Tanpa pelayan. Setiap telefon mengendalikan ASR dan terjemahan sendiri secara bebas.

Semua ini berjalan secara tempatan pada pemproses telefon. Tiada kunci API, tiada kos pelayan, tiada data yang meninggalkan peranti.

Mengapa Flutter

Saya menilai Flutter, React Native, dan sepenuhnya natif (kod Swift + Kotlin berasingan) pada permulaan.

Merentas platform dari satu kod sumber adalah tidak boleh dirunding. Seorang pembangun solo yang menyelenggara dua kod sumber natif untuk aplikasi sekompleks ini adalah tidak realistik. Lapisan UI Dart — tetapan, gelembung sembang, paparan transkrip, tur pengenalan, helaian muat turun, pemilih bahasa — adalah lebih kurang 60% daripada jumlah kod. Menulisnya dua kali akan menggandakan jadual projek.

Sistem saluran platform Flutter menjadikan integrasi natif lebih praktikal. Kerja berat AI (inferens ASR, terjemahan LLM, OCR, jaringan Bluetooth, hamparan terapung) berjalan dalam Swift/Kotlin natif melalui saluran platform dan saluran kaedah. Flutter tidak cuba menjadi masa jalan AI — ia adalah lapisan UI dan orkestrasi yang menghubungkan enjin natif.

Prestasi adalah mencukupi. Kebimbangan dengan Flutter untuk jenis aplikasi ini adalah overhed — setiap milisaat penting apabila anda menghubungkan ASR → terjemahan → TTS dalam perbualan. Dalam praktiknya, lapisan Flutter menambah kependaman yang boleh diabaikan kerana pengiraan berat berlaku dalam kod natif. Lapisan Dart mengendalikan pengurusan keadaan, penghalaan, dan kemas kini UI, yang dilakukannya dengan baik.

Muat semula panas mempercepatkan lelaran UI secara dramatik. Dengan lima permukaan ciri yang berbeza (suara, kamera, skrin, fail, sembang kumpulan), setiap satunya dengan pelbagai keadaan dan mod, keupayaan untuk melakukan lelaran pada UI tanpa membina semula adalah pengganda produktiviti yang ketara.

Seni Bina: Flutter sebagai Pengatur

Aplikasi ini mengikut pembahagian yang jelas:

Lapisan Flutter/Dart mengendalikan:

  • Semua UI (Material 3, susun atur adaptif untuk telefon dan tablet)
  • Pengurusan keadaan dan penghalaan ciri
  • Pemilihan bahasa/lokal dan keutamaan pengguna
  • Pengurusan muat turun untuk model pilihan
  • Ekonomi syiling dan pengawalan langganan
  • Tur panduan pengenalan

Lapisan natif mengendalikan (melalui saluran platform):

  • Inferens ASR (sherpa-onnx / whisper.cpp)
  • Terjemahan LLM (Gemma melalui masa jalan di peranti)
  • Terjemahan ML tradisional (model ONNX NMT)
  • OCR kamera (ML Kit + PaddleOCR)
  • Teks ke pertuturan
  • Jaringan Bluetooth untuk sembang kumpulan
  • Hamparan terapung (terjemahan skrin + tangkapan audio sistem)
  • Pengurusan bajet memori dan pemuatan/penyingkiran model

Jambatan antara lapisan-lapisan ini adalah satu set saluran platform dengan kontrak yang ditakrifkan dengan baik. Bahagian Dart menghantar arahan ("mulakan ASR untuk Kantonis," "terjemahkan teks ini dari Jepun ke Inggeris," "tangkap skrin dan OCR"). Bahagian natif memulangkan keputusan secara tak segerak.

Tiga Model ASR, Penghalaan Automatik

Tiada satu model pengecaman suara yang meliputi semua bahasa dengan baik. Daripada menerima kualiti yang lemah untuk sesetengah bahasa, aplikasi ini dihantar dengan tiga model khusus:

  • Parakeet Dioptimumkan untuk bahasa Inggeris. Dibundel bersama aplikasi untuk ASR Inggeris segera tanpa muat turun.
  • Whisper.cpp Liputan berbilang bahasa yang luas merentasi 30+ bahasa.
  • Qwen3-ASR Dioptimumkan untuk CJK dengan sokongan Kantonis yang khusus.

Apabila pengguna memilih bahasa sumber, lapisan penghalaan Dart memilih model terbaik dan memberitahu bahagian natif enjin mana yang perlu diaktifkan. Pengguna tidak pernah melihat atau mengurus pemilihan model.

Bahagian yang rumit adalah memori. Model-model ini berjulat dari 500MB hingga 1.9GB dalam RAM. Memuatkan ketiganya serentak akan menyebabkan kebanyakan telefon ranap. Perancang bajet memori (ditulis dalam Dart, menanya statistik memori natif) menjejaki apa yang dimuatkan dan menyingkirkan model yang paling lama tidak digunakan apabila model baharu perlu dimuatkan. Stor keutamaan bahagian belakang mengingati bahagian belakang pengiraan (NPU, GPU, CPU) mana yang berfungsi pada setiap peranti tertentu, jadi larian seterusnya melangkau bahagian belakang yang gagal.

108 Bahasa Melalui Dua Peringkat Terjemahan

Terjemahan berlaku melalui dua laluan:

Peringkat 1 — Model NMT tradisional (61 bahasa): Pantas, memori rendah, kualiti baik untuk pasangan bahasa yang bersumber baik. Model ONNX berjalan melalui sherpa-onnx pada kedua-dua platform.

Peringkat 2 — LLM Gemma di peranti (47 bahasa tambahan): Untuk bahasa tanpa model NMT khusus (Yoruba, Amharic, Lao, Myanmar, dan lain-lain), model Gemma 2B yang dikuantisasi mengendalikan terjemahan secara tempatan. Lebih perlahan daripada Peringkat 1, tetapi ia memperluaskan liputan kepada bahasa-bahasa yang model tradisional tidak dapat layaninya dengan baik.

Lapisan Dart mengurus peringkat mana yang digunakan berdasarkan pasangan bahasa. Pengguna melihat pengalaman yang bersatu.

OCR Kamera: Enjin Dua, 92 Bahasa

Terjemahan kamera menjalankan dua enjin yang boleh dipilih oleh pengguna:

Mod Basic menggunakan pengecaman teks di peranti Google ML Kit. Pantas, mengendalikan Latin, Cyrillic, dan CJK dengan baik. Sesuai untuk penggunaan pengesanan pandangan masa nyata.

Mod Professional menggunakan PaddleOCR yang berjalan di peranti. Ketepatan yang lebih baik untuk susun atur kompleks, skrip campuran, teks melengkung, dan kontras rendah. Menggunakan gerbang syiling (5 syiling setiap tangkapan) kerana ia lebih intensif dalam pengiraan.

Satu pelajaran yang dipelajari dengan cara yang susah: iOS hanya membundel model skrip OCR Latin secara lalai. CJK, Devanagari, dan Arab memerlukan penambahan pod khusus skrip secara eksplisit ke dalam Podfile. Kegagalan ini benar-benar senyap — ML Kit memulangkan keputusan kosong untuk skrip yang tidak disokong tanpa sebarang ralat. Jika anda membina OCR berbilang bahasa di iOS dengan ML Kit, semak Podfile anda.

Hamparan Terapung: Natif, Bukan Flutter

Ciri terjemahan skrin dan audio sistem berjalan sebagai hamparan natif di luar permukaan pemaparan Flutter. Di Android, ini adalah perkhidmatan hamparan sistem yang ditulis dalam Kotlin. Di iOS, ia menggunakan API tangkapan skrin dalam Swift.

Hamparan-hamparan ini berkomunikasi kembali ke enjin terjemahan Flutter melalui saluran platform. Cabaran seni bina adalah pengurusan kitaran hayat — hamparan mesti kekal hidup sementara aktiviti Flutter utama mungkin berada di latar belakang.

Satu pelajaran kritikal: di iOS, contoh jambatan natif mesti dikekalkan dengan kuat (statik atau dipegang oleh singleton). Jika jambatan adalah pemboleh ubah contoh yang tidak dikekalkan oleh apa-apa, ARC akan membuangnya dan semua penutupan pengendali secara senyap menjadi tiada kesan. Saya kehilangan berhari-hari kerana penunjuk kemajuan muat turun tersekat pada 0% kerana jambatan sedang dikutip. Tiada ranap, tiada ralat, hanya kegagalan senyap.

Sembang Kumpulan Bluetooth

Sembang kumpulan luar talian menggunakan protokol jaringan Bluetooth. Setiap telefon bertindak sebagai penerima dan penghantar semula. Mesej disiarkan ke semua peranti yang berhubung. Setiap peranti menjalankan ASR dan terjemahan sendiri secara bebas — tiada telefon "hos" atau "pelayan".

Flutter mengendalikan UI sembang, keadaan mesej, dan pengurusan peserta. Tindanan Bluetooth adalah sepenuhnya natif (CoreBluetooth di iOS, API Bluetooth Android) dijambatkan melalui saluran platform.

Jumlah kependaman saluran paip (suara → ASR → terjemah → siar → papar) adalah lebih kurang 1 saat. UI Dart menggunakan paparan optimistik (tunjukkan "sedang menterjemah..." serta-merta semasa menghantar) supaya perbualan terasa responsif.

Angka-Angka

  • Bahasa: 108 jumlah (61 ML + 47 AI)
  • Bahasa ASR: 30 pengecaman suara di peranti
  • Bahasa OCR: 92 pengecaman teks kamera
  • Saiz asas aplikasi: ~150MB + model yang boleh dimuat turun
  • Platform: iOS + Android dari satu kod sumber Flutter
  • Kod Dart/Flutter: ~60% daripada jumlah kod sumber (UI, keadaan, penghalaan, logik perniagaan)
  • Kod natif: ~40% (ASR, LLM, OCR, Bluetooth, hamparan, pengurusan memori)
  • Saiz pasukan: 1

Apa yang Flutter Lakukan dengan Betul untuk Projek Ini

Satu kod sumber untuk UI yang kompleks. Lima permukaan ciri, pelbagai mod setiap satu, helaian muat turun, tur pengenalan, susun atur adaptif — menulis ini sekali sahaja berbanding dua kali adalah perbezaan antara melancarkan dan tidak melancarkan sebagai pembangun solo.

Saluran platform direka dengan baik. Jambatan antara Dart dan kod natif adalah bersih, terdokumentasi dengan baik, dan boleh dipercayai. Untuk aplikasi di mana pengiraan berat adalah natif tetapi pengalaman pengguna adalah Flutter, ini adalah seni bina yang tepat sekali.

Muat semula panas untuk lelaran pantas. Menala susun atur, menguji keadaan, melakukan lelaran pada aliran UX — muat semula panas mengurangkan masa lelaran dari minit ke saat merentas ratusan perubahan UI.

Ekosistem adalah matang. Pengurusan keadaan (Riverpod), navigasi, penyetempatan (117 lokal), reka bentuk adaptif — ekosistem Flutter mempunyai penyelesaian berkualiti pengeluaran untuk semua ini.

Apa yang Sukar

Tekanan memori adalah titik buta Flutter. Flutter tidak mendedahkan kawalan memori yang terperinci. Apabila anda memuatkan bersama pelbagai model ML natif di samping enjin Flutter, anda perlu mengurus memori di peringkat natif dan memaparkannya kembali ke Dart. Tiada API Flutter terbina untuk "berapa banyak RAM yang digunakan oleh aplikasi saya" atau "apakah tekanan memori sistem."

Kitaran hayat hamparan natif. Hamparan terapung yang beroperasi di luar permukaan Flutter adalah kompleks dari segi seni bina. Aktiviti Flutter mungkin berada di latar belakang sementara hamparan aktif. Memastikan jambatan kekal hidup, mengurus penyegerakan keadaan, dan mengendalikan peristiwa kitaran hayat khusus platform memerlukan kod natif yang ketara yang Flutter tidak dapat abstrakkan.

Kerumitan binaan iOS. CocoaPods dengan pod skrip ML Kit, kelayakan (increased-memory-limit untuk memuatkan bersama ASR + LLM), masa App Tracking Transparency, penandatanganan kod — saluran paip binaan iOS mempunyai banyak bahagian bergerak yang tidak dapat diurus sepenuhnya oleh alat Flutter.

Cuba Sendiri

Traverba adalah percuma di kedua-dua platform. Terjemahan suara, kamera, skrin, dan teks semuanya percuma dan tidak terhad. Premium ($1.99/bulan) membuka kunci sembang kumpulan, transkripsi fail, dan ringkasan mesyuarat.

Tersedia di Google Play dan App Store. Ketahui lebih lanjut di traverba.com.

Saya dengan senang hati menjawab soalan tentang seni bina, corak integrasi Flutter + natif, atau AI di peranti secara umum.