Google lietuvių kalbos atpažinimas rašo Nacionalinį diktantą!

lithuanian software

Šiandien išbandysime Google kalbos atpažinimo (speech to text) funkcionalumą. Google dar 2017 metai gyrėsi 95% anglų atpažinimo tikslumu, bet mane labiau domina JAV technologijų gigantės lietuvių kalbos gebėjimai.

Pirmieji bandymai užrašyti mano ištartas frazes paliko įspūdį, Google tik retkarčiais praleisdavo žodį ar įterpdavo nesąmonę. Pirmasis pastebėjimas - Google lietuvių kalbos atpažinimas yra labai jautrus kirčiavimui, pašaliniams garsams. Kilo mintis išbandyti šį funkcionalumą su profesionalaus lektoriaus garso įrašu: 2017 metų Nacionaliniu diktantu. Nusprendžiau parašyti programą, kurią būtų galima lengvai užleisti pakartotinai ir taip patikrinti funkcionalumo tobulėjimą ateityje.

Prisipažinsiu, bijau Google parašys diktantą geriau už mane :)

KTU tyrimas

2016 m. grupė KTU mokslininkų tyrė Google kalbos atpažinimo funkcionalumą. Atpažintų žodžių klaidų lygis (WER - Word Error Rate ) siekė 40%.

2016 m. problematiška frazė; atpažinta kaip
penktas tanki test
išsijunk iš trijų
sviestas speed test
lizosoma visos stoma
taikyk tai kiek
dešinėn dešimt min
padidink lady zippy
šunkelis šunų kelis
išsijunk iš jų
bjaurus į eurus
rnr prie neries
aštuntas pašto kodas

Pasiruošimas diktanto eksperimentui

Naktį pasnigo, miškas nubalo. 
Nendrės, juosiančios ežerėlį, buvo tarytum paslaptingi 
hieroglifai, kaligrafo įrėžti į tylą, neperskaitomi, 
todėl nebylūs.
...
  • Formatuoju originalų tekstą sakinius perkeliant į atskiras eilutes (galimybė surasti audio failą pagal sakinio vietą faile)

  • Karpau audio failą į sakinius ir saugoju juos į atskirus failus

  • Konfigūruoju Google Cloud: reikalingas Speech-To-Api planas ir Google Storage (nemokamas planas metams prisijungus pirmą kartą)

from google.cloud import speech
from google.cloud.speech import enums
from google.cloud.speech import types
client = speech.SpeechClient()

audio = types.RecognitionAudio(uri=gcs_uri)
config = types.RecognitionConfig(
    encoding=enums.RecognitionConfig.AudioEncoding.FLAC,
    sample_rate_hertz=44100,
    language_code='lt-LT')

Diktanto rašymas

Pirmiausiai supraskime kokia yra audio įrašo struktūra: lektorius perskaito visą tekstą, tada lėtai skaito kiekvieną sakinį kartodamas frazes, galiausiai, lektorius dar kartą perskaito visą tekstą.

Sukurta Python programėlė siunčia tiek pilnų sakinių, tiek atskirų frazių pakartojimus. Pilnus sakinius lyginu su originaliu tekstu iš VLKK ir naudoju tolimesnei analizei.

Frazių atpažinimo rezultatai reikalauja mano įsikišimo norint sujungti viską į vientisus sakinius, tad eksperimentas nebebūtų objektyvus. Įdomumo dėlei, frazių atpažinimo tikslumo įverčius išsaugoju atskirame faile (data\raw_detailed_output.md).

Rezultatai

Atpažinimo įverčiai

Orginalas: Danius nedrąsiai šyptelėjo

Atmestas: Danijos migracija išėjo
Confidence: 0.72

Pasirinktas: Darius nedrąsiai šyptelėjo
Confidence: 0.73

Sakinių lyginimas

- danius nedrąsiai šyptelėjo
?   ^
+ darius nedrąsiai šyptelėjo
?   ^

- Orginalas
+ Google

Žodžių klaidų lygis

Google kalbos atpažinimo efektyvumui suskaičiuoti pasitelkiau žodžių klaidų lygio formule (kiek žodžių pašalinta, pakeista, nereikalingai įterpta iš visų žodžių originalo tekste).

Be kartojimo

Žodžių klaidų lygis (WER): 39.55% (Įterpta: 40 Pašalinta: 5 Pakeista: 95 Originalas: 354 )

Sakinio pakartojimas (naudojant skirtingus įrašus)

Žodžių klaidų lygis (WER): 36.44% (Įterpta: 19 Pašalinta: 14 Pakeista: 96 Originalas: 354 )

Įdomios frazės

“paslaptingi hieroglifai, kaligrafo įrėžti” -> “paslaptingi vyro klipai pririšti” “išgirdo švelnius vos juntamus” -> “švelnius losjonus”

Tobulinimas

1. Frazių kartojimas

Analizuojant atskirų frazių pasitikėjimo koeficjentus, matosi kad ištraukos yra kartais užrašomos tiksliau už sakinius. Tačiau jų logiškas sujungimas į vientisą sakinį jau reikalautų mano įsikišimo.

Orginalas: Rodėsi keista, kad neįmanoma pasakyti, 
           koks gi dabar paros metas

Pasirinktas: rūdys ir keista kad neįmanoma 
             pasakyti koks gi dabar paros metas

rūdys ir keista
0.8809462785720825
rodėsi keista
0.9402069449424744

Verčiant visą sakinį Google išgirdo “rūdys ir keista kad …”. Bet jau verčiant trumpas frazes, “rodėsi keista” buvo aptiktas su aukštu pasitikėjimo koeficjentu.

2. Nepasitikintis Google

Retkarčiais, Google pasirinko prastesnį vertimą (mano manymu):

Orginalas: Tėti, jeigu tas paveikslas tave gąsdina, 
           aš jį nukabinsiu

Pasirinktas: tai jeigu tas paveikslas Tele2
Confidence: 0.76

Atmestas: tiltai jeigu tas paveikslas tave gąsdina 
          aš nukrisiu
Confidence: 0.75

Antras sakinys yra arčiau tiesios, bet pasitikėjimo lygis yra didesnis prie pirmojo, kurį Google ir pasirinko.

3. Didžiųjų raidžių ir skyrybos ženklų nepaisymas

Google kalbos atpažinimas turi problemų su skyrybos ženklais. Kadangi norėjau pagrindinai atkreipti dėmesį tik į žodžių atpažinimą, originaliame tekste pašalinau skyrybos ženklus o didžiąsias raides paverčiau mažosiomis.

Apibendrinimas

Lietuvių kalba nėra taip populiari kaip anglų, tad ir teksto atpažinimas veikia ženkliai prasčiau. Be abejo, Google funkcionalumas tikrai tobulės, tad bus smagu pamatyti kaip atpažinimas veiks ateityje. KTU mokslininkų išsamus Google funkcionalumo testas atliktas 2016 metais vidutiniškai pasiekė 40% žodžių klaidų lygį. Mano mėgėjiškas eksperimentas su vieno lektoriaus įrašu - 36.44%.

Nuorodos:


I'm Valdas Maksimavicius. I write about data, cloud technologies and personal development. You can find more about me here.