İAZAR: Model pentru transcrierea vocii

İAZAR: Model pentru transcrierea vocii


AI

Iazar

Proiectul dat este elaborat în cadrul competiției Tekwill Junior Ambasadors.

De ce Iazar?

yazar în limba turcă semnifică scriitor, drept IA + yazar = IAzar, inteligență artificială scriitoare.

Scopul proiectului

Deseori aplicațiile care utilizează transcrierea vocii nu înțeleg anumite graiuri. Aceasta poate fi deranjant mai ales la transcrierea mesajelor vocale, unde vorbitorii tind să vorbească în graiul matern.

Scopul nostru este să antrenăm un model de transcrierea vocii în text, să transcrie graiul matern Moldovenesc.

training coqui

Alte utilizări

Un astfel de model are mai multe utilități.

Mesajele Vocale

Textul transcris din mesajele vocale poate fi copiat, tradus. Textul fiind în genere mai ușor de utilizat, și mai comod de-l citit. Ăsta v-a fi scopul în jurul căruia vom lucra.

Subtitrări:

Textul transcris dintr-un video poate fi folosit pentru subtitrări.

Jurnalistică:

Jurnaliștii pot să folosească textul transcris din întrevederile lor în articole, care eventual poate fi traduse și în alte limbi. De asemenea textul transcris poate fi folosit pentru subtitrarea întrevederilor.

Persoanele cu dizabilități

Modelul poate fi extins pentru a ajuta persoanele cu dizabilități.

Datele

Date pentru antrenarea în limba română a unui model de transcrierea vocii sunt oferite de către Mozilla

mozila

Explorarea

În set de date găsim:


 cv-corpus-15.0-2023-09-08
├──  clips
│  ├──  common_voice_ro_38436395.mp3
│  ...
├──  clip_durations.tsv
├──  dev.tsv
├──  invalidated.tsv
├──  other.tsv
├──  reported.tsv
├──  test.tsv
├──  times.txt
├──  train.tsv
└──  validated.tsv

Toate fișierele (cu excepția: reported.tsv, clip_durations.tsv) conțin cîte o coloană cu identificatoare, calea spre audio, transcripția, numărul de aprecieri de la validare, vîrsta, genul, și altele mai puțin importante.

Fișierul validated.tsv conține descrieri despre toate audiourile validate de voluntarii de la common voice, fiind apreciate relativ înalt. Fișierul invalidated.tsv conține descrieri despre audiouri cu aprecieri negative din partea voluntarilor.

Fișierul train.tsv este folosit pentru antrenarea modelului, fișierul dev.tsv este folosit pentru validarea modelului, și fișierul test.tsv este folosit pentru testarea modelului.

Fișierul other.tsv conține descrieri despre audiouri de rezervă.

Fișierele times.txt și clip_durations.tsv descriu durata audiourilor.

În fișierul reported.tsv sunt lista de date care au anumite erori, aceste fu raportate de către voluntari. Erorile puteau fi utilizarea alfabetelor străine, greșeli de lexic sau pronunție, date pentru limbă străină, etc.

În mapa ./clips/ se află audiourile.

Prelucrarea

Pentru simplitate noi am eliminat toate datele cu erori descrise în reported.tsv.

Am utilizat utilitățile GNU pentru a șterge toate datele defectate.

for i in $(awk -F '\t' '{print $1}' reported.tsv | sed '1d' )
    for audio_name in $(grep $i *tsv | awk -F'\t' '{print $2}')
        if test -f "./clips/$audio_name"
            rm "./clips/$audio_name"
        end
        sed -i "/$audio_name/d" *.tsv
    end
end
  • Prima buclă for parcurge fiecare valoare din prima coloană a fișierului reported.tsv utilizînd comanda awk (se utilizează comanda sed pentru a exclude prima linie). Aceasta fiind textele datelor cu erori.

  • În interiorul primei bucle for, se deschide o altă buclă for care parcurge fiecare linie $i, ce conține textul defectat, găsită cu ajutorul comenzii grep din toate fișierele cu extensia tsv și cu ajutorul comenzii awk se extrage coloana a 2-a, adică denumirea fișierului audio.

  • În interiorul celei de a doua bucle, se verifică dacă există fișierul în mapa ./clips/ cu numele specificat de variabila $audio_name (denumirea fișierului audio). Dacă există, fișierul respectiv este șters folosind comanda rm.

  • După ștergerea fișierului, se utilizează comanda sed pentru a elimina toate liniile care conțin valoarea $audio_name (adică numele fișierului audio defectat) din toate fișierele cu extensia tsv.

Coqui

coqui

Pentru a-mi atinge scopurile ințial am ales modelul Coqui Speech To Text.

Avantaje

  • Este un model foarte bine documentat, dotat cu explicații bune și exemple.

  • Are drept logo o broscuță drăguță coqui

  • Poate transforma datele de la common voice în formatul pe care-l necesită.


$ bin/import_cv2.py --filter_alphabet calea/căstre/un/alphabet.txt /calea/către/archivul/common-voice/extras

Aceasta v-a crea cîte un wav fișier din fiecare fișier mp3, și cîte un csv fișier. Fișierele csv vor conține:

 `wav_filename` - calea către fișierul audio.
 `wav_filesize` - mărimea fișierilor în biți, folosită pentru sortare.
 `transcript` - transcripția la audio.

Dezavantaje

  • Din păcate proiectul nu mai este menținut de dezvoltatori
  • Din cauza că proiectul a fost abandonat de dezvoltatori, el necesită dependențe învechite. Din cauza aceasta pot apărea probleme cu setarea modelului

Antrenarea modelului

docker

Pentru antrenarea modelului am folosit Docker după sfatul a dezvoltatorilor coqui. Docker este o aplicație folosită pentru a simplifica crearea aplicațiilor, implementarea lor și rularea lor folosind containere. Care permite dezvoltatorului să împacheteze aplicația împreună cu toate componentele necesare. Aceasta garantează ca aplicația să poată lucra pe orice sistem nu numai pe a dezvoltatorului.

docker meme

După ce am setat docker, am instalat modelul cu ajutorul comenzii:


$ docker pull ghcr.io/coqui-ai/stt-train:latest

Această comandă descarcă cîțiva Gb de date. Descărcarea fiind destul de înceată.

Pentru accesarea containerului am utilizat comanda:


$ docker run -it  -v ./cv-corpus-15.0-2023-09-08/ro:/cv-data/ ghcr.io/coqui-ai/stt-train:latest

./cv-corpus-15.0-2023-09-08/ro/ fiind fișierul cu date de la common voice, /cv-data/ este denumire cu care vom putea accesa fișierul de la common voice din container.

Antrenăm inteligența cu următoarea comandă:



$ python -m coqui_stt_training.train\
            --train_files /cv-data/clips/train.csv\
            --dev_files /cv-data/clips/dev.csv\
            --test_files /cv-data/clips/test.csv\
            --checkpoint_dir /cv-data/checkpoints_new\
            --dropout_rate 0.3\
            --scorer /cv-data/scorer/kenlm-romanian.scorer


Pași și epoci

În antrenament, un pas este o actualizare a gradientului; adică o încercare de a găsi cea mai mică sau minimă pierdere. Cantitatea de procesare efectuată într-un singur pas depinde de dimensiunea lotului. În mod implicit, train.py are o dimensiune de lot de 1. Adică, procesează un fișier audio în fiecare pas.

O epocă este un ciclu complet prin datele de antrenament. Adică, dacă aveți 1000 de fișiere listate în fișierul train.tsv, atunci vă veți aștepta să procesați 1000 de pași pe epocă (presupunând o dimensiune a lotului de 1)

Documentația coqui

Putem deci simplu afla lungimea unei epoci, enumerînd cu ajutorul comenzii wc numărul de linii conținute de fișierul de antrenare train.tsv (excluzînd prima linie).


$ wc train.tsv -l
5173 train.tsv 

În cazul nostru, folosind diminsiunea loturilor implicită, o epocă v-a avea 5172 de pași.

Experiența

Pe calculator 8Gb RAM, Procesor AMD Rayzen 7 3700u

Experiența … dureroasă

În decurs de aproape o săptămînă, modelul n-a reușit să efectueze nici o epocă

Pe calculator cu 15Gb RAM, procesor AMD Rayzen 5 5000

Rapid de încet

Școala mi-a oferit un calculator pentru antrenarea Inteligenței Artificiale. De acum modelul efectua o epocă în decurs de ~2,5 zile. Este un progres considerabil comparativ cu mediul anterior. Dar oricum este puțin. Conform documentației modelul are nevoie de ~75 de epoci deci reiese ~187.5 zile pentru antrenarea completă a modelului…

wait

Pe calculator 8Gb RAM, procesor Intel i5 10400F, procesor grafic Nvidia 1650

*** Nu antrenați utilizînd numai procesorul. ***

Acest manual presupune că veți folosi GPU-uri NVIDIA. Antrenarea unui model de recunoaștere a vorbirii 🐸STT numai pe CPU va dura foarte, foarte, foarte mult timp. Nu antrenați cu procesorul.

Documentația coqui

confused kid

Acum suntem convinși faptul că pentru antrenarea modelului pe un calculator lipsit de cartelă NVIDIA îmi va lua foarte mult timp. nvidia meme

Avînd din păcate numai 4 rinichi la dispoziție nu suntem în stare să cumpărăm Nvidia. Din bucurie a fost găsit un voluntar care ne permise să utilizăm computătorul său cu o placă grafică NVIDIA, astfel prevenind sacrificiul de rinichi pentru buna cauză.

Am urmărit documentația Coqui pentru setarea mediului de antrenare. Din păcate, în pofida celor mai bune intenții ale prietenului nostru, a orelor investite în setarea mediului, n-am reușit să setăm mediul de antrenare pe Windows prin wsl(subsistema windows pentru linux).

Colab

me on colab

Cu toate că coqui oferă caiete jupyter, lipsa de support din partea dezvoltatorilor ne-a ajuns însă și aici. Problema dependențelor în cazul dat fiind cea mai evidențiată. Spre exemplu versiunea de TenserFlow necesitată de coqui nu mai era disponibilă în pypi.

Recunoaștere…

Curiozitatea și neștiința m-a făcut să ignor orice semne și orice sfaturi. Chiar coqui recomanda alternative.

A venit timpul să nu le mai ignorăm, și să încercăm norocul pentru a-mi atinge scopurile…

Whisper

openAI

Whisper este un model pentru transcrierea vocii dezvoltat de OpenAI.

Avantaje

  • Are o comunitate mare
  • Este mereu dezvoltat și actualizat

Dezavantaje

  • N-are drept logo o broscuță drăguță

Colectarea datelor

Modelul se va antrena cu ajutorul datelor în format csv, similar structurii utilizate anterior . Pentru simplitate vom utiliza serviciile oferite de HuggingFace pentru gestionarea datelor de antrenare.

treba de colectat

Am decis să colectăm date de la voluntari(colegi/prieteni). Ca să le fie mai simplu voluntarilor să doneze date am creat un strîngător de date.

Strîngătorul reprezintă un bot telegram cărui îi transmiți un mesaje vocale și transcrierea lor.

Strîngătorul

Dupa o scurtă perioadă de timp am strîns aproximativ 50 de date audio. Am considerat că este destul pentru o mică adjustare.

Datele colectate au fost plasate pe un depozit de pe HuggingFace. Din frica ca să nu fie datele colectate utilizate împotriva voluntarilor, am decis să facem depozitul privat.

Common Voice mozilla

here we go again Pentru rezultate mai bune am folosit și date de la Mozilla Common Voice. Anume datele de pe repozitoriul HuggingFace Common Voice 11_0.

Codul

despre date

Modelul a fost antrenat pe o versiune gratisă de GoogleColab. Noi am modificat caietul lui Sanchi Gandhi pentru a satisface necesitățile noastre. Cele mai notabile modificări fiind:

  • Am schimbat bazele de date.

Inițial am antrenat modelul pe bazele de date de la Common Voice, apoi am antrenate pe datele noastre.

  • Am schimbat limba, exemplul inițial fiind pentru limba Hindu.

  • Am conectat colabul la depozitul nostru HuggingFace

  • Am tradus documentația

Caietul final -> https://nbviewer.org/github/Yehoward/IAZAR/blob/master/code_de_antrenare_iazar.ipynb

Rezultate

Am testat mai multe modele pe un audio înregistrat de către Crinela.

Textul așteptat:

Mâine este paștele, toți au pregătit păscuțele pentru sfințit.

  • Primul îi modelul inițial whisper
  • Al doilea îi antrenat numai cu date de la mozilla
  • Al treilea îi antrenat numai cu datele noastre
  • Al ultimulea îi antrenat atît cu datele noastre cît și cu cele de la mozila

După cum observăm toate modelel adjustate de noi au performanță mai bună decît modelul inițial de la Whisper. Din punctul nostru de vedere, din toate modelele cea mai bună performanță a avut-o cea antrenată pe datele noaste și cele de la Common Voice.

Metode de implementare a modelului

Bot pentru telegram

Am făcut un bot telegram, care poate transcrie înregistrări vocale, fișiere audio, video pînă la 20Mb (din cauza limitărilor de la telegram).

exemplu

Botul la bază folosește librăria transformers, care permite să lucrezi mai ușor cu modele încărcate direct pe HuggingFace.

Sursa cod la robot

Membrii Echipei

Yehoward Rudenco
Copiist
Diana Josan
Conducătoare
Crinela Cernelea
Fața proiectului

Concluzie

Conclusion Locul 2
Locul 2!!!

Decernarea cîștigătorilor vedeți aici -> premierea