Pokračujeme v povídání o projektech jarního hackathonu DevDays, do kterého se zapojili studenti magisterského programu
Mimochodem, rádi bychom pozvali čtenáře, aby se přidali
Analyzátor hlasových zpráv Telegram Desktop
Autor myšlenky
Chorošev Arťom
Příkazová struktura
Khoroshev Artem – projektový manažer/vývojář/QA
Eliseev Anton – obchodní analytik/marketingový specialista
Maria Kuklina – návrhářka/vývojářka uživatelského rozhraní
Bakhvalov Pavel – UI designér/vývojář/QA
Telegram je z našeho pohledu moderní a pohodlný messenger a jeho PC verze je oblíbená a open source, což umožňuje jeho úpravu. Klient nabízí poměrně bohatou funkcionalitu. Kromě standardních textových zpráv obsahuje hlasové hovory, video zprávy a hlasové zprávy. A právě ty druhé někdy přinášejí svému příjemci nepříjemnosti. Často není možné poslouchat hlasovou zprávu u počítače nebo notebooku. Může se objevit okolní hluk, chybí sluchátka nebo nechcete, aby někdo slyšel obsah zprávy. Takové problémy téměř nikdy nevznikají, pokud používáte Telegram na smartphonu, protože jej můžete jednoduše přiložit k uchu, na rozdíl od notebooku nebo PC. Pokusili jsme se tento problém vyřešit.
Cílem našeho projektu na DevDays bylo přidat do desktopového klienta Telegram (dále jen Telegram Desktop) možnost překládat přijaté hlasové zprávy do textu.
Všechny analogy jsou v tuto chvíli roboty, kterým můžete poslat zvukovou zprávu a přijmout textovou odpověď. Nejsme s tím příliš spokojeni: přeposílání zprávy robotovi není příliš pohodlné, rádi bychom měli nativní funkcionalitu. Kromě toho je každý bot třetí stranou, která působí jako prostředník mezi rozhraním API pro rozpoznávání řeči a uživatelem, což je přinejmenším nebezpečné.
Jak bylo uvedeno dříve, telegram-desktop má dvě významné výhody: snadnost a rychlost provozu. A to není náhoda, protože je celý napsaný v C++. A jelikož jsme se rozhodli přidat novou funkcionalitu přímo klientovi, museli jsme ji vyvinout v C++.
V našem týmu byli 4 lidé. Zpočátku dva lidé hledali vhodnou knihovnu pro rozpoznávání řeči, jedna osoba studovala zdrojový kód Telegram-desktop, další nasazovala projekt sestavení
Zdálo se, že implementace zamýšlené funkce nebude obtížná, ale jako vždy se objevily potíže.
Řešení problému sestávalo ze dvou nezávislých dílčích úkolů: výběr vhodného nástroje pro rozpoznávání řeči a implementace uživatelského rozhraní pro novou funkcionalitu.
Při výběru knihovny pro rozpoznávání hlasu jsme okamžitě museli opustit všechna offline API, protože jazykové modely zabírají spoustu místa. Ale to mluvíme jen o jednom jazyce. Bylo jasné, že budeme muset použít online API. Později se ukázalo, že služby rozpoznávání řeči takových gigantů, jako jsou Google, Yandex a Microsoft, nejsou vůbec zdarma a budeme se muset spokojit se zkušební dobou. V důsledku toho byl vybrán Google Speech-To-Text, protože umožňuje získat token za používání služby, který bude trvat celý rok.
Druhý problém, na který jsme narazili, souvisí s některými nedostatky C++ – zoo různých knihoven při absenci centralizovaného úložiště. Stává se, že Telegram Desktop závisí na mnoha dalších knihovnách specifických pro verzi. Oficiální úložiště má
Samotný Telegram Desktop se sestavuje poměrně dlouho: na notebooku s Intel Core i5-7200U trvá kompletní sestavení (příznak -j 4) se všemi závislostmi zhruba tři hodiny. Z toho asi 30 minut zabere propojení samotného klienta (později se ukázalo, že v konfiguraci Debug propojení trvá asi 10 minut), ale fáze propojení se musí po provedení změn pokaždé opakovat.
I přes problémy se podařilo vymyšlený nápad zrealizovat, stejně jako aktualizaci
Podle našeho názoru se ukázalo, že jde o dobrý Proof of Concept funkčnosti, který by vyhovoval mnoha uživatelům. Doufáme, že to uvidíme v budoucích verzích Telegram Desktop.
Vylepšená podpora přirozeného jazyka v IntelliJ IDEA
Autor myšlenky
Tankov Vladislav
Příkazová struktura
Tankov Vladislav (vedoucí týmu, spolupracuje s LanguageTool a IntelliJ IDEA)
Nikita Sokolov (pracuje s LanguageTool a vytváří uživatelské rozhraní)
Khvorov Alexander (práce s LanguageTool a optimalizace výkonu)
Sadovnikov Alexander (podpora analýzy značkovacích jazyků a kódu)
Vyvinuli jsme plugin pro IntelliJ IDEA, který kontroluje různé texty (komentáře a dokumentaci, doslovné řádky v kódu, text formátovaný v Markdown nebo XML markup) na gramatickou, pravopisnou a stylistickou správnost (v angličtině se tomu říká korektura).
Myšlenkou projektu bylo rozšířit standardní kontrolu pravopisu IntelliJ IDEA na měřítko Grammarly, vytvořit jakousi Grammarly uvnitř IDE.
Můžete vidět, co se stalo
Níže budeme hovořit podrobněji o možnostech pluginu a také o obtížích, které se vyskytly při jeho vytváření.
Motivace
Existuje mnoho produktů určených pro psaní textu v přirozených jazycích, ale dokumentace a komentáře ke kódu se nejčastěji píší ve vývojových prostředích. IDE zároveň odvádějí vynikající práci při hledání chyb v kódu, ale špatně se hodí pro texty v přirozených jazycích. Díky tomu je velmi snadné dělat chyby v gramatice, interpunkci nebo stylu, aniž by na ně vývojové prostředí upozorňovalo. Nejkritičtější je udělat chybu při psaní uživatelského rozhraní, protože to ovlivní nejen srozumitelnost kódu, ale také samotné uživatele vyvíjené aplikace.
Jedním z nejpopulárnějších a nejrozvinutějších vývojových prostředí je IntelliJ IDEA, stejně jako IDE založené na platformě IntelliJ. IntelliJ Platform již má vestavěnou kontrolu pravopisu, ale nezbaví se ani těch nejjednodušších gramatických chyb. Rozhodli jsme se integrovat jeden z oblíbených systémů analýzy přirozeného jazyka do IntelliJ IDEA.
uskutečnění
Nedali jsme si za úkol vytvořit vlastní systém ověřování textu, proto jsme využili existující řešení. Jako nejvhodnější se ukázala varianta
Kód pluginu je in
Potíže
Poměrně rychle jsme si uvědomili, že pokud pokaždé vložíme veškerý text do LanguageTool ke kontrole, pak rozhraní IDEA zamrzne na jakémkoli více či méně závažném textu, protože samotná kontrola blokuje tok uživatelského rozhraní. Problém byl vyřešen pomocí kontroly `ProgressManager.checkCancelled` - tato funkce vyvolá výjimku, pokud se IDEA domnívá, že je čas přerušit kontrolu.
To zcela odstranilo zamrzání, ale nelze jej použít: zpracování textu trvá velmi dlouho. Navíc v našem případě se nejčastěji mění velmi malá část textu a výsledky chceme nějak kešovat. Přesně to jsme udělali. Abychom pokaždé nekontrolovali vše, deterministicky jsme text rozdělili na kousky a zkontrolovali pouze ty, které se změnily. Protože texty mohou být velké a nechtěli jsme načítat mezipaměť, neuložili jsme samotné texty, ale jejich hashe. To umožnilo, aby plugin fungoval hladce i na velkých souborech.
LanguageTool podporuje více než 25 jazyků, ale je nepravděpodobné, že by je některý uživatel potřeboval všechny. Chtěl jsem dát možnost stáhnout si knihovny pro konkrétní jazyk na požádání (pokud to zaškrtnete v uživatelském rozhraní). Dokonce jsme to implementovali, ale ukázalo se to jako příliš složité a nespolehlivé. Konkrétně jsme museli načíst LanguageTool s novou sadou jazyků pomocí samostatného classloaderu a poté jej pečlivě inicializovat. Všechny knihovny byly zároveň v uživatelském .m2 úložišti a při každém spuštění jsme museli kontrolovat jejich integritu. Nakonec jsme se rozhodli, že pokud budou mít uživatelé problémy s velikostí pluginu, poskytneme samostatný plugin pro několik nejoblíbenějších jazyků.
Po hackathonu
Hackathon skončil, ale práce na pluginu pokračovaly s užším týmem. Chtěl jsem podporovat řetězce, komentáře a dokonce i jazykové konstrukce, jako jsou názvy proměnných a tříd. V současné době je to podporováno pouze pro Java, Kotlin a Python, ale doufáme, že tento seznam poroste. Opravili jsme spoustu malých chyb a stali se kompatibilnějšími s vestavěnou kontrolou pravopisu Idea. Navíc se objevila podpora XML a kontrola pravopisu. To vše najdete ve druhé verzi, kterou jsme zveřejnili nedávno.
Co bude dál?
Takový plugin může být užitečný nejen pro vývojáře, ale také pro technické autory (často pracující např. s XML v IDE). Každý den musí pracovat s přirozeným jazykem, aniž by měli asistenta v podobě tipů editora na možné chyby. Náš plugin takové rady poskytuje a dělá to s vysokou mírou přesnosti.
Plánujeme vyvinout plugin, a to jak přidáním nových jazyků, tak prozkoumáním obecného přístupu k organizaci kontroly textu. Mezi naše nejbližší plány patří implementace stylistických profilů (soubory pravidel, které definují stylistickou příručku pro text, např. „nepište např., ale pište celou formu“), rozšíření slovníku a vylepšení uživatelského rozhraní (zejména, chceme dát uživateli možnost slovo nejen ignorovat, ale přidat ho do slovníku s uvedením slovního druhu).
Zdroj: www.habr.com