NOTĂ TEHNICĂ · DEEP LEARNING AUDIO

#MATLAB #CNN #Spectrograme_Audio

Clasificarea semnalelor vocale în MATLAB: CNN pe spectrograme audio

Notă tehnică despre mecanica unui pipeline de recunoaștere a cuvintelor izolate în limba română: semnal WAV, preprocesare, reprezentare timp-frecvență, CNN și evaluare prudentă.

Topologia datelor și preprocesarea

Înainte ca rețeaua CNN să poată învăța diferențe între cuvinte, semnalul audio trebuie adus într-o formă organizată, etichetată și comparabilă. Prototipul a folosit înregistrări WAV pentru cuvinte izolate în limba română: cifrele 0–10 și directive precum „stânga”, „dreapta”, „sus”, „jos”, „înainte” și „înapoi”. În total, setul a inclus 17 clase distincte, fiecare cuvânt fiind înregistrat de 15 ori.

Această topologie este importantă din două motive. În primul rând, fiecare clasă trebuie să fie identificabilă clar prin etichetă și structură de folder, astfel încât modelul să primească perechi coerente între spectrogramă și cuvântul corect. În al doilea rând, distribuția echilibrată reduce riscul ca scorurile de validare să fie influențate de clase mai bine reprezentate decât altele.

Totuși, setul de date trebuie interpretat prudent: vocea este unică, mediul este controlat, iar numărul de exemple pe clasă este redus. Prin urmare, datele sunt suficiente pentru verificarea unui pipeline academic WAV → spectrogramă → CNN, dar nu pentru concluzii generale despre robustețe în conversații reale, zgomot ambiental sau vorbitori multipli.

Date observate

Setul include 17 clase vocale: cifrele 0–10 și șase directive de orientare. Fiecare clasă are 15 înregistrări, suficient pentru un prototip echilibrat, dar redus ca volum de date.

Etichetare și foldere

Fiecare cuvânt este separat ca folder/clasă, iar fișierele WAV sunt asociate direct cu eticheta lor. Această structură simplifică încărcarea datelor și reduce ambiguitatea în training.

Preprocesare prudentă

Semnalele sunt curățate și normalizate înainte de transformarea spectrală, astfel încât diferențele de volum sau zgomot rezidual să nu domine clasificarea.

Spectrograma ca reprezentare CNN

Un semnal vocal brut este, în forma lui inițială, o secvență temporală de amplitudini. Această reprezentare arată cum variază presiunea acustică în timp, dar nu face imediat vizibile distribuțiile de frecvență care diferențiază un cuvânt de altul. Pentru un prototip bazat pe CNN, semnalul trebuie convertit într-o formă în care aceste diferențe pot fi observate local și comparate între clase.

Spectrograma rezolvă această tranziție prin transformarea semnalului într-o hartă timp-frecvență. Timpul rămâne reprezentat pe axa orizontală, frecvențele sunt distribuite pe axa verticală, iar intensitatea indică energia locală a semnalului într-un anumit moment. În această formă, cuvintele nu mai sunt doar unde acustice, ci pattern-uri vizuale formate din regiuni de energie, pauze, tranziții și concentrații spectrale.

Pentru o rețea convoluțională, această reprezentare este utilă deoarece filtrele CNN pot analiza zone locale ale spectrogramei, similar modului în care ar analiza regiuni dintr-o imagine. Diferențele dintre cuvinte precum „șase”, „șapte”, „înainte” sau „înapoi” nu sunt tratate ca sens lingvistic, ci ca forme spectrale recurente asociate unor etichete.

Prin urmare, CNN-ul nu „înțelege” cuvântul în sens semantic. El învață corelații între structura vizuală a spectrogramelor și clasele definite în setul controlat. Această alegere este potrivită pentru clasificarea cuvintelor izolate, dar trebuie interpretată prudent: o spectrogramă clară ajută modelul, însă nu compensează singură lipsa diversității vocale, zgomotul real sau dimensiunea redusă a datasetului.

Exemplu editorial de conversie a semnalului audio în spectrogramă. Forma de undă păstrează variația temporală, iar spectrograma evidențiază distribuția energiei în timp și frecvență.
Din semnal în hartă spectrală

Forma de undă arată variația amplitudinii în timp. Spectrograma adaugă stratul frecvențial, făcând vizibile zonele în care energia acustică se concentrează pe durata rostirii.

Input compatibil CNN

Reprezentarea 2D permite aplicarea filtrelor convoluționale pe regiuni locale. Modelul caută pattern-uri spectrale asociate cu fiecare clasă, nu sensul lingvistic al cuvântului.

Limită de interpretare

Spectrograma îmbunătățește forma de intrare pentru clasificare, dar rezultatul rămâne dependent de calitatea datelor, de numărul de exemple și de diversitatea vorbitorilor.

Evoluția antrenării: funcția de pierdere și acuratețea

După transformarea semnalelor în spectrograme, rețeaua CNN a fost antrenată să asocieze fiecare reprezentare timp-frecvență cu eticheta clasei corespunzătoare. În această etapă, funcția de pierdere măsoară cât de mult se abat predicțiile de la etichetele corecte, iar acuratețea de validare indică proporția exemplelor din setul de validare clasificate corect.

Analiza nu urmărește doar scorul final, ci ritmul în care modelul învață: cum evoluează acuratețea, cum scade funcția de pierdere și unde apar semnele că arhitectura nu extrage încă trăsături suficient de stabile. Prima rulare a indicat o acuratețe de validare de 13.73%, cu simptome clare de underfitting, adică situația în care modelul vede datele, dar nu învață pattern-uri suficient de stabile pentru separarea claselor vocale.

O sesiune intermediară a crescut acuratețea de validare la 32.55%, semn că ajustările au început să producă separare între clase, dar fără o concluzie solidă despre robustețe. După modificarea arhitecturii sau a configurației de training, scorul documentat a ajuns la 63.53% acuratețe de validare. Rezultatul arată o îmbunătățire reală în perimetrul setului controlat, dar nu trebuie citit ca performanță suficientă pentru recunoaștere vocală generală.

Evoluție documentată a acurateței de validare în sesiunile de antrenare. Valorile indică progres în setul controlat, nu performanță generalizată pentru recunoaștere vocală reală.
Semn de underfitting

Modelul primește intrările spectrale, dar nu extrage încă trăsături stabile pentru separarea claselor. Acuratețea scăzută indică o arhitectură sau configurare insuficient calibrată.

Progres, nu robustețe

Creșterea intermediară arată că ajustările ajută, dar scorul rămâne prea instabil pentru concluzii despre generalizare sau utilizare în condiții reale.

Validare de prototip

Rezultatul final documentează o îmbunătățire reală în setul controlat, dar trebuie citit ca validare academică, nu ca performanță de producție.

Evaluarea prin matrice de confuzie

Acuratețea de validare oferă o vedere agregată, dar nu arată unde greșește modelul. Într-un set de date cu 17 clase, un scor global poate ascunde diferențe importante: unele cuvinte pot fi separate corect, în timp ce altele pot fi confundate constant cu perechi fonetic apropiate.

Matricea de confuzie mută analiza de la scorul general la comportamentul pe clasă. Valorile de pe diagonală indică predicțiile corecte, iar valorile din afara diagonalei arată unde modelul a asociat greșit o rostire cu altă etichetă. Pentru un prototip vocal, această lectură este esențială, pentru că erorile nu sunt distribuite întotdeauna uniform.

În sesiunile documentate, matricea a arătat îmbunătățiri după ajustarea configurației CNN, dar nu a eliminat complet confuziile. Perechi precum „înainte” și „înapoi” rămân importante pentru interpretare, deoarece pot avea proximitate fonetică și forme spectrale suficient de apropiate încât modelul să le separe dificil în setul controlat.

Schemă editorială simplificată a matricei de confuzie. Diagonala indică predicțiile corecte, iar celulele din afara diagonalei indică perechi de clase care cer analiză.
Diagonală

Valorile de pe diagonală indică predicțiile corecte pentru fiecare clasă. Cu cât diagonala este mai puternică, cu atât modelul separă mai bine cuvintele respective.

În afara diagonalei

Valorile din afara diagonalei indică perechi de clase confundate. Acestea sunt mai utile pentru diagnostic decât un scor global citit izolat.

Interpretare prudentă

O matrice mai bună arată progres în setul controlat, dar nu validează automat robustețea modelului pe vorbitori multipli sau în zgomot real.

Limitele prototipului

Prototipul susține o observație tehnică limitată: pentru un set mic, echilibrat și controlat, conversia WAV → spectrogramă și clasificarea cu o rețea CNN pot produce o îmbunătățire măsurabilă după ajustări de arhitectură și training.

Nu se poate afirma că sistemul generalizează pe vorbitori multipli, zgomot ambiental, microfoane diferite sau vocabular extins. Pentru aceste concluzii ar fi necesare date mai diverse, proceduri de testare separate și o evaluare mai strictă pe scenarii neobservate.

Observații măsurate

13.73%, 32.55% și 63.53% acuratețe de validare descriu rulări documentate în perimetrul datasetului controlat.

Ce nu rezultă

Scorul final nu dovedește robustețe pentru recunoaștere vocală în lumea reală și nu validează folosirea pe voci necunoscute.

Recomandare tehnică

Un pas următor ar cere mai mulți vorbitori, augmentare controlată, set de test separat și raportare pe clase, nu doar acuratețe globală.

Fragment demonstrativ al pipeline-ului

Fragment editorial simplificat. Nu este script complet și nu substituie codul de experiment; scopul este să arate lanțul tehnic dintre folderele cu WAV, spectrogramă, CNN și matricea de confuzie.

% Fragment editorial simplificat pentru pipeline-ul audio
ads = audioDatastore("date-vocale", ...
    "IncludeSubfolders", true, ...
    "LabelSource", "foldernames");

[adsTrain, adsValidation] = splitEachLabel(ads, 0.8, "randomized");
validationLabels = adsValidation.Labels;

trainSet = transform(adsTrain, @wavToSpectrogram);
validationSet = transform(adsValidation, @wavToSpectrogram);

layers = [
    imageInputLayer([128 128 1])
    convolution2dLayer(3, 16, "Padding", "same")
    reluLayer
    maxPooling2dLayer(2, "Stride", 2)
    fullyConnectedLayer(17)
    softmaxLayer
    classificationLayer
];

options = trainingOptions("adam", ...
    "ValidationData", validationSet, ...
    "Plots", "training-progress");

trainedNet = trainNetwork(trainSet, layers, options);
predictedLabels = classify(trainedNet, validationSet);
confusionchart(validationLabels, predictedLabels);

function imageOut = wavToSpectrogram(audioIn)
    audioIn = audioIn ./ max(abs(audioIn) + eps);
    [~, ~, ~, powerMap] = spectrogram(audioIn, hamming(512), 256, 1024);
    imageOut = imresize(log10(powerMap + eps), [128 128]);
end