Język (nie do końca) rozpoznawalny

praca magisterskaW ponie­dzia­łek, 15 wrze­śnia 2008 roku, zakoń­czy­łem ofi­cjal­nie pisa­nie pra­cy magi­ster­skiej i zło­ży­łem ją w dzie­ka­na­cie. Jako, że nie wszy­scy wie­dzą o czym pisa­łem, posta­ram się przed­sta­wić krót­ko całą histo­rię.

Gdy pół­to­ra roku temu zaczą­łem się zasta­na­wiać na poważ­nie nad tema­tem pra­cy, mia­łem kil­ka spre­cy­zo­wa­nych punk­tów, według któ­rych chcia­łem sobie dobrać temat. Moją spe­cjal­no­ścią jest inży­nie­ria opro­gra­mo­wa­nia, ale w tej dzie­dzi­nie dowol­ny temat pra­cy wyda­wał mi się mało inte­re­su­ją­cy. Posta­no­wi­łem pra­cę pisać w innym insty­tu­cie, a mia­no­wi­cie w Insty­tu­cie Sztucz­nej Inte­li­gen­cji i Metod Mate­ma­tycz­nych. Mia­łem nawet kon­kret­nie wybra­ne­go pro­mo­to­ra, u któ­re­go chcia­łem pisać. Pod­sze­dłem do wybo­ru tema­tu dość ambit­nie. Wybór cze­goś łatwe­go i odtwór­cze­go mnie zupeł­nie nie prze­ko­ny­wał. W koń­cu ma to być moja pierw­sza publi­ka­cja nauko­wa z praw­dzi­we­go zda­rze­nia. Dla­cze­go więc nie połą­czyć kil­ku dzie­dzin, któ­re mnie inte­re­su­ją? Z racji wybra­nej spe­cjal­no­ści, głów­nym zada­niem w pra­cy mia­ło być stwo­rze­nie pro­gra­mu. Chcia­łem napi­sać pro­gram, dzię­ki któ­re­mu prze­pro­wa­dził­bym bada­nia, któ­rych wyni­ki mogą się real­nie przy­dać, a jed­no­cze­śnie sam pro­gram mógł być roz­wo­jo­wy. Wyko­rzy­sty­wał­by sie­ci neu­ro­no­we do kla­sy­fi­ka­cji cze­goś zwią­za­ne­go z dźwię­kiem. Na począt­ku myśla­łem o roz­po­zna­wa­niu sty­lu muzycz­ne­go bada­ne­go utwo­ru. Jed­nak kla­sy­fi­ka­cja gatun­ków muzycz­nych jest na tyle trud­na dla czło­wie­ka, że kom­pu­ter tym bar­dziej nie będzie w sta­nie sobie z tym pora­dzić. Popro­si­łem więc pro­mo­to­ra o pomoc w wymy­śle­niu tema­tu w sam raz dla mnie. I pro­mo­tor wymy­ślił:

„Zasto­so­wa­nie sztucz­nych sie­ci neu­ro­no­wych do roz­po­zna­wa­nia języ­ka mówią­cej oso­by”

Temat spodo­bał mi się od same­go począt­ku. Wow! Zaj­mę się roz­po­zna­wa­niem języ­ków :-). Oprócz dzie­dzin zwią­za­nych z dźwię­kiem, sztucz­ną inte­li­gen­cją i pro­gra­mo­wa­niem, mogę się zająć też bar­dzo inte­re­su­ją­cą mnie dzie­dzi­ną — języ­ko­znaw­stwem. Cho­ciaż w ogra­ni­czo­nym stop­niu. Do tema­tu nie mia­łem żad­nych zastrze­żeń, więc taki wła­śnie został ofi­cjal­nie przy­ję­ty.

Jako raso­wy pro­kra­sty­na­tor, na poważ­nie zają­łem się pra­cą dopie­ro w ostat­nim seme­strze ;-). Wcze­śniej bar­dzo powo­li gro­ma­dzi­łem lite­ra­tu­rę, na któ­rej mógł­bym się oprzeć. Jed­nak lite­ra­tu­ry takiej nie ma. Musia­łem się oprzeć na kil­ku anglo­ję­zycz­nych arty­ku­łach nauko­wych, trak­tu­ją­cych kon­kret­nie o tema­cie roz­po­zna­wa­nia języ­ka. Resz­ta lite­ra­tu­ry to publi­ka­cje o ana­li­zie i syn­te­zie dźwię­ku czy ogól­ne o samych sie­ciach neu­ro­no­wych. W dodat­ku publi­ka­cji o iden­ty­fi­ka­cji języ­ka, w języ­ku pol­skim, nie zna­la­złem żad­nych. Dobrze, że oprócz pro­mo­to­ra zna­ją­ce­go się na sie­ciach neu­ro­no­wych, mia­łem też do kogo się zwró­cić w tema­cie samej ana­li­zy dźwię­ku. Pani Ania dużo mi pomo­gła — dzię­ki niej opra­co­wa­łem naj­waż­niej­szą część pra­cy, czy­li meto­dę eks­trak­cji cech gło­su, któ­ry­mi potem mia­łem uczyć sieć neu­ro­no­wą.

Sama meto­da powsta­ła i zosta­ła prze­te­sto­wa­na w Matla­bie jesz­cze przed waka­cja­mi. Zdą­ży­łem jesz­cze tyl­ko napi­sać roz­dzia­ły teo­re­tycz­ne i prze­su­nąć ter­min odda­nia pra­cy na wrze­sień. Waka­cje upły­nę­ły mi na pisa­niu całe­go pro­gra­mu w C++ (jakieś 20% cza­su) i jego testo­wa­niu (80% cza­su, bo prze­cież nic nie może dobrze dzia­łać za pierw­szym razem ;-)). Gdy po bólach pro­gram już powstał, prze­pro­wa­dzi­łem za jego pomo­cą bada­nia. Wresz­cie mogłem spraw­dzić jak się spra­wu­je moje dziec­ko :-).

Bada­nia były prze­pro­wa­dzo­ne na prób­kach zdań w 6 języ­kach: pol­skim, angiel­skim, nie­miec­kim, wło­skim, hisz­pań­skim i rosyj­skim. Przy­go­to­wa­łem po 21 zdań w każ­dym z tych języ­ków i zaprzę­głem syn­te­za­to­ry mowy, żeby wyge­ne­ro­wa­ły mi zda­nia z popraw­ną wymo­wą. Dodat­ko­wo, przy­go­to­wa­łem prób­ki mowy żywe­go czło­wie­ka dla języ­ka pol­skie­go, angiel­skie­go i rosyj­skie­go. Zapo­wia­da­ło się cie­ka­wie… ale wyni­ki badań mnie nie­co roz­cza­ro­wa­ły. Przy ucze­niu wszyst­kich 6 języ­ków na raz, jakość roz­po­zna­wa­nia była bar­dzo niska. Od 20 do 50%. Z cze­go naj­go­rzej sieć roz­po­zna­wa­ła… język angiel­ski. Naj­le­piej za to wło­ski. Wło­ski prak­tycz­nie wygry­wał w każ­dej kon­fi­gu­ra­cji. Naj­le­piej był roz­po­zna­wal­ny (i to w pra­wie 85%) przy zesta­wie 3 języ­ków — pol­skim, wło­skim i hisz­pań­skim. Nie zdzi­wi­ło mnie to. Jeśli zna­cie melo­dię języ­ka wło­skie­go (a mój pro­gram wła­śnie ana­li­zu­je melo­dię wypo­wia­da­nych zdań), to wie­cie, że każ­de zda­nie koń­czy się sko­kiem into­na­cji od dźwię­ku wyż­sze­go do niż­sze­go. Co wię­cej -bada­nia na prób­kach żywej ludz­kiej mowy wypa­dły nie­co gorzej niż na prób­kach syn­te­tycz­nych.

Czy więc ponio­słem klę­skę? W żad­nym wypad­ku! Wycią­gną­łem wnio­ski, któ­re pozwo­lą mi na udo­sko­na­le­nie algo­ryt­mu i prze­pro­wa­dze­nie kolej­nych badań. Na pew­no nie porzu­cę tego co zaczą­łem. A świa­do­mość tego, że moja publi­ka­cja jest chy­ba jedy­ną taką w języ­ku pol­skim, moty­wu­je mnie dodat­ko­wo. W koń­cu inter­fej­sy gło­so­we za kil­ka lat sta­ną się bar­dzo popu­lar­ne, a ja two­rzę pewien waż­ny wyci­nek tego, co w tych inter­fej­sach będzie imple­men­to­wa­ne. Napi­sa­łem przy­zwo­itą pra­cę, z któ­rej jestem zado­wo­lo­ny i któ­ra roku­je na przy­szłość. Jesz­cze cze­ka mnie obro­na na począt­ku paź­dzier­ni­ka i wte­dy będę mógł ode­tchnąć :-). I z pew­no­ścią po obro­nie opi­szę bar­dziej szcze­gó­ło­wo wyni­ki badań, a tak­że opu­bli­ku­ję swo­ją pra­cę w inter­ne­cie.

Mam nadzie­ję, że Was nie zanu­dzi­łem, i że kogoś inne­go oprócz mnie też to zain­te­re­so­wa­ło. W razie cze­go — pytaj­cie w komen­ta­rzach. Chęt­nie odpo­wiem 🙂

Prawdziwi programiści

VIM naj­lep­szy! O tak! Po co nam zor­ga­ni­zo­wa­ne śro­do­wi­sko pro­gra­mi­stycz­ne „wszyst­ko-w-jed­nym”, sko­ro może­my sobie go sami stwo­rzyć z poje­dyn­czych ele­men­tów? W koń­cu pro­gra­mi­sta to nie byle jaki czło­wiek — potra­fi wszyst­ko!

gdbPo co Praw­dzi­we­mu Pro­gra­mi­ście jakieś śro­do­wi­sko IDE z wbu­do­wa­nym debug­ge­rem? Prze­cież naj­wy­god­niej­szym spo­so­bem jest skom­pi­lo­wa­nie pro­gra­mu z opcją -g i przej­ście do gdb. Tam ład­nie krok po kro­ku widzi­my jak pro­gram dzia­ła. Pisze­my komen­dy, któ­re bar­dzo łatwo zapa­mię­tać i dosta­je­my to co chce­my na ekra­nie. Co? Że poprzed­nia war­tość znik­nę­ła z ekra­nu? Prze­cież może­my sobie go prze­su­nąć! Mamy też bar­dzo wygod­ną histo­rię ostat­nio wkle­py­wa­nych stu dwu­dzie­stu pię­ciu pole­ceń, dzię­ki któ­rej może­my szyb­ko powtó­rzyć wcze­śniej wpi­sy­wa­ną komen­dę. Może­my też zoba­czyć war­tość naszej zmien­nej — wystar­czy tyl­ko wpi­sać komen­dę. Oczy­wi­ście na bie­żą­co nie może­my śle­dzić jej zmian, ale od cze­go jest histo­ria? Kil­ka strza­łek w górę i już może­my wyświe­tlić nową zawar­tość zmien­nej. Nie widzi­my więk­sze­go kon­tek­stu kodu źró­dło­we­go? Może­my prze­cież prze­łą­czyć się mię­dzy kon­so­la­mi… albo wyli­sto­wać kod w oknie debug­ge­ra. Zno­wu nie widzi­my poprzed­nich wyni­ków? Oj, żaden pro­blem — to tyl­ko 3 ekra­ny powy­żej. A jak komuś się nie podo­ba, to może sobie w histo­rii poszu­kać i jesz­cze raz wyświe­tlić to co chce. Któ­re to było pole­ce­nie w histo­rii?

vim
W dodat­ku VIM w pro­sty spo­sób pozwa­la na pisa­nie skryp­tów, któ­ry­mi moż­na np. pod­cze­pić do nie­go kom­pi­la­tor. Wystar­czy tyl­ko wkle­pać pole­ce­nie. Potem ład­nie prze­łą­cza­my się na kolej­ną kon­so­lę i odpa­la­my debug­ge­ra. To takie pro­ste i wygod­ne. A nie jakieś lamer­skie wci­ska­nie ctrl+f9 czy innych takich.

Praw­dzi­wy Pro­gra­mi­sta, jeśli cze­goś mu potrze­ba, sam to sobie napi­sze. Od pod­staw. No bo lame­rzy tego nie potra­fią i wolą sko­rzy­stać z goto­wych roz­wią­zań. A fe! Praw­dzi­wy Pro­gra­mi­sta nie czu­je się zmę­czo­ny, gdy po kil­ku dniach i nocach szu­ka­nia błę­dów w swo­im sil­ni­ku do wyświe­tla­nia scen z lamer­skie­go 3D Stu­dio, w koń­cu pro­gram je popraw­nie wyświe­tla. W tym cza­sie Zenek odpo­czy­wa na waka­cjach ze swo­ją dziew­czy­ną. A to lamer! Sko­rzy­stał z dar­mo­we­go gotow­ca! Praw­dzi­wy Pro­gra­mi­sta nigdy nie będzie sfru­stro­wa­ny, gdy następ­ne­go dnia sil­nik mu się wysy­pie. A tam! Naj­wy­żej nie prze­śpi kolej­nej nocy. W koń­cu tek­sto­wy debug­ger jest de best!

Na stu­diach uczą Praw­dzi­wie Pro­gra­mi­stycz­ne­go podej­ścia. Ansi C to pod­sta­wa. Czy­sta kon­so­la to pod­sta­wa. Mid­ni­ght Com­man­der zabro­nio­ny (prze­cież jest dla lame­rów). Ileż rado­ści daje zna­le­zie­nie jed­nej nie­do­mknię­tej klam­ry czy też nie­po­sta­wio­ne­go śred­ni­ka. Stu­dent musi znać pod­sta­wy. W koń­cu pra­co­daw­ca będzie od nie­go tych pod­staw wyma­gał. Tak jak two­rze­nia od pod­staw pięć tysię­cy trzy­sta sześć­dzie­sią­te­go szó­ste­go sil­ni­ka do wyświe­tla­nia scen z 3D Stu­dio czy też pro­gra­mu do mno­że­nia macie­rzy.

Prze­ja­skra­wiam? Tak.

Mam nadzie­ję na jakie­kol­wiek komen­ta­rze 😉