DevDays'19 Hackathon (Μέρος 2): Αναλυτής φωνητικών μηνυμάτων για Telegram και Γραμματικό Έλεγχο στο IntelliJ IDEA

Συνεχίζουμε να μιλάμε για τα έργα του ανοιξιάτικου hackathon DevDays, στα οποία συμμετείχαν φοιτητές του μεταπτυχιακού προγράμματος "Ανάπτυξη Λογισμικού / Μηχανική Λογισμικού".

Hackathon DevDays'19 (μέρος 2): αναλυτής ηχητικών μηνυμάτων για έλεγχο Telegram και γραμματικής στο IntelliJ IDEA

Παρεμπιπτόντως, θα θέλαμε να προσκαλέσουμε τους αναγνώστες να συμμετάσχουν VK ομάδα φοιτητών μεταπτυχιακού. Σε αυτό θα δημοσιεύσουμε τα τελευταία νέα σχετικά με τις προσλήψεις και τις σπουδές. Στην ομάδα μπορείτε να βρείτε και βίντεο από την ανοιχτή μέρα. Υπενθυμίζουμε: η εκδήλωση θα πραγματοποιηθεί στις 29 Απριλίου, λεπτομέρειες σε απευθείας σύνδεση.

Αναλυτής φωνητικών μηνυμάτων στην επιφάνεια εργασίας Telegram

Hackathon DevDays'19 (μέρος 2): αναλυτής ηχητικών μηνυμάτων για έλεγχο Telegram και γραμματικής στο IntelliJ IDEA

Ο συγγραφέας της ιδέας
Khoroshev Artyom

Δομή εντολών

Khoroshev Artem – project manager/developer/QA
Eliseev Anton – επιχειρηματικός αναλυτής/ειδικός μάρκετινγκ
Maria Kuklina – σχεδιάστρια/προγραμματιστής διεπαφής χρήστη
Bakhvalov Pavel – σχεδιαστής διεπαφής χρήστη/προγραμματιστής/QA

Από την άποψή μας, το Telegram είναι ένας σύγχρονος και βολικός αγγελιοφόρος και η έκδοση για υπολογιστή του είναι δημοφιλής και ανοιχτού κώδικα, γεγονός που καθιστά δυνατή την τροποποίηση του. Ο πελάτης προσφέρει αρκετά πλούσια λειτουργικότητα. Εκτός από τα τυπικά μηνύματα κειμένου, περιέχει φωνητικές κλήσεις, μηνύματα βίντεο και φωνητικά μηνύματα. Και είναι τα τελευταία που μερικές φορές φέρνουν ταλαιπωρία στον παραλήπτη τους. Συχνά δεν είναι δυνατό να ακούσετε ένα φωνητικό μήνυμα ενώ βρίσκεστε σε υπολογιστή ή φορητό υπολογιστή. Μπορεί να υπάρχει θόρυβος περιβάλλοντος, έλλειψη ακουστικών ή δεν θέλετε να ακούσει κανείς το περιεχόμενο του μηνύματος. Τέτοια προβλήματα δεν προκύπτουν σχεδόν ποτέ εάν χρησιμοποιείτε το Telegram σε smartphone, επειδή μπορείτε απλά να το φέρετε στο αυτί σας, σε αντίθεση με έναν φορητό υπολογιστή ή έναν υπολογιστή. Προσπαθήσαμε να λύσουμε αυτό το πρόβλημα.

Ο στόχος του έργου μας στο DevDays ήταν να προσθέσουμε τη δυνατότητα μετάφρασης των λαμβανόμενων φωνητικών μηνυμάτων σε κείμενο στον υπολογιστή-πελάτη υπολογιστή του Telegram (εφεξής καλούμενο Telegram Desktop).

Όλα τα ανάλογα αυτή τη στιγμή είναι bot στα οποία μπορείτε να στείλετε ένα ηχητικό μήνυμα και να λάβετε ένα κείμενο ως απάντηση. Δεν είμαστε πολύ ευχαριστημένοι με αυτό: η προώθηση ενός μηνύματος σε ένα bot δεν είναι πολύ βολικό· θα θέλαμε να έχουμε εγγενή λειτουργικότητα. Επιπλέον, οποιοδήποτε bot είναι ένα τρίτο μέρος που ενεργεί ως ενδιάμεσος μεταξύ του API αναγνώρισης ομιλίας και του χρήστη, και αυτό είναι, τουλάχιστον, μη ασφαλές.

Όπως αναφέρθηκε προηγουμένως, το telegram-desktop έχει δύο σημαντικά πλεονεκτήματα: ευκολία και ταχύτητα λειτουργίας. Και αυτό δεν είναι τυχαίο, γιατί είναι γραμμένο εξ ολοκλήρου σε C++. Και επειδή αποφασίσαμε να προσθέσουμε νέα λειτουργικότητα απευθείας στον πελάτη, έπρεπε να την αναπτύξουμε σε C++.

Hackathon DevDays'19 (μέρος 2): αναλυτής ηχητικών μηνυμάτων για έλεγχο Telegram και γραμματικής στο IntelliJ IDEAΣτην ομάδα μας ήταν 4 άτομα. Αρχικά, δύο άτομα έψαχναν για μια κατάλληλη βιβλιοθήκη για την αναγνώριση ομιλίας, ένα άτομο μελετούσε τον πηγαίο κώδικα του Telegram-desktop, ένα άλλο ανέπτυξε το έργο κατασκευής Τηλεγράφημα επιφάνειας εργασίας. Αργότερα, όλοι ήταν απασχολημένοι με τη διόρθωση του UI και τον εντοπισμό σφαλμάτων.

Φαινόταν ότι η υλοποίηση της προβλεπόμενης λειτουργικότητας δεν θα ήταν δύσκολη, αλλά, όπως συμβαίνει πάντα, προέκυψαν δυσκολίες.

Η λύση στο πρόβλημα συνίστατο σε δύο ανεξάρτητες δευτερεύουσες εργασίες: επιλογή κατάλληλου εργαλείου αναγνώρισης ομιλίας και εφαρμογή διεπαφής χρήστη για νέες λειτουργίες.

Όταν επιλέγαμε μια βιβλιοθήκη για αναγνώριση φωνής, έπρεπε αμέσως να εγκαταλείψουμε όλα τα API εκτός σύνδεσης, επειδή τα μοντέλα γλώσσας καταλαμβάνουν πολύ χώρο. Μιλάμε όμως για μία μόνο γλώσσα. Έγινε σαφές ότι θα έπρεπε να χρησιμοποιήσουμε το διαδικτυακό API. Αργότερα αποδείχθηκε ότι οι υπηρεσίες αναγνώρισης ομιλίας τέτοιων κολοσσών όπως η Google, η Yandex και η Microsoft δεν είναι καθόλου δωρεάν και θα πρέπει να αρκεστούμε σε μια δοκιμαστική περίοδο. Ως αποτέλεσμα, επιλέχθηκε το Google Speech-to-Text επειδή σας επιτρέπει να λάβετε ένα διακριτικό για τη χρήση της υπηρεσίας, το οποίο θα διαρκέσει για έναν ολόκληρο χρόνο.

Το δεύτερο πρόβλημα που αντιμετωπίσαμε σχετίζεται με ορισμένες από τις ελλείψεις της C++ - ένας ζωολογικός κήπος με διάφορες βιβλιοθήκες απουσία κεντρικού αποθετηρίου. Συμβαίνει ότι το Telegram Desktop εξαρτάται από πολλές άλλες βιβλιοθήκες για συγκεκριμένες εκδόσεις. Το επίσημο αποθετήριο έχει εντολή για τη συναρμολόγηση του έργου. Και επίσης ένας μεγάλος αριθμός ανοιχτών θεμάτων σχετικά με προβλήματα κατασκευής, για παράδειγμα ώρα и два. Όλα τα προβλήματα αποδείχτηκαν ότι σχετίζονται με το γεγονός ότι το σενάριο έκδοσης γράφτηκε για το Ubuntu 14.04 και για να δημιουργηθεί με επιτυχία το τηλεγράφημα στο Ubuntu 18.04, έπρεπε να γίνουν αλλαγές.

Το ίδιο το Telegram Desktop χρειάζεται πολύ χρόνο για να συναρμολογηθεί: σε φορητό υπολογιστή με Intel Core i5-7200U, η πλήρης συναρμολόγηση (σημαία -j 4) με όλες τις εξαρτήσεις διαρκεί περίπου τρεις ώρες. Από αυτά, περίπου 30 λεπτά λαμβάνονται με τη σύνδεση του ίδιου του πελάτη (αργότερα αποδείχθηκε ότι στη ρύθμιση παραμέτρων εντοπισμού σφαλμάτων, η σύνδεση διαρκεί περίπου 10 λεπτά), και ωστόσο το στάδιο σύνδεσης πρέπει να επαναλαμβάνεται κάθε φορά μετά την πραγματοποίηση αλλαγών.

Παρά τα προβλήματα, καταφέραμε να υλοποιήσουμε τη συλληφθείσα ιδέα, αλλά και να ενημερώσουμε δόμηση σεναρίου για το Ubuntu 18.04. Μια επίδειξη του έργου μπορείτε να δείτε στο σύνδεσμος. Περιλαμβάνουμε επίσης πολλά κινούμενα σχέδια. Ένα κουμπί έχει εμφανιστεί δίπλα σε όλα τα φωνητικά μηνύματα, που σας επιτρέπει να μεταφράσετε το μήνυμα σε κείμενο. Κάνοντας δεξί κλικ, μπορείτε επιπλέον να καθορίσετε τη γλώσσα που θα χρησιμοποιηθεί για τη μετάδοση. Με σύνδεσμος πελάτης διαθέσιμος για λήψη.

Αποθήκη.

Κατά τη γνώμη μας, αποδείχθηκε ότι ήταν μια καλή απόδειξη λειτουργικότητας που θα ήταν βολικό για πολλούς χρήστες. Ελπίζουμε να το δούμε σε μελλοντικές εκδόσεις του Telegram Desktop.

Βελτιωμένη υποστήριξη φυσικής γλώσσας στο IntelliJ IDEA

Hackathon DevDays'19 (μέρος 2): αναλυτής ηχητικών μηνυμάτων για έλεγχο Telegram και γραμματικής στο IntelliJ IDEA

Ο συγγραφέας της ιδέας

Tankov Vladislav

Δομή εντολών

Tankov Vladislav (επικεφαλής της ομάδας, σε συνεργασία με το LanguageTool και το IntelliJ IDEA)
Nikita Sokolov (εργάζεται με το LanguageTool και δημιουργεί UI)
Khvorov Alexander (εργάζεται με το LanguageTool και βελτιστοποιεί την απόδοση)
Sadovnikov Alexander (υποστήριξη για ανάλυση γλωσσών σήμανσης και κώδικα)

Έχουμε αναπτύξει ένα πρόσθετο για το IntelliJ IDEA που ελέγχει διάφορα κείμενα (σχόλια και τεκμηρίωση, κυριολεκτικές γραμμές στον κώδικα, κείμενο μορφοποιημένο σε Markdown ή σήμα XML) για γραμματική, ορθογραφία και στυλιστική ακρίβεια (στα αγγλικά αυτό ονομάζεται διόρθωση).

Η ιδέα του έργου ήταν να επεκταθεί ο τυπικός ορθογραφικός έλεγχος IntelliJ IDEA στην κλίμακα του Grammarly, για να γίνει ένα είδος Grammarly μέσα στο IDE.

Μπορείτε να δείτε τι συνέβη по ссылке.

Λοιπόν, παρακάτω θα μιλήσουμε πιο αναλυτικά για τις δυνατότητες του plugin, καθώς και για τις δυσκολίες που προέκυψαν κατά τη δημιουργία του.

Κίνητρο

Υπάρχουν πολλά προϊόντα που έχουν σχεδιαστεί για τη σύνταξη κειμένου σε φυσικές γλώσσες, αλλά η τεκμηρίωση και τα σχόλια κώδικα γράφονται συνήθως σε περιβάλλοντα ανάπτυξης. Ταυτόχρονα, τα IDE κάνουν εξαιρετική δουλειά στην εύρεση σφαλμάτων στον κώδικα, αλλά δεν είναι κατάλληλα για κείμενα σε φυσικές γλώσσες. Αυτό καθιστά πολύ εύκολο να κάνετε λάθη στη γραμματική, τη στίξη ή το στυλ χωρίς το περιβάλλον ανάπτυξης να τα επισημαίνει. Είναι πολύ σημαντικό να κάνετε ένα λάθος κατά τη σύνταξη της διεπαφής χρήστη, καθώς αυτό θα επηρεάσει όχι μόνο την κατανόηση του κώδικα, αλλά και τους ίδιους τους χρήστες της αναπτυγμένης εφαρμογής.

Ένα από τα πιο δημοφιλή και ανεπτυγμένα περιβάλλοντα ανάπτυξης είναι το IntelliJ IDEA, καθώς και τα IDE που βασίζονται στην πλατφόρμα IntelliJ. Η πλατφόρμα IntelliJ έχει ήδη ενσωματωμένο ορθογραφικό έλεγχο, αλλά δεν απαλλάσσεται ούτε από τα πιο απλά γραμματικά λάθη. Αποφασίσαμε να ενσωματώσουμε ένα από τα δημοφιλή συστήματα ανάλυσης φυσικής γλώσσας στο IntelliJ IDEA.

Реализация

Hackathon DevDays'19 (μέρος 2): αναλυτής ηχητικών μηνυμάτων για έλεγχο Telegram και γραμματικής στο IntelliJ IDEAΔεν βάλαμε στον εαυτό μας καθήκον να δημιουργήσουμε το δικό μας σύστημα επαλήθευσης κειμένου, επομένως χρησιμοποιήσαμε μια υπάρχουσα λύση. Η πιο κατάλληλη επιλογή αποδείχθηκε Εργαλείο γλώσσας. Η άδεια μας επέτρεψε να τη χρησιμοποιήσουμε ελεύθερα για τους σκοπούς μας: είναι δωρεάν, γραμμένο σε Java και ανοιχτού κώδικα. Επιπλέον, υποστηρίζει 25 γλώσσες και βρίσκεται σε ανάπτυξη για περισσότερα από δεκαπέντε χρόνια. Παρά το ανοιχτό του, το LanguageTool είναι σοβαρός ανταγωνιστής των λύσεων επαλήθευσης κειμένου επί πληρωμή και το γεγονός ότι μπορεί να λειτουργήσει τοπικά είναι κυριολεκτικά το δολοφονικό χαρακτηριστικό του.

Ο κωδικός προσθήκης είναι μέσα αποθετήρια στο GitHub. Ολόκληρο το έργο γράφτηκε στο Kotlin με μια μικρή προσθήκη Java για το UI. Κατά τη διάρκεια του hackathon, καταφέραμε να υλοποιήσουμε υποστήριξη για Markdown, JavaDoc, HTML και Απλό κείμενο. Μετά το hackathon, μια σημαντική ενημέρωση πρόσθεσε υποστήριξη για XML, γραμματοσειρές σε Java, Kotlin και Python και ορθογραφικό έλεγχο.

Δυσκολίες

Πολύ γρήγορα καταλάβαμε ότι αν τροφοδοτούμε όλο το κείμενο στο LanguageTool για έλεγχο κάθε φορά, τότε η διεπαφή IDEA θα παγώσει σε οποιοδήποτε περισσότερο ή λιγότερο σοβαρό κείμενο, καθώς η ίδια η επιθεώρηση μπλοκάρει τη ροή διεπαφής χρήστη. Το πρόβλημα επιλύθηκε μέσω του ελέγχου "ProgressManager.checkCancelled" - αυτή η συνάρτηση δημιουργεί μια εξαίρεση εάν το IDEA πιστεύει ότι είναι ώρα να ακυρωθεί η επιθεώρηση.

Αυτό εξαλείφει εντελώς τα παγώματα, αλλά είναι αδύνατο να χρησιμοποιηθεί: η επεξεργασία του κειμένου χρειάζεται πολύ χρόνο. Επιπλέον, στην περίπτωσή μας, τις περισσότερες φορές αλλάζει ένα πολύ μικρό μέρος του κειμένου και θέλουμε να αποθηκεύσουμε τα αποτελέσματα με κάποιο τρόπο. Αυτό ακριβώς κάναμε. Για να μην τα ελέγχουμε όλα κάθε φορά, χωρίσαμε ντετερμινιστικά το κείμενο σε κομμάτια και ελέγξαμε μόνο αυτά που είχαν αλλάξει. Επειδή τα κείμενα μπορεί να είναι μεγάλα και δεν θέλαμε να φορτώσουμε την κρυφή μνήμη, δεν αποθηκεύσαμε τα ίδια τα κείμενα, αλλά τα κατακερματισμένα τους. Αυτό επέτρεψε στην προσθήκη να λειτουργεί ομαλά ακόμη και σε μεγάλα αρχεία.

Το LanguageTool υποστηρίζει περισσότερες από 25 γλώσσες, αλλά είναι απίθανο κάποιος χρήστης να τις χρειάζεται όλες. Ήθελα να δώσω την ευκαιρία να κατεβάσω βιβλιοθήκες για μια συγκεκριμένη γλώσσα κατόπιν αιτήματος (αν το σημειώσετε στο UI). Το εφαρμόσαμε ακόμη και αυτό, αλλά αποδείχθηκε πολύ περίπλοκο και αναξιόπιστο. Συγκεκριμένα, έπρεπε να φορτώσουμε το LanguageTool με ένα νέο σύνολο γλωσσών χρησιμοποιώντας έναν ξεχωριστό classloader και, στη συνέχεια, να το αρχικοποιήσουμε προσεκτικά. Ταυτόχρονα, όλες οι βιβλιοθήκες βρίσκονταν σε ένα αποθετήριο χρήστη .m2 και σε κάθε εκκίνηση έπρεπε να ελέγχουμε την ακεραιότητά τους. Στο τέλος, αποφασίσαμε ότι εάν οι χρήστες είχαν προβλήματα με το μέγεθος της προσθήκης, τότε θα παρέχουμε μια ξεχωριστή προσθήκη για πολλές από τις πιο δημοφιλείς γλώσσες.

Μετά το hackathon

Το hackathon τελείωσε, αλλά η εργασία για την προσθήκη συνεχίστηκε με μια πιο στενή ομάδα. Ήθελα να υποστηρίξω συμβολοσειρές, σχόλια, ακόμη και κατασκευές γλώσσας όπως ονόματα μεταβλητών και κλάσεων. Προς το παρόν υποστηρίζεται μόνο για Java, Kotlin και Python, αλλά ελπίζουμε ότι αυτή η λίστα θα μεγαλώσει. Διορθώσαμε πολλά μικρά σφάλματα και γίναμε πιο συμβατοί με τον ενσωματωμένο ορθογραφικό έλεγχο της Idea. Επιπλέον, εμφανίστηκε η υποστήριξη XML και ο ορθογραφικός έλεγχος. Όλα αυτά βρίσκονται στη δεύτερη έκδοση, που δημοσιεύσαμε πρόσφατα.

Ποιο είναι το επόμενο;

Ένα τέτοιο πρόσθετο μπορεί να είναι χρήσιμο όχι μόνο για προγραμματιστές, αλλά και για τεχνικούς συγγραφείς (που συχνά εργάζονται, για παράδειγμα, με XML σε ένα IDE). Κάθε μέρα πρέπει να εργάζονται με φυσική γλώσσα, χωρίς να έχουν βοηθό με τη μορφή συμβουλών του συντάκτη για πιθανά λάθη. Το πρόσθετο μας παρέχει τέτοιες συμβουλές και το κάνει με υψηλό βαθμό ακρίβειας.
Σκοπεύουμε να αναπτύξουμε το πρόσθετο, τόσο με την προσθήκη νέων γλωσσών όσο και με τη διερεύνηση μιας γενικής προσέγγισης για την οργάνωση του ελέγχου κειμένου. Τα άμεσα σχέδιά μας περιλαμβάνουν την εφαρμογή στιλιστικών προφίλ (σύνολα κανόνων που ορίζουν έναν οδηγό στυλ για κείμενο, για παράδειγμα, «μην γράφετε π.χ., αλλά γράφετε την πλήρη φόρμα»), επέκταση του λεξικού και βελτίωση της διεπαφής χρήστη (ιδίως θέλουμε να δώσουμε στον χρήστη την ευκαιρία όχι απλώς να αγνοήσει μια λέξη, αλλά να την προσθέσει στο λεξικό, υποδεικνύοντας το μέρος της ομιλίας).

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο