Wir sprechen weiterhin über die Projekte des Spring Hackathons DevDays, an denen Studierende des Masterstudiengangs
"Software Engineering / Software Engineering" teilgenommen haben.

Übrigens möchten wir die Leser einladen, sich der
VK-Gruppe der Magistratur anzuschließen. Darin werden wir die neuesten Nachrichten über Rekrutierung und Studium veröffentlichen. Videos vom Tag der offenen Tür finden Sie auch in der Gruppe. Wir erinnern Sie daran: Die Veranstaltung findet am 29. April statt, Details
auf der Website .
Telegramm Desktop Voice Message Parser
Der Autor der IdeeKhoroshev Artyom
TeamzusammensetzungKhoroshev Artem - Projektmanager / Entwickler / Qualitätssicherung
Eliseev Anton - Business Analyst / Marketing-Spezialist
Kuklina Maria - UI-Designerin / Entwicklerin
Bakhvalov Pavel - UI-Designer / Entwickler / Qualitätssicherung
Aus unserer Sicht ist Telegram ein moderner und praktischer Messenger. Die PC-Version ist beliebt und Open Source, sodass sie geändert werden kann. Der Client bietet eine ziemlich umfangreiche Funktionalität. Zusätzlich zu Standard-Textnachrichten enthält es Sprachanrufe, Videonachrichten und Sprachnachrichten. Und es ist das letztere, das ihren Empfänger manchmal stört. Oft gibt es keine Möglichkeit, eine Sprachnachricht an einem Computer oder Laptop abzuhören. Umgebungsgeräusche, fehlende Kopfhörer können stören oder Sie möchten nicht, dass der Inhalt der Nachricht von irgendjemandem gehört wird. Solche Probleme treten fast nie auf, wenn Sie Telegramme auf Ihrem Smartphone verwenden, da Sie sie im Gegensatz zu einem Laptop oder PC einfach an Ihr Ohr bringen können. Wir haben versucht, dieses Problem zu lösen.
Das Ziel unseres Projekts bei DevDays war es, die Möglichkeit hinzuzufügen, empfangene Sprachnachrichten in Text im Telegram Desktop-Client (im Folgenden Telegram Desktop) zu übersetzen.
Alle Analoga im Moment sind Bots, an die Sie eine Audio-Nachricht senden und im Gegenzug einen Text erhalten können. Dies ist für uns nicht sehr praktisch: Das Weiterleiten einer Nachricht an einen Bot ist nicht sehr praktisch. Ich hätte gerne native Funktionen. Darüber hinaus ist jeder Bot ein Dritter, der als Vermittler zwischen der Spracherkennungs-API und dem Benutzer fungiert, und dies ist zumindest unsicher.
Wie bereits erwähnt, bietet Telegramm-Desktop zwei Gewichtsvorteile: Leichtigkeit und Geschwindigkeit. Und das ist kein Zufall, denn es ist komplett in C ++ geschrieben. Und da wir beschlossen haben, neue Funktionen direkt zum Client hinzuzufügen, mussten wir diese in C ++ entwickeln.

Es waren 4 Leute in unserem Team. Zunächst suchten zwei nach einer geeigneten Bibliothek für die Spracherkennung, eine Person studierte den Quellcode von Telegram-Desktop, eine andere stellte den Build des
Telegram Desktop- Projekts
bereit . Später waren alle mit UI-Korrekturen und Debugging beschäftigt.
Es schien, dass die Implementierung der beabsichtigten Funktionalität nicht schwierig sein würde, aber wie immer traten Schwierigkeiten auf.
Die Lösung des Problems bestand aus zwei unabhängigen Unteraufgaben: Auswahl der geeigneten Mittel zur Spracherkennung und Implementierung der Benutzeroberfläche für neue Funktionen.
Bei der Auswahl einer Bibliothek für die Spracherkennung mussten wir sofort alle Offline-APIs aufgeben, da Sprachmodelle viel Platz beanspruchen. Dies ist jedoch nur eine Sprache. Es wurde klar, dass Sie die Online-API verwenden müssen. Später stellte sich heraus, dass die Spracherkennungsdienste von Giganten wie Google, Yandex und Microsoft überhaupt nicht kostenlos sind und wir uns mit einer Testphase zufrieden geben müssen. Aus diesem Grund wurde Google Speech-To-Text ausgewählt, da Sie damit ein Token für die Nutzung des Dienstes erhalten können, das ein ganzes Jahr lang gültig ist.
Das zweite Problem, auf das wir gestoßen sind, hängt mit einigen der Nachteile von C ++ zusammen - dem Zoo verschiedener Bibliotheken ohne zentrales Repository. Es kam vor, dass Telegram Desktop von vielen anderen Bibliotheken bestimmter Versionen abhängt. Das offizielle Repository enthält
Anweisungen zum Erstellen des Projekts. Und auch eine große Anzahl offener Fragen zu Build-Problemen, zum Beispiel
ein- und
zweimal . Es stellte sich heraus, dass alle Probleme damit zusammenhängen, dass das Build-Skript für Ubuntu 14.04 geschrieben wurde. Um das Telegramm unter Ubuntu 18.04 erfolgreich zu erstellen, musste ich Änderungen vornehmen.
Telegram Desktop selbst wird eine Weile dauern: Auf einem Laptop mit einem Intel Core i5-7200U dauert die vollständige Montage (-j 4-Flag) mit allen Abhängigkeiten etwa drei Stunden. Von diesen dauert das Verknüpfen des Clients selbst ungefähr 30 Minuten (später stellte sich heraus, dass das Verknüpfen in der Debug-Konfiguration ungefähr 10 Minuten dauert), aber der Verknüpfungsschritt muss jedes Mal wiederholt werden, nachdem Änderungen vorgenommen wurden.
Trotz der Probleme konnten wir unsere Idee umsetzen und das
Build-Skript für Ubuntu 18.04 aktualisieren. Die Demonstration der Arbeit ist hier zu sehen. Wir wenden auch mehrere Animationen an. In der Nähe aller Sprachnachrichten wurde eine Schaltfläche angezeigt, mit der Sie die Nachricht in Text übersetzen können. Wenn Sie mit der rechten Maustaste klicken, können Sie optional die Sprache angeben, die für die Übersetzung verwendet werden soll. Der Client steht
über den Link zum Download zur Verfügung.
Repository.Unserer Meinung nach haben wir eine gute Proof of Concept-Funktionalität erhalten, die für viele Benutzer praktisch wäre. Wir hoffen, es in zukünftigen Versionen von Telegram Desktop zu sehen.
Erweiterte Unterstützung für natürliche Sprachen in IntelliJ IDEA
Der Autor der IdeePanzer Vladislav
TeamzusammensetzungTanks Vladislav (Teamleiter, arbeitet mit LanguageTool und IntelliJ IDEA)
Sokolov Nikita (mit LanguageTool arbeiten und Benutzeroberfläche erstellen)
Hvorov Alexander (mit LanguageTool arbeiten und Leistung optimieren)
Sadovnikov Alexander (Unterstützung für das Parsen von Markup-Sprachen und Code)
Wir haben ein Plugin für IntelliJ IDEA entwickelt, das verschiedene Texte (Kommentare und Dokumentation, wörtliche Zeilen im Code, in Markdown oder XML-Markup formatierter Text) auf Grammatik, Rechtschreibung und stilistische Genauigkeit überprüft (auf Englisch wird dies als Korrekturlesen bezeichnet).
Die Idee des Projekts war es, die Standard-Rechtschreibprüfung IntelliJ IDEA auf die Skala der Grammatik zu erweitern, um eine Art Grammatik innerhalb der IDE zu erstellen.
Sie können sehen, was passiert ist,
indem Sie auf den Link klicken .
Im Folgenden werden wir mehr über die Funktionen des Plugins sowie über die Schwierigkeiten sprechen, die bei seiner Erstellung aufgetreten sind.
MotivationEs gibt viele Produkte, die zum Schreiben von Texten in natürlichen Sprachen entwickelt wurden, aber Dokumentation und Kommentare zum Code werden am häufigsten in Entwicklungsumgebungen geschrieben. Gleichzeitig können IDEs Fehler beim Schreiben von Code hervorragend finden, sind jedoch für Texte in natürlichen Sprachen schlecht geeignet. Aus diesem Grund ist es sehr einfach, Fehler in Grammatik, Zeichensetzung oder Stil zu machen, und die Entwicklungsumgebung weist nicht darauf hin. Es ist äußerst wichtig, beim Schreiben der Benutzeroberfläche einen Fehler zu machen, da dies nicht nur die Verständlichkeit des Codes, sondern auch die Benutzer der entwickelten Anwendung selbst beeinträchtigt.
Eine der beliebtesten und am weitesten entwickelten Entwicklungsumgebungen ist IntelliJ IDEA sowie auf IntelliJ Platform basierende IDEs. Die IntelliJ-Plattform verfügt bereits über eine integrierte Rechtschreibprüfung, speichert jedoch nicht einmal die einfachsten Grammatikfehler. Wir haben uns entschlossen, eines der beliebten Analysesysteme für natürliche Sprachen in IntelliJ IDEA zu integrieren.
Implementierung
Wir haben uns nicht die Aufgabe gestellt, ein eigenes System zur Überprüfung von Texten zu erstellen, und haben daher die vorhandene Lösung genutzt. Die am besten geeignete Option war
LanguageTool . Die Lizenz erlaubte es uns, sie frei für unsere Zwecke zu nutzen: Sie ist kostenlos, in Java geschrieben und in Open Source angelegt. Darüber hinaus unterstützt es 25 Sprachen und entwickelt sich seit mehr als fünfzehn Jahren. Trotz seiner Offenheit ist LanguageTool ein ernstzunehmender Konkurrent zu bezahlten Textüberprüfungslösungen, und die Tatsache, dass es lokal arbeiten kann, ist buchstäblich das Killer-Feature.
Der Plugin-Code befindet sich im
Repository von GitHub . Das gesamte Projekt wurde in Kotlin mit einem kleinen Zusatz von Java für die Benutzeroberfläche geschrieben. Während des Hackathons gelang es, Unterstützung für Markdown, JavaDoc, HTML und Plain Text zu implementieren. Nach dem Hackathon fügte ein großes Update Unterstützung für XML, String-Literale in Java, Kotlin und Python sowie Rechtschreibprüfung hinzu.
SchwierigkeitenSehr schnell wurde uns klar, dass die IDEA-Oberfläche an mehr oder weniger seriösen Texten hängen bleibt, wenn wir jedes Mal den gesamten Text für die LanguageTool-Überprüfung eingeben, da die Inspektion selbst den UI-Stream blockiert. Das Problem wurde durch die Überprüfung von "ProgressManager.checkCancelled" gelöst. Diese Funktion löst eine Ausnahme aus, wenn IDEA der Ansicht ist, dass die Überprüfung unterbrochen werden sollte.
Dadurch wurden die Hänge vollständig beseitigt, aber es ist unmöglich, sie zu verwenden: Der Text wurde sehr lange verarbeitet. Außerdem ändert sich in unserem Fall meistens ein sehr kleiner Teil des Textes und ich möchte die Ergebnisse irgendwie zwischenspeichern. Das haben wir getan. Um nicht jedes Mal alles zu überprüfen, haben wir den Text deterministisch in Teile zerlegt und nur diejenigen überprüft, die sich geändert haben. Da die Texte groß sein können und den Cache nicht laden wollten, haben wir nicht die Texte selbst gespeichert, sondern deren Hashes. Dadurch konnte das Plug-In auch bei großen Dateien reibungslos funktionieren.
LanguageTool unterstützt mehr als 25 Sprachen, aber kaum ein Benutzer benötigt sie alle. Ich wollte die Möglichkeit geben, auf Anfrage Bibliotheken für eine bestimmte Sprache herunterzuladen (wenn dies durch ein Häkchen in der Benutzeroberfläche markiert ist). Wir haben es sogar implementiert, aber es stellte sich als zu kompliziert und unzuverlässig heraus. Insbesondere mussten wir LanguageTool mit einem neuen Satz von Sprachen als separaten Klassenladeprogramm laden und dann sorgfältig initialisieren. Gleichzeitig befanden sich alle Bibliotheken im .m2-Repository des Benutzers, und bei jedem Start mussten wir ihre Integrität überprüfen. Am Ende haben wir beschlossen, dass wir bei Problemen mit der Größe des Plugins ein separates Plugin für einige der beliebtesten Sprachen bereitstellen würden.
Nach dem HackathonDer Hackathon endete, aber die Arbeit am Plug-In wurde mit einer engeren Komposition fortgesetzt. Ich wollte Zeilen, Kommentare und sogar Sprachkonstrukte wie Variablen- und Klassennamen unterstützen. Dies wird derzeit nur für Java, Kotlin und Python unterstützt, aber wir hoffen, dass diese Liste wächst. Wir haben viele kleine Fehler behoben und sind mit der in Idea integrierten Rechtschreibprüfung kompatibler geworden. Darüber hinaus wurden XML-Unterstützung und Rechtschreibprüfung angezeigt. All dies finden Sie in der zweiten Version, die wir kürzlich veröffentlicht haben.
Was weiter?Ein solches Plugin kann nicht nur für Entwickler nützlich sein, sondern auch für technische Redakteure (die häufig beispielsweise mit XML in der IDE arbeiten). Jeden Tag müssen sie mit der natürlichen Sprache arbeiten, ohne einen Assistenten in Form von Editor-Tipps zu möglichen Fehlern zu haben. Unser Plugin liefert solche Hinweise und dies mit einem hohen Maß an Genauigkeit.
Wir planen, das Plugin sowohl durch Hinzufügen neuer Sprachen als auch durch Erkundung des allgemeinen Ansatzes zur Organisation der Textvalidierung zu entwickeln. In naher Zukunft wird die Implementierung von Stilprofilen (Regelsätze, die den Stilleitfaden für den Text definieren, z. B. „Schreiben Sie nicht zB, sondern schreiben Sie das vollständige Formular“), das Wörterbuch erweitern und die Benutzeroberfläche verbessern (insbesondere möchten wir dem Benutzer die Möglichkeit geben, das Wort nicht nur zu ignorieren, sondern hinzuzufügen ihn in das Wörterbuch, das einen Teil der Sprache anzeigt).