DevDays'19 Hackathon (Parte 2): analizador de mensajes de voz para Telegram y Grammar Checker en IntelliJ IDEA

Seguimos hablando de los proyectos del hackathon de primavera DevDays, en el que participaron alumnos del máster. "Desarrollo de Software / Ingeniería de Software".

Hackathon DevDays'19 (parte 2): analizador de mensajes de audio para Telegram y revisión gramatical en IntelliJ IDEA

Por cierto, nos gustaría invitar a los lectores a unirse. Grupo VK de estudiantes de maestría.. En él publicaremos las últimas novedades sobre contratación y estudio. En el grupo también se puede encontrar un vídeo de la jornada de puertas abiertas. Te recordamos: el evento se realizará el 29 de abril, detalles online.

Analizador de mensajes de voz de escritorio de Telegram

Hackathon DevDays'19 (parte 2): analizador de mensajes de audio para Telegram y revisión gramatical en IntelliJ IDEA

Idea autor
Artyom Khoroshev

Composición del equipo

Khoroshev Artem – director de proyecto/desarrollador/control de calidad
Eliseev Anton – analista de negocios/especialista en marketing
Maria Kuklina – diseñadora/desarrolladora de UI
Bakhvalov Pavel – diseñador/desarrollador/control de calidad de UI

Desde nuestro punto de vista, Telegram es un mensajero moderno y conveniente, y su versión para PC es popular y de código abierto, lo que permite modificarlo. El cliente ofrece una funcionalidad bastante rica. Además de los mensajes de texto estándar, contiene llamadas de voz, mensajes de vídeo y mensajes de voz. Y son estos últimos los que en ocasiones traen molestias a su destinatario. A menudo no es posible escuchar un mensaje de voz mientras se está frente a una computadora o computadora portátil. Puede que haya ruido ambiental, falta de auriculares o que no quieras que nadie escuche el contenido del mensaje. Estos problemas casi nunca surgen si usa Telegram en un teléfono inteligente, porque simplemente puede acercarlo a su oído, a diferencia de una computadora portátil o una PC. Intentamos resolver este problema.

El objetivo de nuestro proyecto en DevDays era agregar la capacidad de traducir mensajes de voz recibidos a texto al cliente de escritorio Telegram (en adelante, Telegram Desktop).

Todos los análogos en este momento son bots a los que puedes enviar un mensaje de audio y recibir un texto en respuesta. No estamos muy contentos con esto: reenviar un mensaje a un bot no es muy conveniente; nos gustaría tener una funcionalidad nativa. Además, cualquier bot es un tercero que actúa como intermediario entre la API de reconocimiento de voz y el usuario, y esto es, como mínimo, inseguro.

Como se señaló anteriormente, Telegram-desktop tiene dos ventajas importantes: facilidad y velocidad de operación. Y esto no es una coincidencia, porque está escrito íntegramente en C++. Y como decidimos agregar nueva funcionalidad directamente al cliente, tuvimos que desarrollarla en C++.

Hackathon DevDays'19 (parte 2): analizador de mensajes de audio para Telegram y revisión gramatical en IntelliJ IDEAHabía 4 personas en nuestro equipo. Inicialmente, dos personas buscaban una biblioteca adecuada para el reconocimiento de voz, una persona estudiaba el código fuente de Telegram-desktop y otra implementaba el proyecto de compilación. Telegram Desktop. Más tarde, todos estuvieron ocupados arreglando la interfaz de usuario y depurando.

Parecía que implementar la funcionalidad deseada no sería difícil, pero, como siempre sucede, surgieron dificultades.

La solución al problema consistió en dos subtareas independientes: elegir una herramienta de reconocimiento de voz adecuada e implementar una interfaz de usuario para nuevas funciones.

Al elegir una biblioteca para el reconocimiento de voz, inmediatamente tuvimos que abandonar todas las API fuera de línea, porque los modelos de lenguaje ocupan mucho espacio. Pero estamos hablando de un solo idioma. Quedó claro que tendríamos que utilizar la API en línea. Más tarde resultó que los servicios de reconocimiento de voz de gigantes como Google, Yandex y Microsoft no son gratuitos en absoluto y tendremos que contentarnos con un período de prueba. Como resultado, se eligió Google Speech-To-Text, ya que permite obtener un token por utilizar el servicio, que durará todo un año.

El segundo problema que encontramos está relacionado con algunas de las deficiencias de C++: un zoológico de varias bibliotecas en ausencia de un repositorio centralizado. Sucede que Telegram Desktop depende de muchas otras bibliotecas específicas de la versión. El repositorio oficial tiene instrucción para el montaje del proyecto. Y también una gran cantidad de cuestiones abiertas sobre problemas de compilación, por ejemplo tiempo и два. Todos los problemas resultaron estar relacionados con el hecho de que el script de compilación fue escrito para Ubuntu 14.04, y para compilar Telegram con éxito en Ubuntu 18.04, se tuvieron que realizar cambios.

El ensamblaje de Telegram Desktop lleva bastante tiempo: en una computadora portátil con un Intel Core i5-7200U, el ensamblaje completo (bandera -j 4) con todas las dependencias demora aproximadamente tres horas. De estos, se necesitan unos 30 minutos para vincular el propio cliente (más tarde resultó que en la configuración de depuración, la vinculación tarda unos 10 minutos), pero la etapa de vinculación debe repetirse cada vez que se realizan cambios.

A pesar de los problemas, logramos implementar la idea concebida, así como actualizar construir script para Ubuntu 18.04. Se puede ver una demostración del trabajo en enlace. También incluimos varias animaciones. Ha aparecido un botón junto a todos los mensajes de voz que le permite traducir el mensaje a texto. Al hacer clic derecho, puede especificar adicionalmente el idioma que se utilizará para la transmisión. Por enlace Cliente disponible para descargar.

Repositorio.

En nuestra opinión, resultó ser una buena prueba de concepto de funcionalidad que sería conveniente para muchos usuarios. Esperamos verlo en futuras versiones de Telegram Desktop.

Soporte mejorado de lenguaje natural en IntelliJ IDEA

Hackathon DevDays'19 (parte 2): analizador de mensajes de audio para Telegram y revisión gramatical en IntelliJ IDEA

Idea autor

Tankov Vladislav

Composición del equipo

Tankov Vladislav (líder del equipo, trabajando con LanguageTool e IntelliJ IDEA)
Nikita Sokolov (trabajando con LanguageTool y creando UI)
Khvorov Alexander (trabajando con LanguageTool y optimizando el rendimiento)
Sadovnikov Alexander (soporte para analizar códigos y lenguajes de marcado)

Hemos desarrollado un complemento para IntelliJ IDEA que verifica varios textos (comentarios y documentación, líneas literales en el código, texto formateado en Markdown o XML) para verificar la precisión gramatical, ortográfica y estilística (en inglés, esto se llama revisión).

La idea del proyecto era expandir el corrector ortográfico estándar IntelliJ IDEA a la escala de Grammarly, para hacer una especie de Grammarly dentro de IDE.

Puedes ver lo que pasó. enlace.

Bueno, a continuación hablaremos con más detalle sobre las capacidades del complemento, así como sobre las dificultades que surgieron durante su creación.

Motivación

Hay muchos productos diseñados para escribir texto en lenguajes naturales, pero la documentación y los comentarios de código se escriben con mayor frecuencia en entornos de desarrollo. Al mismo tiempo, los IDE hacen un excelente trabajo al encontrar errores en el código, pero no son adecuados para textos en lenguajes naturales. Esto hace que sea muy fácil cometer errores gramaticales, de puntuación o de estilo sin que el entorno de desarrollo los señale. Lo más importante es cometer un error al escribir la interfaz de usuario, ya que esto afectará no sólo a la comprensión del código, sino también a los propios usuarios de la aplicación desarrollada.

Uno de los entornos de desarrollo más populares y desarrollados es IntelliJ IDEA, así como los IDE basados ​​en la plataforma IntelliJ. IntelliJ Platform ya tiene un corrector ortográfico incorporado, pero no elimina ni siquiera los errores gramaticales más simples. Decidimos integrar uno de los sistemas populares de análisis de lenguaje natural en IntelliJ IDEA.

implementación

Hackathon DevDays'19 (parte 2): analizador de mensajes de audio para Telegram y revisión gramatical en IntelliJ IDEANo nos propusimos la tarea de crear nuestro propio sistema de verificación de textos, por lo que utilizamos una solución existente. La opción más adecuada resultó ser LanguageTool. La licencia nos permitió usarlo libremente para nuestros propósitos: es gratuito, está escrito en Java y es de código abierto. Además, soporta 25 idiomas y lleva más de quince años en desarrollo. A pesar de su apertura, LanguageTool es un serio competidor de las soluciones de verificación de texto pagas, y el hecho de que pueda funcionar localmente es, literalmente, su característica principal.

El código del complemento está en repositorios en GitHub. Todo el proyecto fue escrito en Kotlin con una pequeña adición de Java para la interfaz de usuario. Durante el hackathon, logramos implementar soporte para Markdown, JavaDoc, HTML y texto sin formato. Después del hackathon, una actualización importante agregó soporte para XML, cadenas literales en Java, Kotlin y Python, y revisión ortográfica.

Dificultades

Muy rápidamente nos dimos cuenta de que si enviamos todo el texto a LanguageTool para su inspección cada vez, entonces la interfaz de IDEA se congelará en cualquier texto más o menos serio, ya que la inspección en sí bloquea el flujo de la interfaz de usuario. El problema se resolvió mediante la verificación `ProgressManager.checkCancelled`: esta función genera una excepción si IDEA cree que es hora de cancelar la inspección.

Esto eliminó por completo las congelaciones, pero es imposible de usar: el texto tarda mucho en procesarse. Además, en nuestro caso, la mayoría de las veces cambia una parte muy pequeña del texto y queremos almacenar en caché los resultados de alguna manera. Eso es exactamente lo que hicimos. Para no revisar todo cada vez, dividimos el texto en partes de manera determinista y verificamos solo aquellos que habían cambiado. Como los textos pueden ser grandes y no queríamos cargar el caché, no almacenamos los textos en sí, sino sus hashes. Esto permitió que el complemento funcionara sin problemas incluso en archivos grandes.

LanguageTool admite más de 25 idiomas, pero es poco probable que un usuario los necesite todos. Quería brindar la oportunidad de descargar bibliotecas para un idioma específico previa solicitud (si lo marca en la interfaz de usuario). Incluso lo implementamos, pero resultó ser demasiado complicado y poco confiable. En particular, tuvimos que cargar LanguageTool con un nuevo conjunto de idiomas usando un cargador de clases separado y luego inicializarlo cuidadosamente. Al mismo tiempo, todas las bibliotecas estaban en un repositorio de usuario .m2, y en cada inicio teníamos que verificar su integridad. Al final, decidimos que si los usuarios tenían problemas con el tamaño del complemento, proporcionaríamos un complemento separado para varios de los idiomas más populares.

Después del hackatón

El hackathon terminó, pero el trabajo en el complemento continuó con un equipo más reducido. Quería admitir cadenas, comentarios e incluso construcciones de lenguaje como nombres de variables y clases. Actualmente, esto solo es compatible con Java, Kotlin y Python, pero esperamos que esta lista crezca. Hemos solucionado muchos errores pequeños y nos hemos vuelto más compatibles con el corrector ortográfico integrado de Idea. Además, ha aparecido soporte XML y revisión ortográfica. Todo esto se puede encontrar en la segunda versión, que publicamos recientemente.

¿Qué será lo próximo?

Un complemento de este tipo puede resultar útil no sólo para los desarrolladores, sino también para los redactores técnicos (que a menudo trabajan, por ejemplo, con XML en un IDE). Cada día tienen que trabajar con lenguaje natural, sin tener un asistente en forma de editor que les avise sobre posibles errores. Nuestro complemento proporciona dichas sugerencias y lo hace con un alto grado de precisión.
Planeamos desarrollar el complemento agregando nuevos idiomas y explorando un enfoque general para organizar la verificación de texto. Nuestros planes inmediatos incluyen la implementación de perfiles estilísticos (conjuntos de reglas que definen una guía de estilo para un texto, por ejemplo, "no escribir, por ejemplo, sino escribir la forma completa"), ampliar el diccionario y mejorar la interfaz de usuario (en particular, queremos darle al usuario la oportunidad no sólo de ignorar una palabra, sino de agregarla al diccionario, indicando la parte de la oración).

Fuente: www.habr.com

Añadir un comentario