Hackathon DevDays'19 (parte 2): parser di messaggi audio per Telegram e controllo grammaticale in IntelliJ IDEA

Continuiamo a parlare dei progetti dell'hackathon primaverile DevDays, a cui hanno partecipato gli studenti del master "Sviluppo software/Ingegneria del software".

Hackathon DevDays'19 (parte 2): parser di messaggi audio per Telegram e controllo grammaticale in IntelliJ IDEA

A proposito, vorremmo invitare i lettori a unirsi Gruppo VK di studenti del master. In esso pubblicheremo le ultime notizie sul reclutamento e sullo studio. Nel gruppo è possibile trovare anche un video dell'open day. Vi ricordiamo: l'evento si svolgerà il 29 aprile, i dettagli on-line.

Parser di messaggi vocali desktop di Telegram

Hackathon DevDays'19 (parte 2): parser di messaggi audio per Telegram e controllo grammaticale in IntelliJ IDEA

L'autore dell'idea
Khoroshev Artyom

Allineare

Khoroshev Artem – project manager/sviluppatore/QA
Eliseev Anton – analista aziendale/specialista di marketing
Maria Kuklina – Progettista/sviluppatrice dell'interfaccia utente
Bakhvalov Pavel – Progettista/sviluppatore/QA dell'interfaccia utente

Dal nostro punto di vista, Telegram è un messenger moderno e conveniente, e la sua versione per PC è popolare e open source, il che rende possibile modificarlo. Il client offre funzionalità piuttosto ricche. Oltre ai messaggi di testo standard, contiene chiamate vocali, videomessaggi e messaggi vocali. E sono proprio questi ultimi che talvolta recano disagi al destinatario. Spesso non è possibile ascoltare un messaggio vocale mentre si è al computer o al laptop. Potrebbe esserci rumore ambientale, mancanza di cuffie o non vuoi che nessuno ascolti il ​​contenuto del messaggio. Tali problemi non sorgono quasi mai se usi Telegram su uno smartphone, perché puoi semplicemente portarlo all'orecchio, a differenza di un laptop o PC. Abbiamo provato a risolvere questo problema.

L'obiettivo del nostro progetto al DevDays era aggiungere la possibilità di tradurre i messaggi vocali ricevuti in testo al client desktop di Telegram (di seguito denominato Telegram Desktop).

Tutti gli analoghi al momento sono robot ai quali è possibile inviare un messaggio audio e ricevere un testo in risposta. Questo non ci soddisfa molto: inoltrare un messaggio a un bot non è molto comodo, vorremmo avere funzionalità native. Inoltre, qualsiasi bot è una terza parte che funge da intermediario tra l'API di riconoscimento vocale e l'utente e questo è, come minimo, pericoloso.

Come notato in precedenza, Telegram-Desktop presenta due vantaggi significativi: facilità e velocità di funzionamento. E non è un caso, perché è scritto interamente in C++. E poiché abbiamo deciso di aggiungere nuove funzionalità direttamente al client, abbiamo dovuto svilupparle in C++.

Hackathon DevDays'19 (parte 2): parser di messaggi audio per Telegram e controllo grammaticale in IntelliJ IDEAC'erano 4 persone nel nostro team. Inizialmente, due persone stavano cercando una libreria adatta per il riconoscimento vocale, una persona stava studiando il codice sorgente di Telegram-desktop, un'altra stava implementando il progetto di build Telegram Desktop. Successivamente, tutti erano impegnati a sistemare l'interfaccia utente e a eseguire il debug.

Sembrava che implementare la funzionalità prevista non sarebbe stato difficile, ma, come sempre accade, sono emerse delle difficoltà.

La soluzione al problema consisteva in due sottoattività indipendenti: la scelta di uno strumento di riconoscimento vocale adeguato e l'implementazione di un'interfaccia utente per nuove funzionalità.

Quando abbiamo scelto una libreria per il riconoscimento vocale, abbiamo dovuto immediatamente abbandonare tutte le API offline, perché i modelli linguistici occupano molto spazio. Ma stiamo parlando di una sola lingua. È diventato chiaro che avremmo dovuto utilizzare l'API online. Successivamente si è scoperto che i servizi di riconoscimento vocale di giganti come Google, Yandex e Microsoft non sono affatto gratuiti e dovremo accontentarci di un periodo di prova. Di conseguenza, è stato scelto Google Speech-To-Text perché consente di ottenere un token per l'utilizzo del servizio, che durerà un anno intero.

Il secondo problema che abbiamo riscontrato è legato ad alcuni difetti del C++: uno zoo di varie librerie in assenza di un repository centralizzato. Accade così che Telegram Desktop dipenda da molte altre librerie specifiche della versione. Il repository ufficiale ha istruzione per assemblare il progetto. E anche un gran numero di questioni aperte su problemi di costruzione, per esempio tempo и два. Tutti i problemi si sono rivelati legati al fatto che lo script di build è stato scritto per Ubuntu 14.04 e per poter creare con successo Telegram sotto Ubuntu 18.04 è stato necessario apportare delle modifiche.

L'assemblaggio di Telegram Desktop richiede molto tempo: su un laptop con Intel Core i5-7200U, l'assemblaggio completo (flag -j 4) con tutte le dipendenze richiede circa tre ore. Di questi, circa 30 minuti vengono impiegati collegando il client stesso (in seguito si è scoperto che nella configurazione Debug il collegamento richiede circa 10 minuti), eppure la fase di collegamento deve essere ripetuta ogni volta dopo aver apportato modifiche.

Nonostante i problemi, siamo riusciti a realizzare l'idea concepita e ad aggiornarla costruire script perUbuntu 18.04. Una dimostrazione del lavoro può essere vista su collegamento. Includiamo anche diverse animazioni. Accanto a tutti i messaggi vocali è apparso un pulsante che consente di tradurre il messaggio in testo. Facendo clic con il tasto destro è inoltre possibile specificare la lingua che verrà utilizzata per la trasmissione. Di collegamento client disponibile per il download.

Deposito.

A nostro avviso, si è rivelata una buona funzionalità Proof of Concept che sarebbe conveniente per molti utenti. Speriamo di vederlo nelle versioni future di Telegram Desktop.

Supporto migliorato del linguaggio naturale in IntelliJ IDEA

Hackathon DevDays'19 (parte 2): parser di messaggi audio per Telegram e controllo grammaticale in IntelliJ IDEA

L'autore dell'idea

Tankov Vladislav

Allineare

Tankov Vladislav (responsabile del team, che lavora con LanguageTool e IntelliJ IDEA)
Nikita Sokolov (lavora con LanguageTool e crea l'interfaccia utente)
Khvorov Alexander (lavorare con LanguageTool e ottimizzare le prestazioni)
Sadovnikov Alexander (supporto per l'analisi dei linguaggi di markup e del codice)

Abbiamo sviluppato un plugin per IntelliJ IDEA che controlla vari testi (commenti e documentazione, righe letterali nel codice, testo formattato in Markdown o markup XML) per l'accuratezza grammaticale, ortografica e stilistica (in inglese questo si chiama correzione di bozze).

L'idea del progetto era di espandere il controllo ortografico standard IntelliJ IDEA alla scala di Grammarly, per creare una sorta di Grammarly all'interno dell'IDE.

Puoi vedere cosa è successo collegamento.

Bene, di seguito parleremo più in dettaglio delle capacità del plugin e delle difficoltà sorte durante la sua creazione.

motivazione

Esistono molti prodotti progettati per scrivere testo in linguaggi naturali, ma la documentazione e i commenti al codice vengono spesso scritti in ambienti di sviluppo. Allo stesso tempo, gli IDE svolgono un ottimo lavoro nel trovare errori nel codice, ma sono poco adatti per i testi in linguaggio naturale. Ciò rende molto facile commettere errori di grammatica, punteggiatura o stile senza che l'ambiente di sviluppo li segnali. È molto importante commettere un errore nella scrittura dell'interfaccia utente, poiché ciò influenzerà non solo la comprensibilità del codice, ma anche gli stessi utenti dell'applicazione sviluppata.

Uno degli ambienti di sviluppo più popolari e sviluppati è IntelliJ IDEA, così come gli IDE basati sulla piattaforma IntelliJ. IntelliJ Platform ha già un correttore ortografico integrato, ma non elimina nemmeno gli errori grammaticali più semplici. Abbiamo deciso di integrare uno dei popolari sistemi di analisi del linguaggio naturale in IntelliJ IDEA.

implementazione

Hackathon DevDays'19 (parte 2): parser di messaggi audio per Telegram e controllo grammaticale in IntelliJ IDEANon ci siamo posti il ​​compito di creare un nostro sistema di verifica del testo, quindi abbiamo utilizzato una soluzione esistente. L'opzione più adatta si è rivelata LanguageTool. La licenza ci ha permesso di utilizzarlo liberamente per i nostri scopi: è gratuito, scritto in Java e open source. Inoltre, supporta 25 lingue ed è in sviluppo da più di quindici anni. Nonostante la sua apertura, LanguageTool è un serio concorrente delle soluzioni di verifica del testo a pagamento e il fatto che possa funzionare localmente è letteralmente la sua caratteristica principale.

Il codice del plugin è dentro repository su GitHub. L'intero progetto è stato scritto in Kotlin con una piccola aggiunta di Java per l'interfaccia utente. Durante l'hackathon siamo riusciti a implementare il supporto per Markdown, JavaDoc, HTML e Plain Text. Dopo l'hackathon, un importante aggiornamento ha aggiunto il supporto per XML, stringhe letterali in Java, Kotlin e Python e controllo ortografico.

difficoltà

Abbastanza rapidamente ci siamo resi conto che se ogni volta inviamo tutto il testo a LanguageTool per l'ispezione, l'interfaccia IDEA si bloccherà su qualsiasi testo più o meno serio, poiché l'ispezione stessa blocca il flusso dell'interfaccia utente. Il problema è stato risolto tramite il controllo `ProgressManager.checkCancelled`: questa funzione genera un'eccezione se IDEA ritiene che sia ora di interrompere l'ispezione.

Ciò ha eliminato completamente i blocchi, ma è impossibile da utilizzare: il testo impiega molto tempo per essere elaborato. Inoltre, nel nostro caso, molto spesso cambia una parte molto piccola del testo e vogliamo in qualche modo memorizzare nella cache i risultati. Questo è esattamente quello che abbiamo fatto. Per non controllare ogni volta tutto, abbiamo suddiviso deterministicamente il testo in parti e controllato solo quelle che erano cambiate. Poiché i testi possono essere di grandi dimensioni e non volevamo caricare la cache, non abbiamo archiviato i testi stessi, ma i loro hash. Ciò ha consentito al plugin di funzionare senza problemi anche su file di grandi dimensioni.

LanguageTool supporta più di 25 lingue, ma è improbabile che un utente le abbia bisogno di tutte. Volevo dare l'opportunità di scaricare librerie per una lingua specifica su richiesta (se la spunti nell'interfaccia utente). Abbiamo anche implementato questo, ma si è rivelato troppo complicato e inaffidabile. In particolare, abbiamo dovuto caricare LanguageTool con un nuovo set di lingue utilizzando un classloader separato, quindi inizializzarlo attentamente. Allo stesso tempo, tutte le librerie erano in un repository utente .m2 e ad ogni avvio dovevamo verificarne l'integrità. Alla fine, abbiamo deciso che se gli utenti avessero avuto problemi con le dimensioni del plugin, avremmo fornito un plugin separato per molte delle lingue più popolari.

Dopo l'hackathon

L'hackathon è terminato, ma il lavoro sul plugin è continuato con un team più ristretto. Volevo supportare stringhe, commenti e persino costrutti linguistici come nomi di variabili e classi. Attualmente questo è supportato solo per Java, Kotlin e Python, ma speriamo che questo elenco cresca. Abbiamo corretto molti piccoli bug e siamo diventati più compatibili con il controllo ortografico integrato di Idea. Inoltre sono comparsi il supporto XML e il controllo ortografico. Tutto questo lo possiamo trovare nella seconda versione, che abbiamo pubblicato di recente.

Quali sono le prospettive?

Un plugin di questo tipo può essere utile non solo per gli sviluppatori, ma anche per gli scrittori tecnici (che spesso lavorano, ad esempio, con XML in un IDE). Ogni giorno devono lavorare con il linguaggio naturale, senza avere un assistente sotto forma di suggerimenti dell'editore su possibili errori. Il nostro plugin fornisce tali suggerimenti e lo fa con un alto grado di precisione.
Abbiamo in programma di sviluppare il plugin, sia aggiungendo nuove lingue, sia esplorando un approccio generale all'organizzazione del controllo del testo. I nostri piani immediati includono l'implementazione di profili stilistici (insiemi di regole che definiscono una guida di stile per il testo, ad esempio "non scrivere ad es, ma scrivi la forma completa"), l'espansione del dizionario e il miglioramento dell'interfaccia utente (in particolare, vogliamo dare la possibilità all'utente non solo di ignorare una parola, ma di aggiungerla al dizionario, indicando la parte del discorso).

Fonte: www.habr.com

Aggiungi un commento