Hackathon DevDays'19 (parte 2): analisador de mensagens de áudio para Telegram e verificação gramatical no IntelliJ IDEA

Continuamos falando sobre os projetos do spring hackathon DevDays, do qual participaram alunos do programa de mestrado "Desenvolvimento de Software / Engenharia de Software".

Hackathon DevDays'19 (parte 2): analisador de mensagens de áudio para Telegram e verificação gramatical no IntelliJ IDEA

A propósito, gostaríamos de convidar os leitores a participar Grupo VK de alunos de mestrado. Nele publicaremos as últimas notícias sobre recrutamento e estudo. Um vídeo do dia aberto também pode ser encontrado no grupo. Lembramos: o evento acontecerá no dia 29 de abril, detalhes on-line.

Analisador de mensagens de voz do Telegram Desktop

Hackathon DevDays'19 (parte 2): analisador de mensagens de áudio para Telegram e verificação gramatical no IntelliJ IDEA

O autor da ideia
Khoroshev Artem

Alinhar

Khoroshev Artem – gerente de projeto/desenvolvedor/QA
Eliseev Anton – analista de negócios/especialista em marketing
Maria Kuklina – designer/desenvolvedora de UI
Bakhvalov Pavel – designer/desenvolvedor/QA de UI

Do nosso ponto de vista, o Telegram é um mensageiro moderno e prático, e sua versão para PC é popular e de código aberto, o que permite modificá-lo. O cliente oferece funcionalidades bastante ricas. Além das mensagens de texto padrão, contém chamadas de voz, mensagens de vídeo e mensagens de voz. E são estes últimos que às vezes trazem transtornos ao destinatário. Muitas vezes não é possível ouvir uma mensagem de voz enquanto estiver em um computador ou laptop. Pode haver ruído ambiente, falta de fones de ouvido ou você não deseja que ninguém ouça o conteúdo da mensagem. Esses problemas quase nunca surgem se você usar o Telegram em um smartphone, porque você pode simplesmente levá-lo ao ouvido, ao contrário de um laptop ou PC. Tentamos resolver esse problema.

O objetivo do nosso projeto no DevDays era adicionar a capacidade de traduzir mensagens de voz recebidas em texto ao cliente de desktop Telegram (doravante denominado Telegram Desktop).

Todos os análogos no momento são bots para os quais você pode enviar uma mensagem de áudio e receber um texto em resposta. Não estamos muito satisfeitos com isso: encaminhar uma mensagem para um bot não é muito conveniente; gostaríamos de ter funcionalidade nativa. Além disso, qualquer bot é um terceiro que atua como intermediário entre a API de reconhecimento de fala e o usuário, e isso é, no mínimo, inseguro.

Conforme observado anteriormente, o telegram-desktop tem duas vantagens significativas: facilidade e velocidade de operação. E isso não é coincidência, porque está escrito inteiramente em C++. E como decidimos adicionar novas funcionalidades diretamente no cliente, tivemos que desenvolvê-las em C++.

Hackathon DevDays'19 (parte 2): analisador de mensagens de áudio para Telegram e verificação gramatical no IntelliJ IDEAHavia 4 pessoas em nossa equipe. Inicialmente, duas pessoas procuravam uma biblioteca adequada para reconhecimento de voz, uma pessoa estava estudando o código-fonte do Telegram-desktop, outra estava implantando o projeto de construção Área de trabalho de telegrama. Mais tarde, todos estavam ocupados consertando a IU e depurando.

Parecia que implementar a funcionalidade pretendida não seria difícil, mas, como sempre acontece, surgiram dificuldades.

A solução para o problema consistiu em duas subtarefas independentes: escolher uma ferramenta de reconhecimento de voz adequada e implementar uma UI para novas funcionalidades.

Ao escolher uma biblioteca para reconhecimento de voz, tivemos que abandonar imediatamente todas as APIs offline, pois os modelos de linguagem ocupam muito espaço. Mas estamos falando de apenas um idioma. Ficou claro que teríamos que usar a API online. Mais tarde, descobriu-se que os serviços de reconhecimento de voz de gigantes como Google, Yandex e Microsoft não são nada gratuitos e teremos que nos contentar com um período de teste. Com isso, o Google Speech-To-Text foi escolhido porque permite obter um token de utilização do serviço, que terá duração de um ano inteiro.

O segundo problema que encontramos está relacionado a algumas deficiências do C++ - um zoológico de diversas bibliotecas na ausência de um repositório centralizado. Acontece que o Telegram Desktop depende de muitas outras bibliotecas específicas de versões. O repositório oficial tem instrução para montagem do projeto. E também um grande número de questões em aberto sobre problemas de construção, por exemplo tempo и два. Todos os problemas estavam relacionados ao fato de que o script de construção foi escrito para o Ubuntu 14.04 e, para construir o telegrama com sucesso no Ubuntu 18.04, alterações tiveram que ser feitas.

O próprio Telegram Desktop leva muito tempo para ser montado: em um laptop com Intel Core i5-7200U, a montagem completa (sinalizador -j 4) com todas as dependências leva cerca de três horas. Destes, cerca de 30 minutos são necessários para vincular o próprio cliente (mais tarde descobriu-se que na configuração de depuração, a vinculação leva cerca de 10 minutos), e ainda assim o estágio de vinculação deve ser repetido todas as vezes após fazer alterações.

Apesar dos problemas, conseguimos implementar a ideia concebida, bem como atualizar construir script para Ubuntu 18.04. Uma demonstração do trabalho pode ser vista em link. Também incluímos diversas animações. Um botão apareceu ao lado de todas as mensagens de voz, permitindo traduzir a mensagem em texto. Ao clicar com o botão direito, você também pode especificar o idioma que será usado para transmissão. Por link cliente disponível para download.

Repositório.

Na nossa opinião, acabou por ser uma boa Prova de Conceito de funcionalidade que seria conveniente para muitos utilizadores. Esperamos ver isso em versões futuras do Telegram Desktop.

Suporte aprimorado a linguagem natural no IntelliJ IDEA

Hackathon DevDays'19 (parte 2): analisador de mensagens de áudio para Telegram e verificação gramatical no IntelliJ IDEA

O autor da ideia

Tankov Vladislav

Alinhar

Tankov Vladislav (líder de equipe, trabalhando com LanguageTool e IntelliJ IDEA)
Nikita Sokolov (trabalhando com LanguageTool e criando UI)
Khvorov Alexander (trabalhando com LanguageTool e otimizando desempenho)
Sadovnikov Alexander (suporte para análise de linguagens de marcação e código)

Desenvolvemos um plugin para IntelliJ IDEA que verifica vários textos (comentários e documentação, linhas literais no código, texto formatado em Markdown ou marcação XML) quanto à precisão gramatical, ortográfica e estilística (em inglês isso é chamado de revisão).

A ideia do projeto era expandir o corretor ortográfico padrão IntelliJ IDEA para a escala do Grammarly, para fazer uma espécie de Grammarly dentro do IDE.

Você pode ver o que aconteceu по ссылке.

Pois bem, a seguir falaremos com mais detalhes sobre as capacidades do plugin, bem como as dificuldades que surgiram durante a sua criação.

Motivação

Existem muitos produtos projetados para escrever textos em linguagens naturais, mas a documentação e os comentários de código são geralmente escritos em ambientes de desenvolvimento. Ao mesmo tempo, os IDEs fazem um excelente trabalho na localização de erros no código, mas são pouco adequados para textos em linguagens naturais. Isso torna muito fácil cometer erros de gramática, pontuação ou estilo sem que o ambiente de desenvolvimento os aponte. É muito importante cometer um erro ao escrever a interface do usuário, pois isso afetará não apenas a compreensão do código, mas também os próprios usuários do aplicativo desenvolvido.

Um dos ambientes de desenvolvimento mais populares e desenvolvidos é o IntelliJ IDEA, bem como IDEs baseados na plataforma IntelliJ. A plataforma IntelliJ já possui um corretor ortográfico integrado, mas não elimina nem mesmo os erros gramaticais mais simples. Decidimos integrar um dos sistemas populares de análise de linguagem natural ao IntelliJ IDEA.

Implementação

Hackathon DevDays'19 (parte 2): analisador de mensagens de áudio para Telegram e verificação gramatical no IntelliJ IDEANão nos propusemos a criar nosso próprio sistema de verificação de texto, então usamos uma solução existente. A opção mais adequada acabou sendo LanguageTool. A licença nos permitiu usá-lo livremente para nossos propósitos: é gratuito, escrito em Java e de código aberto. Além disso, suporta 25 idiomas e está em desenvolvimento há mais de quinze anos. Apesar de sua abertura, o LanguageTool é um concorrente sério das soluções pagas de verificação de texto, e o fato de poder funcionar localmente é literalmente seu recurso matador.

O código do plugin está em repositórios no GitHub. Todo o projeto foi escrito em Kotlin com uma pequena adição de Java para a UI. Durante o hackathon, conseguimos implementar suporte para Markdown, JavaDoc, HTML e Texto Simples. Após o hackathon, uma grande atualização adicionou suporte para XML, literais de string em Java, Kotlin e Python e verificação ortográfica.

Dificuldades

Rapidamente percebemos que se alimentarmos todo o texto no LanguageTool para inspeção todas as vezes, a interface do IDEA irá congelar em qualquer texto mais ou menos sério, já que a própria inspeção bloqueia o fluxo da IU. O problema foi resolvido através da verificação `ProgressManager.checkCancelled` - esta função lança uma exceção se IDEA acreditar que é hora de abortar a inspeção.

Isso eliminou completamente os congelamentos, mas é impossível de usar: o texto demora muito para ser processado. Além disso, no nosso caso, na maioria das vezes uma pequena parte do texto muda e queremos armazenar os resultados em cache de alguma forma. Foi exatamente isso que fizemos. Para não verificar tudo sempre, dividimos deterministicamente o texto em pedaços e verificamos apenas aqueles que foram alterados. Como os textos podem ser grandes e não queríamos carregar o cache, armazenamos não os textos em si, mas seus hashes. Isso permitiu que o plugin funcionasse sem problemas, mesmo em arquivos grandes.

O LanguageTool suporta mais de 25 idiomas, mas é improvável que um usuário precise de todos eles. Eu queria dar a oportunidade de baixar bibliotecas para um idioma específico mediante solicitação (se você marcar na interface do usuário). Até implementamos isso, mas acabou sendo muito complicado e pouco confiável. Em particular, tivemos que carregar o LanguageTool com um novo conjunto de idiomas usando um carregador de classe separado e, em seguida, inicializá-lo cuidadosamente. Ao mesmo tempo, todas as bibliotecas estavam em um repositório do usuário .m2, e a cada inicialização tínhamos que verificar sua integridade. No final, decidimos que se os usuários tivessem problemas com o tamanho do plugin, forneceríamos um plugin separado para várias das linguagens mais populares.

Depois do hackathon

O hackathon terminou, mas o trabalho no plugin continuou com uma equipe mais restrita. Eu queria oferecer suporte a strings, comentários e até mesmo construções de linguagem, como nomes de variáveis ​​e classes. Atualmente isso só é compatível com Java, Kotlin e Python, mas esperamos que esta lista cresça. Corrigimos vários pequenos bugs e nos tornamos mais compatíveis com o corretor ortográfico integrado do Idea. Além disso, surgiram suporte para XML e verificação ortográfica. Tudo isso você encontra na segunda versão, que publicamos recentemente.

Qual é o próximo?

Esse plug-in pode ser útil não apenas para desenvolvedores, mas também para escritores técnicos (geralmente trabalhando, por exemplo, com XML em um IDE). Todos os dias eles têm que trabalhar com linguagem natural, sem contar com um assistente em forma de editor que dá dicas sobre possíveis erros. Nosso plugin fornece essas dicas e faz isso com um alto grau de precisão.
Planejamos desenvolver o plugin adicionando novos idiomas e explorando uma abordagem geral para organizar a verificação de texto. Nossos planos imediatos incluem a implementação de perfis estilísticos (conjuntos de regras que definem um guia de estilo para texto, por exemplo, “não escreva, por exemplo, mas escreva a forma completa”), expandindo o dicionário e melhorando a interface do usuário (em particular, queremos dar ao usuário a oportunidade não apenas de ignorar uma palavra, mas de adicioná-la ao dicionário, indicando a classe gramatical).

Fonte: www.habr.com

Adicionar um comentário