Hackathon DevDays'19 (partea 2): analizator de mesaje audio pentru verificarea telegramelor și a gramaticii în IntelliJ IDEA

Continuăm să vorbim despre proiectele hackatonului de primăvară DevDays, la care au participat studenți ai programului de master „Dezvoltare software/Inginerie software”.

Hackathon DevDays'19 (partea 2): analizator de mesaje audio pentru verificarea telegramelor și a gramaticii în IntelliJ IDEA

Apropo, am dori să invităm cititorii să se alăture Grupul VK de masteranzi. În el vom publica cele mai recente știri despre recrutare și studiu. Un videoclip de la ziua porților deschise poate fi găsit și în grup. Vă reamintim: evenimentul va avea loc pe 29 aprilie, detalii on-line.

Analizator de mesaje vocale Telegram Desktop

Hackathon DevDays'19 (partea 2): analizator de mesaje audio pentru verificarea telegramelor și a gramaticii în IntelliJ IDEA

Autorul ideii
Khoroshev Artyom

Alinia

Khoroshev Artem – manager de proiect/dezvoltator/QA
Eliseev Anton – analist de afaceri/specialist în marketing
Maria Kuklina – designer/dezvoltator UI
Bakhvalov Pavel – designer/dezvoltator de IU/QA

Din punctul nostru de vedere, Telegram este un messenger modern și convenabil, iar versiunea sa pentru PC este populară și open source, ceea ce face posibilă modificarea acestuia. Clientul oferă o funcționalitate destul de bogată. Pe lângă mesajele text standard, acesta conține apeluri vocale, mesaje video și mesaje vocale. Și tocmai acestea din urmă aduc uneori neplăceri destinatarului lor. Adesea, nu este posibil să ascultați un mesaj vocal în timp ce vă aflați la computer sau laptop. Poate exista zgomot ambiental, lipsa căștilor sau nu doriți ca nimeni să audă conținutul mesajului. Asemenea probleme nu apar aproape niciodată dacă folosești Telegram pe un smartphone, deoarece pur și simplu îl poți aduce la ureche, spre deosebire de laptop sau PC. Am încercat să rezolvăm această problemă.

Scopul proiectului nostru la DevDays a fost de a adăuga capacitatea de a traduce mesajele vocale primite în text la clientul desktop Telegram (denumit în continuare Telegram Desktop).

Toți analogii în acest moment sunt boți cărora le puteți trimite un mesaj audio și puteți primi un text ca răspuns. Nu suntem foarte mulțumiți de asta: redirecționarea unui mesaj către un bot nu este foarte convenabilă; am dori să avem funcționalitate nativă. În plus, orice bot este o terță parte care acționează ca intermediar între API-ul de recunoaștere a vorbirii și utilizator, iar acest lucru este, cel puțin, nesigur.

După cum sa menționat mai devreme, telegram-desktop are două avantaje semnificative: ușurința și viteza de operare. Și nu este o coincidență, pentru că este scris în întregime în C++. Și din moment ce am decis să adăugăm noi funcționalități direct clientului, a trebuit să o dezvoltăm în C++.

Hackathon DevDays'19 (partea 2): analizator de mesaje audio pentru verificarea telegramelor și a gramaticii în IntelliJ IDEAErau 4 oameni în echipa noastră. Inițial, două persoane căutau o bibliotecă adecvată pentru recunoașterea vorbirii, o persoană studia codul sursă al desktop-ului Telegram, alta implementa proiectul de construcție Telegramă desktop. Mai târziu, toată lumea a fost ocupată cu repararea interfeței de utilizare și depanarea.

Se părea că implementarea funcționalității dorite nu va fi dificilă, dar, așa cum se întâmplă întotdeauna, au apărut dificultăți.

Soluția problemei a constat în două subsarcini independente: alegerea unui instrument adecvat de recunoaștere a vorbirii și implementarea unei interfețe de utilizare pentru o nouă funcționalitate.

Atunci când am ales o bibliotecă pentru recunoașterea vocii, a trebuit imediat să renunțăm la toate API-urile offline, deoarece modelele de limbă ocupă mult spațiu. Dar vorbim de o singură limbă. A devenit clar că va trebui să folosim API-ul online. Mai târziu s-a dovedit că serviciile de recunoaștere a vorbirii unor giganți precum Google, Yandex și Microsoft nu sunt deloc gratuite și va trebui să ne mulțumim cu o perioadă de probă. Drept urmare, Google Speech-To-Text a fost ales pentru că vă permite să obțineți un simbol pentru utilizarea serviciului, care va dura un an întreg.

A doua problemă pe care am întâlnit-o este legată de unele dintre deficiențele C++ - o grădină zoologică cu diferite biblioteci în absența unui depozit centralizat. Se întâmplă că Telegram Desktop depinde de multe alte biblioteci specifice versiunii. Depozitul oficial are instrucție pentru asamblarea proiectului. Și, de asemenea, un număr mare de probleme deschise despre problemele de construcție, de exemplu timp и два. Toate problemele s-au dovedit a fi legate de faptul că scriptul de compilare a fost scris pentru Ubuntu 14.04 și, pentru a construi cu succes telegramă sub Ubuntu 18.04, au trebuit făcute modificări.

Telegram Desktop în sine durează destul de mult timp pentru a asambla: pe un laptop cu un Intel Core i5-7200U, asamblarea completă (flag -j 4) cu toate dependențele durează aproximativ trei ore. Dintre acestea, aproximativ 30 de minute sunt luate prin conectarea clientului în sine (mai târziu s-a dovedit că în configurația Debug, conectarea durează aproximativ 10 minute), dar etapa de conectare trebuie repetată de fiecare dată după efectuarea modificărilor.

În ciuda problemelor, am reușit să implementăm ideea concepută, precum și să actualizăm construi script pentru Ubuntu 18.04. O demonstrație a lucrării poate fi văzută la legătură. Includem și câteva animații. Lângă toate mesajele vocale a apărut un buton, permițându-vă să traduceți mesajul în text. Făcând clic dreapta, puteți specifica în plus limba care va fi folosită pentru difuzare. De legătură client disponibil pentru descărcare.

Repertoriu.

În opinia noastră, s-a dovedit a fi o bună dovadă a conceptului de funcționalitate, care ar fi convenabilă pentru mulți utilizatori. Sperăm să-l vedem în versiunile viitoare ale Telegram Desktop.

Suport îmbunătățit pentru limbajul natural în IntelliJ IDEA

Hackathon DevDays'19 (partea 2): analizator de mesaje audio pentru verificarea telegramelor și a gramaticii în IntelliJ IDEA

Autorul ideii

Tankov Vladislav

Alinia

Tankov Vladislav (conducător de echipă, lucrând cu LanguageTool și IntelliJ IDEA)
Nikita Sokolov (lucru cu LanguageTool și crearea interfeței de utilizare)
Khvorov Alexander (lucru cu LanguageTool și optimizarea performanței)
Sadovnikov Alexander (suport pentru analizarea limbajelor de marcare și a codului)

Am dezvoltat un plugin pentru IntelliJ IDEA care verifică diverse texte (comentarii și documentație, linii literale în cod, text formatat în Markdown sau marcaj XML) pentru acuratețea gramaticală, ortografică și stilistică (în engleză aceasta se numește corectare).

Ideea proiectului a fost să extindă verificarea ortografică standard IntelliJ IDEA la scara Grammarly, pentru a face un fel de Grammarly în interiorul IDE.

Puteți vedea ce sa întâmplat по ссылке.

Ei bine, mai jos vom vorbi mai detaliat despre capacitățile pluginului, precum și despre dificultățile care au apărut în timpul creării acestuia.

Motivație

Există multe produse concepute pentru scrierea textului în limbaje naturale, dar documentația și comentariile de cod sunt scrise cel mai adesea în medii de dezvoltare. În același timp, IDE-urile fac o treabă excelentă în găsirea erorilor în cod, dar sunt slab potrivite pentru textele în limbaje naturale. Acest lucru face foarte ușor să faceți greșeli în gramatică, punctuație sau stil, fără ca mediul de dezvoltare să le sublinieze. Cel mai important este să faceți o greșeală în scrierea interfeței cu utilizatorul, deoarece acest lucru va afecta nu numai înțelegerea codului, ci și utilizatorii aplicației dezvoltate înșiși.

Unul dintre cele mai populare și dezvoltate medii de dezvoltare este IntelliJ IDEA, precum și IDE-urile bazate pe Platforma IntelliJ. Platforma IntelliJ are deja un verificator ortografic încorporat, dar nu scapă nici măcar de cele mai simple erori gramaticale. Am decis să integrăm unul dintre sistemele populare de analiză a limbajului natural în IntelliJ IDEA.

punerea în aplicare

Hackathon DevDays'19 (partea 2): analizator de mesaje audio pentru verificarea telegramelor și a gramaticii în IntelliJ IDEANu ne-am propus să ne creăm propriul sistem de verificare a textului, așa că am folosit o soluție existentă. Cea mai potrivită opțiune s-a dovedit a fi LanguageTool. Licența ne-a permis să o folosim liber în scopurile noastre: este gratuită, scrisă în Java și open-source. În plus, acceptă 25 de limbi și a fost în dezvoltare de mai bine de cincisprezece ani. În ciuda deschiderii sale, LanguageTool este un concurent serios pentru soluțiile plătite de verificare a textului, iar faptul că poate funcționa la nivel local este literalmente caracteristica sa ucigașă.

Codul pluginului este în depozite pe GitHub. Întregul proiect a fost scris în Kotlin cu o mică adăugare de Java pentru UI. În timpul hackatonului, am reușit să implementăm suport pentru Markdown, JavaDoc, HTML și Plain Text. După hackathon, o actualizare majoră a adăugat suport pentru XML, literale de șir în Java, Kotlin și Python și verificarea ortografică.

dificultăți

Destul de repede ne-am dat seama că dacă trimitem tot textul la LanguageTool pentru inspecție de fiecare dată, atunci interfața IDEA se va bloca pe orice text mai mult sau mai puțin serios, deoarece inspecția în sine blochează fluxul UI. Problema a fost rezolvată prin verificarea `ProgressManager.checkCancelled` - această funcție aruncă o excepție dacă IDEA consideră că este timpul să anuleze inspecția.

Acest lucru a eliminat complet înghețarile, dar este imposibil de utilizat: procesarea textului durează foarte mult. Mai mult, în cazul nostru, cel mai adesea o parte foarte mică a textului se modifică și vrem să memorăm rezultatele cumva. Exact asta am făcut. Pentru a nu verifica totul de fiecare dată, am împărțit determinist textul în bucăți și le-am verificat doar pe cele care s-au schimbat. Deoarece textele pot fi mari și nu am vrut să încărcăm memoria cache, am stocat nu textele în sine, ci hashurile lor. Acest lucru a permis pluginului să funcționeze fără probleme chiar și pe fișiere mari.

LanguageTool acceptă mai mult de 25 de limbi, dar este puțin probabil ca un utilizator să aibă nevoie de toate. Am vrut să ofer posibilitatea de a descărca biblioteci pentru o anumită limbă la cerere (dacă o bifați în UI). Chiar am implementat acest lucru, dar s-a dovedit a fi prea complicat și nesigur. În special, a trebuit să încărcăm LanguageTool cu ​​un nou set de limbi utilizând un classloader separat și apoi să-l inițializam cu atenție. În același timp, toate bibliotecile erau într-un depozit .m2 de utilizator și la fiecare pornire trebuia să le verificăm integritatea. În cele din urmă, am decis că, dacă utilizatorii au probleme cu dimensiunea pluginului, atunci vom oferi un plugin separat pentru câteva dintre cele mai populare limbi.

După hackaton

Hackathonul s-a încheiat, dar munca la plugin a continuat cu o echipă mai restrânsă. Am vrut să accept șiruri de caractere, comentarii și chiar constructe de limbaj, cum ar fi numele de variabile și de clase. În prezent, acest lucru este acceptat doar pentru Java, Kotlin și Python, dar sperăm că această listă va crește. Am remediat o mulțime de erori mici și am devenit mai compatibile cu corectorul ortografic încorporat al lui Idea. În plus, au apărut suportul XML și verificarea ortografică. Toate acestea pot fi găsite în a doua versiune, pe care am publicat-o recent.

Ce urmeaza?

Un astfel de plugin poate fi util nu numai pentru dezvoltatori, ci și pentru scriitorii tehnici (care lucrează adesea, de exemplu, cu XML într-un IDE). În fiecare zi trebuie să lucreze cu limbaj natural, fără a avea un asistent sub formă de sfaturi editor despre posibile erori. Pluginul nostru oferă astfel de indicii și o face cu un grad ridicat de acuratețe.
Intenționăm să dezvoltăm pluginul, atât prin adăugarea de noi limbi, cât și prin explorarea unei abordări generale a organizării verificării textului. Planurile noastre imediate includ implementarea profilurilor stilistice (seturi de reguli care definesc un ghid de stil pentru text, de exemplu, „nu scrieți, de exemplu, ci scrieți forma completă”), extinderea dicționarului și îmbunătățirea interfeței cu utilizatorul (în special, vrem să oferim utilizatorului posibilitatea nu doar de a ignora un cuvânt, ci de a-l adăuga în dicționar, indicând partea de vorbire).

Sursa: www.habr.com

Adauga un comentariu