Determinarea cuvintelor cheie din înregistrări [616209]
UNIVERSITATEA POLITEHNICA BUCURESTI
FACULTATEA ELECTRONICA, TELECOMUNICATII SI TEHNOLOGIA INFORMATIEI
Proiect RNSF
Determinarea cuvintelor cheie din înregistrări
Automat de bilete
Geană Sorin -Valentin
Grupa 441B
Bucure ști 2017
Cuprins
1.Introducere ………………………….. ………………………….. …………… 3
2.Rețeua MLP(Perceptron Multistrat) ………………………….. …….. 4
3. Metoda LPC ………………………….. ………………………….. ……….. 4
4.Rezultate experimentale ………………………….. ……………………… 5
5.Concluzii ………………………….. ………………………….. …………….. 9
6.Bibilografie ………………………….. ………………………….. ………… 10
1.Introducere
Inteligența artificială este din ce în ce mai folosită în aproape toate
domeniile : cercetare , industrie , divertisment, medicină. În momentul actual este
folosită de Facebook, de exemplu atunci când încarci o poză Facebook îți
sugerează care ar putea fi numele persoanei din imagine folosind un sistem
inteligent de recunoaștere facială antrenat cu rețele neuronale multistrat , sau
Google voice, la început în 2009 Google Voice folosea modele acustice GMM
(Gaussian Mixture Model) pentru recunoașterea de voce, apoi în 2012 au început
să folosească retețele de învățare profundă, care diferențiază sunetele mult mai bine
decât modele GMM. O altă aplicație de divertisment folos ită care are în spate
rețele neuronale este Snapchat -ul, acela detectează fața unei persoane și permite
diferite modificări ale imagini (schimbare fețe a 2 persoane, adaugare elemente de
amuzament).
Tema proiectului este determi narea cuvintelor în înregist rări audio , această
temă poate fi implementată în mai multe moduri , eu am ales sa folosesc rețeaua
neuronală MLP (Perceptron multistrat) pentru determinarea ponderilor, iar
trăsăturile necesare din semnal au fost extrase sub forma coeficienților liniari
predictivi, dupa o etapa de procesare a semnalului pentru a elimina partea din
semnal unde nu există mesaj util , pentru a fi folosit la intrarea în rețea.
Rețeaua are un strat ascuns cu 30 de neuroni, 3 neuroni în stratul de ieșire și
16 neuroni pentru str atul de intrare care corespund cu numărul coeficienților LPC
extrași din semnalul audio.
În rețea am implementat atât partea de propagare a erorii înainte, cât și etapa
de propagare a erorii înapoi.
Implementarea atât a Rețelei, cât și a funcției de extrag ere trăsături a fost
realizată în programul Matlab. Procesarea semnalului a fost facut ă într -o funcție ce
va fi anexată acestei lucrări.
Pentru programul propriu zis am folosit 3 denumiri de orașe : “Timișoara” ,
“Craiova” și “București” el putând fi ext ins la mai multe denumiri, dar desigur
volumul de calcul și de procesare va crește foarte mult.
2.Rețeua MLP(Perceptron Multistrat)
Rețeua MLP este o rețea neuronală artificială care realizează o relație directă
între setul de date de la intrare și un s et de date de la ieșire , prin modificarea
ponderilor fiecărui neuron participant. Rețeua MLP este formată din mai multe
straturi care formează un graf orientat , adică fiecare strat are legaturile maxim
posibile la celalalt. Exceptând nodurile de intrare fiecare neuron are asignat o
funcție de activare neliniară (sigmoidă , tangențială). MLP -ul folosește învățarea
supervizată, în sensul că trebuie să știm ce rezultat ne dorim la ieșire, iar de la
ieșire primim un feedback care intră înapoi în rețea pentru a o antrena pâna când
eroare de predicție este zero sau mai mică decât un anumit prag stabilit
apriorii.MLP este o variantă îmbunătățită a perceptronului liniar în sensul că acesta
poate face diferența între date chiar dacă acestea nu sunt separate liniar.
3. Metoda LPC
Codarea liniar predictivă este o metodă folosită în procesul de recunoaștere
vocală, deoarece elimină în totalitate redundanța dintr -un semnal audio, încercând
să prezică urmatorul punct din semnal ca o combinație liniară dintre termeni
anteriori. LPC-ul este folosit pentru reprezentarea anvelopei spectrale a unui
semnal digital de voce într -o formă comprimată, reprezentare realizată cu modelul
liniar predictiv. Acesta este unul din cei mai buni algoritmi de codare a semnalului
la calita te superioară . Acestă metodă analizeaza semnalul vocal, estimează
formanții și suprimă efectele acestora asupra semnalului, astfel în final ramânem
cu un semnal rezidual. Deorece semnalul vocal variază foarte mult în timp
procesare se face pe micro -ferest re de circa 20 -40 milisecunde , oferind astfel o
compresie sporită.
4.Rezultate experimentale
Semnalele folosite pentru extragerea coeficienților predictivi folosiți la
intrarea rețelei neuronale :
Craiova
Timișoara
București
Semnalele dupa prelucrare:
Coeficienți LPC:
Funcționarea aplicației
Stagiile prin care a trecut aplica ția sunt:
Am încărcat în program 15 înregistrări audio, 5 pentru fiecare cuvânt;
Am prelucrat înregistrările pentru a elimina zona făra semnal vocal , pe baza
semnalelor prelucrat am extras coeficienți LPC.
Antrenarea r ețelei , etapă care a constat în extragerea a 120 coeficienți LPC, și
folosirea ac estora ca intrare în rețeua MLP;
Am antrenat re țeaua apoi pentru a -mi returna un preț pentru fiecare combinație
de orașe din cele 3, 3 combinații posibile (București -Craiova,Craiova –
Timișoara, București -Timișoara), pentru acest lucru furnizam la intrare
rezultatul ieșiri din prima rețea trecut printr -o funcție de prag pentru a obține o
valoare întreaga de exemplu pentru a antrena rețeaua să îmi furnizeze prețul
biletului 32 lei pentru București Craiova, trebuia să ii dau vector de intrare
[0 1 1]
5.Concluzii
Această aplicație este un demo , dar poa te fi extinsă foarte ușor daca se
dispune de o bază audio serioasă (cateva zeci de înregistrări ale aceluiași cuvânt
(oraș în cazul de față), rostit diferit mai ascuțit, mai alert, mai lent, mai tare , mai
încet). Eu am ales să extrag coeficienții LPC deor ece acestă metodă este indicată
atunci cand avem un număr limitat de cuvinte , rostite într -o singură limbă , de un
singur vorbitor, nivel de resurse redus și foarte ușor de implementat. Inițial am vrut
să folosesc lpc -ul oferit by default de Matlab , însă rezultatele erau foarte slabe așa
că am încercat sa implementez o altă metodă de calcul a LPC ul diferită de cea
folosită în Matlab.
Pentru acest proiect a fost nevoie de cunoștiințe medii de programare,
procesare de semnal și metode de estimare.
6.Bibilografie
1.https://www.ee.columbia.edu/ ELEN E4896 MUSIC SIGNAL
PROCESSING
2. http://www.seas.ucla.edu Implementation of Linear Predictive Coding
(LPC) of Speech Jean François Frigon and Vladislav Teplitsky
3. Robert M. Gray, IEEE Signal Processing Society, Distinguished
Lecturer Program
4. http://ai.upb.ro/ Notițe de curs : Prof. Dr. Ovidiu Grigore
5. Rosenblatt, Frank. x. Principles of Neurodynamics: Perceptrons and
the Theory of Brain Mechanisms. Spartan Books, Washington DC, 1961
6. Rumelhart, David E., Geoffrey E. Hinton, and R. J. Williams.
"Learning Internal Representations by Error Propagation". David E.
Rumelhart, James L. McClelland, and the PDP research group. (editors),
Parallel distributed processing: Explorations in the micr ostructure of
cognition, Volume 1: Foundations. MIT Press, 1986.
ANEXE
function [pondere1 pondere2] = Train_Retea(tag,K,L);
X=K;
y=L;
strat_intrare_size = size(K,2);
strat_ascuns_size = 30;
num_labels = tag;
modele = size(X, 1);
fprintf( '\nInitializam parametrii retelei… \n')
pondere1 = ponderi_aleatoare(strat_intrare_size, strat_ascuns_size);
pondere2 = ponderi_aleatoare(strat_ascuns_size, num_labels);
epoch=10000;
iter=0;
fprintf( '\nAntrenam reteaua… \n')
for iter=1:epoch
eta=0.5;
for i=1:modele
dorit=zeros(num_labels,1);
%setam modelul curent
model_curent=X(i,:);
model_curent=add_bias(model_curent);
dorit(L(i))=1;
%etapa Forward
[predict,net1,net2,val _ascuns]=etapa_forward(model_curent,pondere1,pondere2);
%etapa Backward
[delta1,delta2,delta]=etapa_backward(dorit,predict,net1,net2,pondere2);
%etapa ponderi
pondere1=pondere1+eta.*delta2'*model_curent;
pondere2=ponde re2+eta.*delta1*val_ascuns;
ans = [predict dorit delta]
end
%Calulul erorii
err(iter)=0;
for i=1:modele
[predict]=etapa_forward(model_curent,pondere1,pondere2);
%Insumam erorile
err(iter)=sum(delta).^2;
end
figure(1);
plot(err)
if(err(iter)<1e -7) break; end;
end
save('Ponderi_VOCE.mat' ,'pondere1' ,'pondere2' );
disp('Antrenarea s -a incheiat cu succes' );
end
function ponderi = ponderi_aleatoare(numar_in, numar_out)
offset=0.14;
ponderi =rand(numar_out,numar_in+1)*2*offset -offset;
end
function x = add_bias(x)
x=[1 x];
end
function [ predict,net1,net2,val_ascuns ] =
etapa_forward(model_curent,pondere1,pondere2)
net1=model_curent*pondere1';
val_ascuns=sigmoida(net1);
val_ascuns=add_bias(val_ascuns);
net2=pondere2*val_ascuns';
predict=sigmoida(net2);
end
function [ delta1,delta2,delta] =
etapa_backward (dorit,predict,net1,net2,pondere2)
delta=dorit -predict;
dr1=derivata(net2);
delta1=dr1.*delta;
dr2=derivata(net1);
tr=(pondere2(:,2:31))';
delta2=dr2.*(delta1'*(pondere2(:,2:31)));
end
clc;
clear all;
load('baza_date_orase.mat' );
Fs=8000; %% 8KHz frecvența de
eșantioanare
durata=3;
nbits=8;
x6=[];
start=1;
stop=start+49;
for k=start:stop
clear y1 y2 y3;
fprintf( 'Rosteste
%s:\n',input{sample(k)}) pause();
% Creem obiectul recorder
recorder=audiorecorder(Fs,nbits,1);
% Ingregistram pentru 3 secunde
recordblocking(recorder,durata);
% Preluam sample -urile
x = getaudiodata(recorder);
x6= [x6 x];
X1(k,:)=lpcv2(x);
Y(k,:)=sample(k);
end
save('lpcdata.mat' ,'X','Y');
save('audio.mat' ,'x6');
function [X1] = lpcv2(x)
x=abs(x);
idx=0;
for i=2:length(x) -1
if (x(i+1)<x(i))&(x(i -1)<x(i))
idx=idx+1;
envel(idx)=x(i);
idx_en(idx)=i;
end
end
anvelopa_f=interp1(idx_en,envel,1:l
ength(x), 'PCHIP');
sgn_prel = x;
sgn_prel(sgn_prel < 0.03) = [];
blocklen=200; % fereastra de 25
de ms;
overlap=100; % overlap pe
jumatate din dimensiunea ferestrei
glisante;
y=sgn_prel;
plot(y) block(1,:)=y(1:200);
for i=1:20
block(i+1,:)=y(i*100:(i*1 00+blockle
n-1));
end
w=hamming(blocklen);
for i=1:10
a=xcorr((block(i,:).*w'),12);
for j=1:12
auto(j,:)=fliplr(a(j+1:j+12));
end
z=fliplr(a(1:12));
alpha=pinv(auto)*z';
lpc(:,i)=alpha;
end
X1=reshape(lpc,1,120);
End
clc;clear all;
%load('matlaSb.mat');
load('ponderi_rec_vocFN.mat' );
load('baza_date_orase1.mat' );
Fs=8000;
out=[zeros(1,size(pondere2,1))];
p2=0;
go=true;
while sum(out)~=2
clear y1 y2 y3;
display( 'Apasati Enter si
Rostiti numele orasului' );
pause();
% create the recorder
recorder=audiorecorder(Fs,8,1);
% record one second of data
recordblocking(recorder,3);
% get the samples
x = getaudiodata(recorder);
sound(x); question = menu( 'Este oke
inregistrarea?' , 'Da', 'Nu');
if question==2
break;
end
X1=lpcv2(x);
X1=add_bias(X1);
p1=etapa_forward(X1,pondere1,ponder
e2);
p1=prag(p1);
p2=p1;
if sum(p1)==0
disp('Nu am inteles ' );
else
out=out+p1';
answ=[p1 out'] ;
input(out==1)
end
end
function [prediction] =
testRetea(test);
load('ponderi_preturi.mat' );
test_inp=test;
test_inp=[ test_inp 1 ];
hval =
(tanh(test_inp*weight_input_hidden)
)';
p = hval'*weight_hidden_output ';
prediction=uint8(p);
end
function x = prag(x)
for i=1:size(x,1)
if abs(x(i))>0.6
x(i)=1;
else
x(i)=0;
end
end
end
%Acesta este Programul principal
voicepredict;
if(sum(out)==2)
p=testRetea(out);
fprintf( 'Biletul va costa %d RON \n',p);
end
close all;
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Determinarea cuvintelor cheie din înregistrări [616209] (ID: 616209)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
