Hackathon DevDays'19 (bahagian 2): penghurai mesej audio untuk pemeriksaan Telegram dan tatabahasa dalam IntelliJ IDEA

Kami terus bercakap tentang projek hackathon musim bunga DevDays, di mana pelajar program sarjana mengambil bahagian "Pembangunan Perisian / Kejuruteraan Perisian".

Hackathon DevDays'19 (bahagian 2): penghurai mesej audio untuk pemeriksaan Telegram dan tatabahasa dalam IntelliJ IDEA

Dengan cara ini, kami ingin menjemput pembaca untuk menyertai Kumpulan VK pelajar sarjana. Di dalamnya kami akan menerbitkan berita terkini tentang pengambilan dan kajian. Video dari hari terbuka juga boleh didapati dalam kumpulan. Kami mengingatkan anda: acara itu akan berlangsung pada 29 April, butiran talian.

Penghurai Mesej Suara Desktop Telegram

Hackathon DevDays'19 (bahagian 2): penghurai mesej audio untuk pemeriksaan Telegram dan tatabahasa dalam IntelliJ IDEA

Pengarang idea itu
Khoroshev Artyom

Berbaris

Khoroshev Artem – pengurus projek/pemaju/QA
Eliseev Anton – penganalisis perniagaan/pakar pemasaran
Maria Kuklina – pereka/pembangun UI
Bakhvalov Pavel – pereka/pembangun UI/QA

Dari sudut pandangan kami, Telegram ialah utusan moden dan mudah, dan versi PCnya adalah popular dan sumber terbuka, yang memungkinkan untuk mengubah suainya. Pelanggan menawarkan fungsi yang agak kaya. Selain mesej teks standard, ia mengandungi panggilan suara, mesej video dan mesej suara. Dan yang terakhir yang kadangkala membawa kesulitan kepada penerima mereka. Selalunya tidak mungkin untuk mendengar mesej suara semasa berada di komputer atau komputer riba. Mungkin terdapat bunyi ambien, kekurangan fon kepala atau anda tidak mahu sesiapa mendengar kandungan mesej itu. Masalah sedemikian hampir tidak pernah timbul jika anda menggunakan Telegram pada telefon pintar, kerana anda boleh membawanya ke telinga anda, tidak seperti komputer riba atau PC. Kami cuba menyelesaikan masalah ini.

Matlamat projek kami di DevDays adalah untuk menambah keupayaan untuk menterjemah mesej suara yang diterima ke dalam teks kepada pelanggan desktop Telegram (selepas ini dirujuk sebagai Desktop Telegram).

Semua analog pada masa ini adalah bot yang anda boleh menghantar mesej audio dan menerima teks sebagai balasan. Kami tidak begitu berpuas hati dengan ini: memajukan mesej ke bot tidak begitu mudah; kami ingin mempunyai fungsi asli. Selain itu, mana-mana bot ialah pihak ketiga yang bertindak sebagai perantara antara API pengecaman pertuturan dan pengguna, dan ini, sekurang-kurangnya, tidak selamat.

Seperti yang dinyatakan sebelum ini, telegram-desktop mempunyai dua kelebihan penting: kemudahan dan kelajuan operasi. Dan ini bukan kebetulan, kerana ia ditulis sepenuhnya dalam C++. Dan kerana kami memutuskan untuk menambah fungsi baharu terus kepada pelanggan, kami terpaksa membangunkannya dalam C++.

Hackathon DevDays'19 (bahagian 2): penghurai mesej audio untuk pemeriksaan Telegram dan tatabahasa dalam IntelliJ IDEATerdapat 4 orang dalam pasukan kami. Pada mulanya, dua orang sedang mencari perpustakaan yang sesuai untuk pengecaman pertuturan, seorang sedang mengkaji kod sumber Telegram-desktop, seorang lagi sedang menggunakan projek binaan Desktop Telegram. Kemudian, semua orang sibuk membetulkan UI dan nyahpepijat.

Nampaknya melaksanakan fungsi yang dimaksudkan tidak sukar, tetapi, seperti biasa, kesukaran timbul.

Penyelesaian kepada masalah tersebut terdiri daripada dua subtugas bebas: memilih alat pengecaman pertuturan yang sesuai dan melaksanakan UI untuk fungsi baharu.

Apabila memilih perpustakaan untuk pengecaman suara, kami terpaksa meninggalkan semua API luar talian dengan serta-merta, kerana model bahasa mengambil banyak ruang. Tetapi kita bercakap tentang satu bahasa sahaja. Ia menjadi jelas bahawa kami perlu menggunakan API dalam talian. Kemudian ternyata perkhidmatan pengecaman pertuturan gergasi seperti Google, Yandex dan Microsoft tidak sama sekali percuma, dan kami perlu berpuas hati dengan tempoh percubaan. Hasilnya, Google Speech-To-Text telah dipilih kerana ia membolehkan anda mendapatkan token untuk menggunakan perkhidmatan tersebut, yang akan bertahan selama setahun penuh.

Masalah kedua yang kami temui adalah berkaitan dengan beberapa kelemahan C++ - zoo pelbagai perpustakaan tanpa adanya repositori berpusat. Kebetulan Desktop Telegram bergantung pada banyak perpustakaan khusus versi lain. Repositori rasmi mempunyai arahan untuk memasang projek. Dan juga sejumlah besar isu terbuka tentang masalah binaan, sebagai contoh masa ΠΈ Π΄Π²Π°. Semua masalah ternyata berkaitan dengan fakta bahawa skrip binaan ditulis untuk Ubuntu 14.04, dan untuk berjaya membina telegram di bawah Ubuntu 18.04, perubahan perlu dibuat.

Telegram Desktop sendiri mengambil masa yang agak lama untuk dipasang: pada komputer riba dengan Intel Core i5-7200U, pemasangan lengkap (bendera -j 4) dengan semua kebergantungan mengambil masa kira-kira tiga jam. Daripada jumlah ini, kira-kira 30 minit diambil dengan memautkan klien itu sendiri (kemudian ternyata dalam konfigurasi Nyahpepijat, pemautan mengambil masa kira-kira 10 minit), namun peringkat pemautan perlu diulang setiap kali selepas membuat perubahan.

Walaupun menghadapi masalah, kami berjaya melaksanakan idea yang difikirkan, serta mengemas kini membina skrip untuk Ubuntu 18.04. Demonstrasi kerja boleh dilihat di pautan. Kami juga menyertakan beberapa animasi. Butang telah muncul di sebelah semua mesej suara, membolehkan anda menterjemah mesej ke dalam teks. Dengan mengklik kanan, anda juga boleh menentukan bahasa yang akan digunakan untuk penyiaran. Oleh pautan klien tersedia untuk dimuat turun.

Repositori.

Pada pendapat kami, ia ternyata menjadi Bukti Konsep yang baik untuk fungsi yang akan memudahkan ramai pengguna. Kami berharap dapat melihatnya dalam keluaran Desktop Telegram yang akan datang.

Sokongan Bahasa Semulajadi yang Dipertingkatkan dalam IntelliJ IDEA

Hackathon DevDays'19 (bahagian 2): penghurai mesej audio untuk pemeriksaan Telegram dan tatabahasa dalam IntelliJ IDEA

Pengarang idea itu

Tankov Vladislav

Berbaris

Tankov Vladislav (ketua pasukan, bekerja dengan LanguageTool dan IntelliJ IDEA)
Nikita Sokolov (bekerja dengan LanguageTool dan mencipta UI)
Khvorov Alexander (bekerja dengan LanguageTool dan mengoptimumkan prestasi)
Sadovnikov Alexander (sokongan untuk menghurai bahasa markup dan kod)

Kami telah membangunkan pemalam untuk IntelliJ IDEA yang menyemak pelbagai teks (komen dan dokumentasi, baris literal dalam kod, teks yang diformatkan dalam Markdown atau markup XML) untuk ketepatan tatabahasa, ejaan dan gaya (dalam bahasa Inggeris ini dipanggil proofreading).

Idea projek ini adalah untuk mengembangkan semakan ejaan standard IntelliJ IDEA kepada skala Grammarly, untuk membuat sejenis Grammarly di dalam IDE.

Anda boleh melihat apa yang berlaku ΠΏΠΎ ссылкС.

Nah, di bawah ini kita akan bercakap dengan lebih terperinci tentang keupayaan pemalam, serta kesukaran yang timbul semasa penciptaannya.

Motivasi

Terdapat banyak produk yang direka untuk menulis teks dalam bahasa semula jadi, tetapi dokumentasi dan komen kod paling kerap ditulis dalam persekitaran pembangunan. Pada masa yang sama, IDE melakukan kerja yang sangat baik untuk mencari ralat dalam kod, tetapi kurang sesuai untuk teks dalam bahasa semula jadi. Ini menjadikannya sangat mudah untuk membuat kesilapan dalam tatabahasa, tanda baca atau gaya tanpa persekitaran pembangunan menunjukkannya. Adalah paling kritikal untuk membuat kesilapan dalam menulis antara muka pengguna, kerana ini akan menjejaskan bukan sahaja kefahaman kod, tetapi juga pengguna aplikasi yang dibangunkan itu sendiri.

Salah satu persekitaran pembangunan yang paling popular dan dibangunkan ialah IntelliJ IDEA, serta IDE berdasarkan Platform IntelliJ. Platform IntelliJ sudah mempunyai penyemak ejaan terbina dalam, tetapi ia tidak menyingkirkan ralat tatabahasa yang paling mudah sekalipun. Kami memutuskan untuk menyepadukan salah satu sistem analisis bahasa semula jadi yang popular ke dalam IntelliJ IDEA.

РСализация

Hackathon DevDays'19 (bahagian 2): penghurai mesej audio untuk pemeriksaan Telegram dan tatabahasa dalam IntelliJ IDEAKami tidak menetapkan sendiri tugas untuk mencipta sistem pengesahan teks kami sendiri, jadi kami menggunakan penyelesaian sedia ada. Pilihan yang paling sesuai ternyata LanguageTool. Lesen itu membenarkan kami menggunakannya secara bebas untuk tujuan kami: ia adalah percuma, ditulis dalam Java dan sumber terbuka. Di samping itu, ia menyokong 25 bahasa dan telah dibangunkan selama lebih daripada lima belas tahun. Di sebalik keterbukaannya, LanguageTool adalah pesaing serius untuk penyelesaian pengesahan teks berbayar, dan hakikat bahawa ia boleh berfungsi secara tempatan secara literal adalah ciri pembunuhnya.

Kod pemalam ada dalam repositori di GitHub. Keseluruhan projek telah ditulis dalam Kotlin dengan sedikit tambahan Java untuk UI. Semasa hackathon, kami berjaya melaksanakan sokongan untuk Markdown, JavaDoc, HTML dan Plain Text. Selepas hackathon, kemas kini utama menambah sokongan untuk XML, literal rentetan dalam Java, Kotlin dan Python, dan semakan ejaan.

Kesukaran

Dengan cepat kami menyedari bahawa jika kami menyuapkan semua teks ke LanguageTool untuk pemeriksaan setiap kali, maka antara muka IDEA akan membeku pada mana-mana teks yang lebih atau kurang serius, kerana pemeriksaan itu sendiri menyekat aliran UI. Masalah telah diselesaikan melalui semakan `ProgressManager.checkCancelled` - fungsi ini memberikan pengecualian jika IDEA percaya bahawa sudah tiba masanya untuk membatalkan pemeriksaan.

Ini menghapuskan pembekuan sepenuhnya, tetapi adalah mustahil untuk digunakan: teks mengambil masa yang sangat lama untuk diproses. Lebih-lebih lagi, dalam kes kami, selalunya sebahagian kecil daripada teks berubah dan kami mahu cache hasilnya entah bagaimana. Itulah yang kami lakukan. Untuk tidak menyemak segala-galanya setiap kali, kami secara deterministik membelah teks menjadi beberapa bahagian dan menyemak hanya teks yang telah berubah. Memandangkan teks boleh menjadi besar dan kami tidak mahu memuatkan cache, kami tidak menyimpan teks itu sendiri, tetapi cincangnya. Ini membolehkan pemalam beroperasi dengan lancar walaupun pada fail besar.

LanguageTool menyokong lebih daripada 25 bahasa, tetapi tidak mungkin mana-mana pengguna memerlukan kesemuanya. Saya ingin memberi peluang untuk memuat turun perpustakaan untuk bahasa tertentu atas permintaan (jika anda menandakannya dalam UI). Kami juga melaksanakan ini, tetapi ia ternyata terlalu rumit dan tidak boleh dipercayai. Khususnya, kami terpaksa memuatkan LanguageTool dengan set bahasa baharu menggunakan pemuat kelas yang berasingan, dan kemudian memulakannya dengan berhati-hati. Pada masa yang sama, semua perpustakaan berada dalam repositori .m2 pengguna, dan pada setiap permulaan kami perlu menyemak integritinya. Pada akhirnya, kami memutuskan bahawa jika pengguna menghadapi masalah dengan saiz pemalam, maka kami akan menyediakan pemalam yang berasingan untuk beberapa bahasa yang paling popular.

Selepas hackathon

Hackathon telah berakhir, tetapi kerja pada pemalam diteruskan dengan pasukan yang lebih sempit. Saya mahu menyokong rentetan, komen, dan juga binaan bahasa seperti pembolehubah dan nama kelas. Pada masa ini ini hanya disokong untuk Java, Kotlin dan Python, tetapi kami berharap senarai ini akan berkembang. Kami telah membetulkan banyak pepijat kecil dan menjadi lebih serasi dengan penyemak ejaan terbina dalam Idea. Selain itu, sokongan XML dan semakan ejaan telah muncul. Semua ini boleh didapati dalam versi kedua, yang kami terbitkan baru-baru ini.

Apa seterusnya?

Plugin sedemikian boleh berguna bukan sahaja untuk pembangun, tetapi juga untuk penulis teknikal (selalunya berfungsi, sebagai contoh, dengan XML dalam IDE). Setiap hari mereka perlu bekerja dengan bahasa semula jadi, tanpa mempunyai pembantu dalam bentuk petua editor tentang kemungkinan kesilapan. Pemalam kami menyediakan petunjuk sedemikian dan melakukannya dengan tahap ketepatan yang tinggi.
Kami merancang untuk membangunkan pemalam, kedua-duanya dengan menambah bahasa baharu dan dengan meneroka pendekatan umum untuk mengatur pemeriksaan teks. Rancangan segera kami termasuk pelaksanaan profil gaya (set peraturan yang mentakrifkan panduan gaya untuk teks, contohnya, "jangan tulis cth, tetapi tulis dalam bentuk penuh"), mengembangkan kamus dan menambah baik antara muka pengguna (khususnya, kami ingin memberi pengguna peluang bukan sahaja untuk mengabaikan perkataan, tetapi menambahnya ke dalam kamus, menunjukkan bahagian ucapan).

Sumber: www.habr.com

Tambah komen