sábado, 16 de janeiro de 2021

Distorcendo um sinal de voz: você prefere mais grave ou mais agudo?

Existem vários aplicativos que podem gerar diversos efeitos na sua voz.

Em alguns filmes ouvimos um tipo de sintetizador de voz que causa uma grande distorção na voz na pessoa que está falando de tal forma que a voz dela fica irreconhecível. Existem inclusive aplicativos que podem transformar a voz complemente e convertem a sua voz na de uma voz de monstro, robô de filme e até animal (ver aqui). 

Neste breve código Scilab realizamos duas transformações: tornamos uma voz "original" mais grave e, em seguida, em mais aguda. O efeito é bem interessante e código bem simples. Para a voz se tornar mais aguda é só retirar algumas amostras do sinal original. Já para voz se tornar mais grave, basta inserir amostras (calculadas como sendo a média de duas amostras adjacentes). A figura abaixo ilustra esses procedimentos.


Obs: uma forma muito mais simples de obter esses efeitos na hora de ouvir o arquivo de som (voz) é simplesmente informar uma taxa de amostragem diferente da taxa de amostragem original. Assim,

  • sound(y,Fs*0.80,bits);   ===> o som fica mais grave.
  • sound(y,Fs*1.25,bits);   ===> o som fica mais agudo.

Código:

////////////////////////////////
// Prof. Dr. Francisco Aquino //
// Lendo e modificando um     //
// arquivo de voz ".wav"      //
///////////////////////////////
clc; 
xdel(winsid());

//// Voz original:
vz = 'bomdia8.wav'; /// 
[y,Fs,bits]=wavread(vz);
ty = max(size(y));
y = y(5000:(ty-5000));
y = y/max(abs(y));
ty = max(size(y));

//// Convertendo em uma voz mais grave:
ym = 1:round(1.25*ty);
ym = 0*ym;
p = 1;
c = 0;
for k=1:ty-1;
    ym(p) = y(k);
    p = p + 1;
    c = c + 1;
    if c>3 then
        yy = (y(k) + y(k+1))/2;
        ym(p) = yy;
        c = 0;
        p = p + 1;
    end;
end
h = [0.1 0.25 0.5 0.5 0.25 0.1]; h=h/sum(h);
ymf = filter(h,1,ym);
tempo = 1:max(size(ymf));
tempo = tempo - 1; tempo = tempo/Fs;
sound(ymf,Fs,bits);

/// Convertendo em uma voz mais aguda:
ya = 0*y;
p=1;
pula = 0;
for k=1:round(ty*0.75)
    ya(k)=y(p);
    p=p+1;
    pula = pula + 1;
    if pula > 3 then pula = 0; p = p + 1; end;
end
ya = ya(1:k);
yaf = filter(h,1,ya);
pause; sound(yaf,Fs,bits);

f1 = 1:max(size(y));
f1 = f1-1; f1=f1/max(f1); f1=f1*Fs;
f2 = 1:max(size(ymf));
f2 = f2-1; f2=f2/max(f2); f2=f2*Fs;
f3 = 1:max(size(yaf));
f3 = f3-1; f3=f3/max(f3); f3=f3*Fs;
ffim1 = round(max(size(f1))/6);
ffim2 = round(max(size(f2))/6);
ffim3 = round(max(size(f3))/6);

yff = abs(fft(y));
ymff = abs(fft(ymf));
yaff = abs(fft(yaf));

subplot(3,2,1); plot(y); title('Voz original');
subplot(3,2,2); plot(f1(1:ffim1),yff(1:ffim1));
subplot(3,2,3); plot(ymf); title('Voz mais grave');
subplot(3,2,4); plot(f2(1:ffim2),ymff(1:ffim2));
subplot(3,2,5); plot(yaf); title('Voz mais aguda');
subplot(3,2,6); plot(f3(1:ffim3),yaff(1:ffim3));
Resultados gráficos:
Sinais de voz no tempo e no espectro. As diferenças são melhor percebidas quando ouvimos o sinal.

Nenhum comentário:

Postar um comentário