Magistratura proqramı tələbələrinin iştirak etdiyi yaz hakatonu DevDays layihələrindən danışmağa davam edirik.
Yeri gəlmişkən, oxucuları qoşulmağa dəvət edirik
Telegram Masaüstü Səsli Mesaj Ayrışdırıcısı
İdeya müəllifidir
Xoroşev Artyom
Düzəliş
Xoroşev Artem – layihə meneceri/developer/QA
Eliseev Anton – biznes analitiki/marketinq mütəxəssisi
Maria Kuklina – UI dizayneri/developer
Bakhvalov Pavel – UI dizayneri/developer/QA
Bizim nöqteyi-nəzərimizdən Telegram müasir və rahat messencerdir və onun PC versiyası populyar və açıq mənbədir ki, bu da onu dəyişdirməyə imkan verir. Müştəri kifayət qədər zəngin funksionallıq təklif edir. Standart mətn mesajlarına əlavə olaraq səsli zənglər, video mesajlar və səsli mesajları ehtiva edir. Və bəzən alıcıya narahatlıq gətirən sonuncudur. Kompüter və ya noutbukda olarkən səsli mesajı dinləmək çox vaxt mümkün olmur. Ətrafdakı səs-küy, qulaqlıq çatışmazlığı ola bilər və ya mesajın məzmununu heç kimin eşitməsini istəmirsiniz. Smartfonda Telegram-dan istifadə etsəniz, bu cür problemlər demək olar ki, heç vaxt yaranmır, çünki noutbuk və ya PC-dən fərqli olaraq onu sadəcə qulağınıza gətirə bilərsiniz. Biz bu problemi həll etməyə çalışdıq.
DevDays-dakı layihəmizin məqsədi qəbul edilmiş səsli mesajları Telegram masa üstü müştərisinə (bundan sonra Telegram Desktop adlandırılacaq) mətnə çevirmək qabiliyyətini əlavə etmək idi.
Hal-hazırda bütün analoqlar audio mesaj göndərə və cavab olaraq mətn ala biləcəyiniz botlardır. Biz bundan çox məmnun deyilik: mesajı bota yönləndirmək o qədər də rahat deyil, biz doğma funksionallığa sahib olmaq istərdik. Bundan əlavə, istənilən bot nitqin tanınması API ilə istifadəçi arasında vasitəçi kimi çıxış edən üçüncü tərəfdir və bu, ən azı, təhlükəlidir.
Daha əvvəl qeyd edildiyi kimi, telegram-desktopun iki əhəmiyyətli üstünlüyü var: işin asanlığı və sürəti. Və bu heç də təsadüfi deyil, çünki o, tamamilə C++ dilində yazılmışdır. Və biz birbaşa müştəriyə yeni funksionallıq əlavə etmək qərarına gəldiyimiz üçün onu C++-da inkişaf etdirməli olduq.
Komandamızda 4 nəfər var idi. Əvvəlcə iki nəfər nitqin tanınması üçün uyğun kitabxana axtarırdı, bir nəfər Telegram-desktopun mənbə kodunu öyrənir, digəri tikinti layihəsini tətbiq edirdi.
Görünürdü ki, nəzərdə tutulan funksionallığı həyata keçirmək çətin olmayacaq, lakin həmişə olduğu kimi, çətinliklər yarandı.
Problemin həlli iki müstəqil alt tapşırıqdan ibarət idi: uyğun nitqin tanınması alətinin seçilməsi və yeni funksionallıq üçün UI tətbiqi.
Səsin tanınması üçün kitabxana seçərkən dərhal bütün oflayn API-lərdən imtina etməli olduq, çünki dil modelləri çox yer tutur. Ancaq biz yalnız bir dildən danışırıq. Onlayn API-dən istifadə etməli olacağımız aydın oldu. Sonradan məlum oldu ki, Google, Yandex və Microsoft kimi nəhənglərin nitqin tanınması xidmətləri heç də pulsuz deyil və biz sınaq müddəti ilə kifayətlənməli olacağıq. Nəticədə, Google Speech-To-Text seçilmişdir, çünki o, xidmətdən istifadə üçün əlamət əldə etməyə imkan verir və bu, bütün il ərzində davam edəcək.
Qarşılaşdığımız ikinci problem C++ dilinin bəzi çatışmazlıqları ilə bağlıdır - mərkəzləşdirilmiş repozitoriyanın olmadığı şəraitdə müxtəlif kitabxanaların zooparkı. Belə olur ki, Telegram Desktop bir çox digər versiyaya aid kitabxanalardan asılıdır. Rəsmi depoda var
Telegram Desktop-un özünün yığılması kifayət qədər uzun vaxt aparır: Intel Core i5-7200U ilə noutbukda bütün asılılıqlarla tam montaj (bayraq -j 4) təxminən üç saat çəkir. Bunlardan təxminən 30 dəqiqə müştərinin özünü əlaqələndirməklə aparılır (sonradan məlum oldu ki, Debug konfiqurasiyasında əlaqə təxminən 10 dəqiqə çəkir), lakin hər dəfə dəyişiklik etdikdən sonra əlaqələndirmə mərhələsi təkrarlanmalıdır.
Problemlərə baxmayaraq, biz düşünülmüş ideyanı həyata keçirə bildik, həm də yeniləməyə nail olduq
Fikrimizcə, bir çox istifadəçi üçün rahat olacaq funksionallıq Konsepsiyasının yaxşı sübutu olduğu ortaya çıxdı. Ümid edirik ki, bunu Telegram Desktop-un gələcək buraxılışlarında görəcəyik.
IntelliJ IDEA-da Təkmilləşdirilmiş Təbii Dil Dəstəyi
İdeya müəllifidir
Tankov Vladislav
Düzəliş
Tankov Vladislav (komanda rəhbəri, LanguageTool və IntelliJ IDEA ilə işləyir)
Nikita Sokolov (LanguageTool ilə işləmək və UI yaratmaq)
Xvorov Alexander (LanguageTool ilə işləyir və performansı optimallaşdırır)
Sadovnikov Alexander (işarələmə dillərinin və kodun təhlili üçün dəstək)
Biz IntelliJ IDEA üçün müxtəlif mətnləri (şərhlər və sənədlər, koddakı hərfi xətlər, Markdown-da formatlanmış mətn və ya XML işarələməsi) qrammatik, orfoqrafik və üslub dəqiqliyi (ingilis dilində buna proofreading adlanır) üçün yoxlayan plagin hazırlamışıq.
Layihənin ideyası IntelliJ IDEA standart orfoqrafiya yoxlamasını Grammarly miqyasına qədər genişləndirmək, IDE daxilində bir növ Grammarly etmək idi.
Nə baş verdiyini görə bilərsiniz
Yaxşı, aşağıda plaqinin imkanları, həmçinin onun yaradılması zamanı yaranan çətinliklər haqqında daha ətraflı danışacağıq.
Motivasiya
Təbii dillərdə mətn yazmaq üçün nəzərdə tutulmuş bir çox məhsul var, lakin sənədlər və kod şərhləri ən çox inkişaf mühitlərində yazılır. Eyni zamanda, IDE-lər kodda səhvləri tapmaqda əla iş görür, lakin təbii dillərdə mətnlər üçün zəif uyğun gəlir. Bu, inkişaf mühiti onlara işarə etmədən qrammatika, durğu işarələri və ya üslubda səhvlər etməyi çox asanlaşdırır. İstifadəçi interfeysini yazarkən səhv etmək çox vacibdir, çünki bu, yalnız kodun başa düşülməsinə deyil, həm də hazırlanmış tətbiqin istifadəçilərinə də təsir edəcəkdir.
Ən populyar və inkişaf etmiş inkişaf mühitlərindən biri IntelliJ IDEA, həmçinin IntelliJ Platformasına əsaslanan IDE-lərdir. IntelliJ Platformasında artıq daxili orfoqrafiya yoxlayıcısı var, lakin o, hətta ən sadə qrammatik səhvlərdən də xilas olmur. Biz məşhur təbii dil analiz sistemlərindən birini IntelliJ IDEA-ya inteqrasiya etmək qərarına gəldik.
Tətbiq
Biz özümüzə öz mətn yoxlama sistemimizi yaratmaq vəzifəsini qoymadıq, ona görə də mövcud həll yolu istifadə etdik. Ən uyğun variant olduğu ortaya çıxdı
Plugin kodu içəridədir
Çətinliklər
Çox tez başa düşdük ki, hər dəfə yoxlama üçün bütün mətni LanguageTool-a ötürsək, IDEA interfeysi daha çox və ya daha az ciddi mətndə donacaq, çünki yoxlama özü UI axınını bloklayır. Problem `ProgressManager.checkCancelled` yoxlanışı vasitəsilə həll edildi - IDEA yoxlamanı dayandırmağın vaxtının gəldiyinə inanarsa, bu funksiya istisna yaradır.
Bu, donmaları tamamilə aradan qaldırdı, lakin istifadə etmək mümkün deyil: mətni emal etmək çox uzun vaxt aparır. Üstəlik, bizim vəziyyətimizdə çox vaxt mətnin çox kiçik bir hissəsi dəyişir və biz nəticələri birtəhər yaddaşda saxlamaq istəyirik. Biz məhz belə etdik. Hər dəfə hər şeyi yoxlamamaq üçün mətni qəti şəkildə parçalara ayırdıq və yalnız dəyişmişləri yoxladıq. Mətnlər böyük ola bildiyindən və önbelleği yükləmək istəmədiyimiz üçün biz mətnlərin özlərini deyil, onların hashlarını saxladıq. Bu, plaqinin hətta böyük fayllarda da rəvan işləməsinə imkan verdi.
LanguageTool 25-dən çox dili dəstəkləyir, lakin hər hansı bir istifadəçinin hamısına ehtiyac duyması ehtimalı azdır. İstəyə uyğun olaraq müəyyən bir dil üçün kitabxanaları yükləmək imkanı vermək istədim (UI-də qeyd etsəniz). Biz bunu hətta həyata keçirdik, lakin çox mürəkkəb və etibarsız olduğu ortaya çıxdı. Xüsusilə, biz LanguageTool-u ayrı bir sinif yükləyicisindən istifadə edərək yeni dillər dəsti ilə yükləməli və sonra diqqətlə işə salmalı olduq. Eyni zamanda, bütün kitabxanalar istifadəçi .m2 deposunda idi və hər başlanğıcda onların bütövlüyünü yoxlamaq məcburiyyətində qaldıq. Sonda qərara gəldik ki, əgər istifadəçilərin plaqinin ölçüsü ilə bağlı problemləri olarsa, o zaman bir neçə ən populyar dillər üçün ayrıca plagin təqdim edəcəyik.
Hackathondan sonra
Hackathon başa çatdı, lakin plagin üzərində iş daha dar bir komanda ilə davam etdi. Mən sətirləri, şərhləri və hətta dəyişən və sinif adları kimi dil konstruksiyalarını dəstəkləmək istədim. Hal-hazırda bu, yalnız Java, Kotlin və Python üçün dəstəklənir, lakin bu siyahının artacağına ümid edirik. Biz bir çox kiçik səhvləri düzəltdik və Idea-nın daxili orfoqrafiya yoxlayıcısı ilə daha uyğunlaşdıq. Bundan əlavə, XML dəstəyi və orfoqrafiya yoxlanışı ortaya çıxdı. Bütün bunları bu yaxınlarda dərc etdiyimiz ikinci versiyada tapmaq olar.
Növbəti nədir?
Belə bir plagin təkcə tərtibatçılar üçün deyil, həm də texniki yazıçılar üçün faydalı ola bilər (tez-tez, məsələn, IDE-də XML ilə işləyir). Hər gün mümkün səhvlər haqqında redaktor məsləhətləri şəklində köməkçi olmadan təbii dillə işləmək məcburiyyətindədirlər. Pluginimiz bu cür göstərişlər verir və bunu yüksək dərəcədə dəqiqliklə edir.
Biz həm yeni dillər əlavə etməklə, həm də mətn yoxlamasını təşkil etmək üçün ümumi yanaşmanı araşdıraraq plaqini inkişaf etdirməyi planlaşdırırıq. Bizim yaxın planlarımıza stilistik profillərin həyata keçirilməsi (mətn üçün üslub bələdçisini müəyyən edən qaydalar toplusu, məsələn, “yazmayın, tam formanı yazın”), lüğətin genişləndirilməsi və istifadəçi interfeysinin təkmilləşdirilməsi (xüsusilə, istifadəçiyə sadəcə bir sözü görməməzlikdən gəlmək deyil, onu nitq hissəsini göstərərək lüğətə əlavə etmək imkanı vermək istəyirik).
Mənbə: www.habr.com