Hackathon DevDays'19 (bagian 2): parser pesan suara untuk Telegram dan pemeriksaan tata bahasa di IntelliJ IDEA

Kami terus berbicara tentang proyek musim semi DevDays hackathon, di mana siswa dari program master "Rekayasa Perangkat Lunak / Rekayasa Perangkat Lunak" berpartisipasi.



Ngomong-ngomong, kami ingin mengundang pembaca untuk bergabung dengan VK-grup magistracy . Di dalamnya kami akan mempublikasikan berita terbaru tentang rekrutmen dan belajar. Video dari hari terbuka juga dapat ditemukan di grup. Kami mengingatkan Anda: acara akan diadakan pada 29 April, detail di situs .

Parser Pesan Suara Desktop Telegram




Penulis ide
Khoroshev Artyom

Komposisi Tim

Khoroshev Artem - manajer proyek / pengembang / QA
Eliseev Anton - Analis Bisnis / Spesialis Pemasaran
Kuklina Maria - desainer / pengembang UI
Bakhvalov Pavel - desainer / pengembang / QA UI

Dari sudut pandang kami, Telegram adalah messenger modern dan nyaman, dan versi PC-nya populer dan open source, sehingga dimungkinkan untuk memodifikasinya. Klien menawarkan fungsionalitas yang cukup kaya. Selain pesan teks standar, ini berisi panggilan suara, pesan video, pesan suara. Dan yang terakhirlah yang terkadang merepotkan penerima mereka. Seringkali tidak ada cara untuk mendengarkan pesan suara saat berada di komputer atau laptop. Kebisingan ambien, kurangnya headphone dapat mengganggu, atau Anda tidak ingin konten pesan didengar oleh siapa pun. Masalah seperti itu hampir tidak pernah terjadi jika Anda menggunakan telegram pada ponsel cerdas Anda, karena Anda bisa membawanya ke telinga Anda, tidak seperti laptop atau PC. Kami mencoba menyelesaikan masalah ini.

Tujuan proyek kami di DevDays adalah untuk menambahkan kemampuan menerjemahkan pesan suara yang diterima ke teks di klien desktop Telegram (selanjutnya disebut Telegram Desktop).

Semua analog saat ini adalah bot tempat Anda dapat mengirim pesan audio, dan sebaliknya menerima teks. Ini sangat tidak nyaman bagi kami: meneruskan pesan ke bot sangat tidak nyaman, saya ingin memiliki fungsi asli. Selain itu, bot apa pun adalah pihak ketiga yang bertindak sebagai perantara antara API pengenalan suara dan pengguna, dan ini setidaknya tidak aman.

Seperti disebutkan sebelumnya, telegram-desktop memiliki dua kelebihan berat: ringan dan kecepatan. Dan ini bukan kebetulan, karena sepenuhnya ditulis dalam C ++. Dan karena kami memutuskan untuk menambahkan fungsionalitas baru secara langsung ke klien, kami harus mengembangkannya di C ++.

Ada 4 orang di tim kami. Awalnya, dua mencari perpustakaan yang cocok untuk pengenalan suara, satu orang mempelajari kode sumber Telegram-desktop, yang lain sedang menyebarkan pembangunan proyek Telegram Desktop . Kemudian, semua orang sibuk dengan perbaikan UI dan debugging.

Tampaknya implementasi fungsi yang dimaksudkan tidak akan sulit, tetapi, seperti biasa, kesulitan muncul.

Solusi untuk masalah ini terdiri dari dua sub-tugas independen: memilih cara yang sesuai untuk pengenalan suara dan mengimplementasikan UI untuk fungsionalitas baru.

Saat memilih perpustakaan untuk pengenalan suara, kami segera harus meninggalkan semua API offline, karena model bahasa memakan banyak ruang. Tapi ini hanya satu bahasa. Menjadi jelas bahwa Anda harus menggunakan API online. Kemudian ternyata layanan pengenalan ucapan dari raksasa seperti Google, Yandex dan Microsoft tidak gratis sama sekali, dan kita harus puas dengan masa percobaan. Akibatnya, Google Speech-To-Text dipilih, karena memungkinkan Anda untuk mendapatkan token untuk menggunakan layanan, yang akan berlangsung selama satu tahun penuh.

Masalah kedua yang kami temui terkait dengan beberapa kelemahan C ++ - kebun binatang dari berbagai perpustakaan tanpa adanya repositori terpusat. Kebetulan Telegram Desktop bergantung pada banyak perpustakaan lain dari versi tertentu. Repositori resmi memiliki instruksi untuk membangun proyek. Dan juga sejumlah besar masalah terbuka tentang masalah pembangunan, misalnya, sekali dan dua kali . Semua masalah ternyata terkait dengan fakta bahwa skrip build ditulis untuk Ubuntu 14.04, dan untuk berhasil membangun telegram di bawah Ubuntu 18.04, saya harus membuat perubahan.

Telegram Desktop sendiri akan memakan waktu cukup lama: pada laptop dengan Intel Core i5-7200U, perakitan penuh (-j4 flag) dengan semua dependensi membutuhkan waktu sekitar tiga jam. Dari jumlah tersebut, dibutuhkan sekitar 30 menit untuk menautkan klien itu sendiri (kemudian ternyata dalam konfigurasi Debug, penautan membutuhkan waktu sekitar 10 menit), tetapi langkah penautan harus diulang setiap kali setelah melakukan perubahan.

Meskipun ada masalah, kami berhasil mengimplementasikan ide kami, serta memperbarui skrip build untuk Ubuntu 18.04. Demonstrasi kerja bisa dilihat di sini . Kami juga menerapkan beberapa animasi. Sebuah tombol muncul di dekat semua pesan suara, memungkinkan Anda untuk menerjemahkan pesan menjadi teks. Saat Anda mengklik kanan, Anda dapat menentukan bahasa yang akan digunakan untuk terjemahan secara opsional. Klien tersedia untuk diunduh melalui tautan .

Repositori.

Menurut pendapat kami, kami mendapat fungsionalitas Konsep Bukti yang baik yang akan nyaman bagi banyak pengguna. Kami berharap dapat melihatnya di rilis Telegram Desktop mendatang.

Dukungan Bahasa Alami yang Diperluas di IntelliJ IDEA




Penulis ide

Tank Vladislav

Komposisi Tim

Tanks Vladislav (pemimpin tim, bekerja dengan LanguageTool dan IntelliJ IDEA)
Sokolov Nikita (bekerja dengan LanguageTool dan membuat UI)
Hvorov Alexander (bekerja dengan LanguageTool dan mengoptimalkan kinerja)
Sadovnikov Alexander (dukungan untuk parsing bahasa markup dan kode)

Kami mengembangkan sebuah plugin untuk IntelliJ IDEA yang memeriksa berbagai teks (komentar dan dokumentasi, baris literal dalam kode, teks yang diformat dalam Markdown atau markup XML) untuk kesetiaan tata bahasa, ejaan, dan gaya (dalam bahasa Inggris ini disebut proofreading).

Gagasan proyek ini adalah untuk memperluas pemeriksaan ejaan standar IntelliJ IDEA ke skala Grammarly, untuk membuat semacam Grammarly di dalam IDE.

Anda dapat melihat apa yang terjadi dengan mengklik tautan .

Nah, di bawah ini kita akan berbicara lebih banyak tentang kemampuan plugin, serta tentang kesulitan yang muncul selama pembuatannya.

Motivasi

Ada banyak produk yang dirancang untuk menulis teks dalam bahasa alami, tetapi dokumentasi dan komentar pada kode tersebut paling sering ditulis dalam lingkungan pengembangan. Pada saat yang sama, IDE melakukan pekerjaan yang baik untuk menemukan kesalahan dalam penulisan kode, tetapi kurang diadaptasi untuk teks dalam bahasa alami. Karena itu, sangat mudah untuk membuat kesalahan dalam tata bahasa, tanda baca atau gaya, dan lingkungan pengembangan tidak akan menunjuk kepada mereka. Sangat penting untuk membuat kesalahan dalam menulis antarmuka pengguna, karena ini tidak hanya memengaruhi kelengkapan kode, tetapi juga pengguna aplikasi yang dikembangkan itu sendiri.

Salah satu lingkungan pengembangan yang paling populer dan dikembangkan adalah IntelliJ IDEA, serta IDE berbasis pada Platform IntelliJ. Platform IntelliJ sudah memiliki pemeriksa ejaan internal, namun tidak menyimpan kesalahan tata bahasa yang paling sederhana sekalipun. Kami memutuskan untuk mengintegrasikan salah satu sistem analisis bahasa alami yang populer ke IntelliJ IDEA.

Implementasi

Kami tidak menetapkan sendiri tugas untuk menciptakan sistem kami sendiri untuk memverifikasi teks, jadi kami mengambil keuntungan dari solusi yang ada. Opsi yang paling cocok adalah LanguageTool . Lisensi memungkinkan kami untuk menggunakannya secara bebas untuk keperluan kami: itu gratis, ditulis dalam Java dan ditata dalam open-source. Selain itu, mendukung 25 bahasa dan telah berkembang selama lebih dari lima belas tahun. Terlepas dari keterbukaannya, LanguageTool adalah pesaing serius untuk solusi verifikasi teks berbayar, dan fakta bahwa ia dapat bekerja secara lokal adalah fitur yang paling mematikan.

Kode plugin ada di dalam repositori di GitHub . Seluruh proyek ditulis di Kotlin dengan sedikit tambahan Java untuk UI. Selama hackathon, berhasil mengimplementasikan dukungan untuk Markdown, JavaDoc, HTML dan Plain Text. Setelah hackathon, pembaruan besar menambahkan dukungan untuk XML, string literal di Jawa, Kotlin dan Python, serta pemeriksaan ejaan.

Kesulitan

Cukup cepat, kami menyadari bahwa jika kami memberi makan semua teks setiap kali untuk pemeriksaan LanguageTool, maka antarmuka IDEA akan menggantung pada teks yang lebih atau kurang serius, karena inspeksi itu sendiri memblokir aliran UI. Masalahnya dipecahkan melalui pemeriksaan `ProgressManager.checkCancelled` - fungsi ini melempar pengecualian jika IDEA menganggap bahwa inspeksi harus dihentikan.

Ini sepenuhnya menghilangkan hang, tetapi tidak mungkin untuk menggunakannya: teks telah diproses untuk waktu yang sangat lama. Selain itu, dalam kasus kami, paling sering sebagian kecil dari perubahan teks dan saya ingin menyembunyikan hasilnya. Itu yang kami lakukan. Agar tidak memeriksa semuanya setiap waktu, kami dengan tekad memecah teks menjadi beberapa bagian dan hanya memeriksa yang berubah. Karena teks dapat berukuran besar dan tidak ingin memuat cache, kami tidak menyimpan teks itu sendiri, tetapi hash-nya. Ini memungkinkan plug-in bekerja dengan lancar bahkan pada file besar.

LanguageTool mendukung lebih dari 25 bahasa, tetapi hampir tidak ada satu pengguna yang membutuhkan semuanya. Saya ingin memberikan kesempatan untuk mengunduh perpustakaan untuk bahasa tertentu berdasarkan permintaan (jika dicentang dengan tanda centang di UI). Kami bahkan mengimplementasikannya, tetapi ternyata terlalu rumit dan tidak dapat diandalkan. Secara khusus, kami harus memuat LanguageTool dengan seperangkat bahasa baru sebagai classloader terpisah, dan kemudian menginisialisasi dengan hati-hati. Pada saat yang sama, semua perpustakaan berada di repositori .m2 pengguna, dan pada setiap awal kami harus memeriksa integritasnya. Pada akhirnya, kami memutuskan bahwa jika pengguna memiliki masalah dengan ukuran plugin, kami akan menyediakan plugin terpisah untuk beberapa bahasa yang paling populer.

Setelah hackathon

Hackathon berakhir, tetapi pengerjaan plug-in dilanjutkan dengan komposisi yang lebih sempit. Saya ingin mendukung garis, komentar, dan bahkan konstruksi bahasa, seperti nama variabel dan kelas. Saat ini hanya didukung untuk Java, Kotlin, dan Python, tetapi kami berharap daftar ini bertambah. Kami memperbaiki banyak bug kecil dan menjadi lebih kompatibel dengan pemeriksa ejaan bawaan Idea. Selain itu, dukungan XML dan pemeriksaan ejaan telah muncul. Semua ini dapat ditemukan di versi kedua yang kami terbitkan baru-baru ini.

Apa selanjutnya

Plugin semacam itu dapat bermanfaat tidak hanya untuk pengembang, tetapi juga untuk penulis teknis (sering bekerja, misalnya, dengan XML dalam IDE). Setiap hari mereka harus bekerja dengan bahasa alami, tanpa memiliki asisten dalam bentuk kiat editor tentang kemungkinan kesalahan. Plugin kami menyediakan petunjuk seperti itu dan melakukannya dengan tingkat akurasi yang tinggi.
Kami berencana untuk mengembangkan plugin dengan menambahkan bahasa baru dan menjelajahi pendekatan umum untuk mengatur validasi teks. Dalam waktu dekat, penerapan profil gaya (seperangkat aturan yang menentukan panduan gaya untuk teks, misalnya, "jangan menulis misalnya, tetapi tulis formulir lengkap"), perluas kamus dan tingkatkan antarmuka pengguna (khususnya, kami ingin memberi pengguna kemampuan untuk tidak hanya mengabaikan kata, tetapi menambahkan dia ke dalam kamus, menunjukkan bagian dari ucapan).

Source: https://habr.com/ru/post/id449496/


All Articles