如何在MATLAB中使声音信号长度相同?

时间:2016-01-24 04:31:31

标签: matlab neural-network speech-recognition voice backpropagation

我发现这是我从code下载的语音识别blog。它工作正常,它要求录制声音以创建数据集,然后你必须调用一个函数来使用神经网络训练系统。

我想使用此代码来训练使用我想识别的20个单词的数据集。

问题: 我有一个包含20个单词的800个文件的数据集,即每个单词来自不同人的40个录音。我用Windows录音机收集文件。 问题是在代码中输入文件的大小设置为总是8000,另一方面我的数据集不是常数,一些文件是2秒长,有些是3,这意味着它将是每个文件中的样本数量不同。

如果每个输入信号的样本变化,它可能会产生错误。 我想用我的文件训练系统。 我该怎么做?

代码:

clc;clear all;
load('voicetrainfinal.mat');
Fs=8000;
for l=1:20
 clear y1 y2 y3;
display('record voice');
pause();
x=wavrecord(Fs,Fs);     % wavrecord(n,Fs) records n samples at a sampling rate of Fs
maxval = max(x);
if maxval<0.04
    display('Threshold value is too large!');
end
t=0.04;
j=1;
for i=1:8000
    if(abs(x(i))>t)
        y1(j)=x(i);
        j=j+1;
    end
end
y2=y1/(max(abs(y1)));
y3=[y2,zeros(1,3120-length(y2))];
y=filter([1 -0.9],1,y3');%high pass filter to boost the high frequency components
%%frame blocking
blocklen=240;%30ms block
overlap=80;
block(1,:)=y(1:240);
for i=1:18
    block(i+1,:)=y(i*160:(i*160+blocklen-1));
end
w=hamming(blocklen);
for i=1:19
    a=xcorr((block(i,:).*w'),12);%finding auto correlation from lag -12 to 12
    for j=1:12
        auto(j,:)=fliplr(a(j+1:j+12));%forming autocorrelation matrix from lag 0 to 11
    end
    z=fliplr(a(1:12));%forming a column matrix of autocorrelations for lags 1 to 12
    alpha=pinv(auto)*z';
    lpc(:,i)=alpha;
end
wavplay(x,Fs);
X1=reshape(lpc,1,228);
a1=sigmoid(Theta1*[1;X1']);
    h=sigmoid(Theta2*[1;a1]);
    m=max(h);
  p1=find(h==m);
  if(p1==10)
      P=0
  else
      P=p1
  end
end

2 个答案:

答案 0 :(得分:1)

在您的代码中,您有:

[y, Fs] = wavread(filename);

似乎不是录制你要导入你的声音文件(这里是.wave文件):

8000

不是硬编码n = length(y); 值,而是可以读取文件的长度:

n

然后在for循环中使用for i=1:n if(abs(x(i))>t) y1(j)=x(i); j=j+1; end end 变量:

8000

其余代码似乎独立于n_max值。 如果您担心文件长度不一致。计算n_max,即您拥有的所有录音的最大长度。对于短于n_max个样本的记录,用零填充它们,以使它们全部n_max = 0; for file = ["file1" "file2" ... "filen"] [y, Fs] = wavread(filename); n_max = max(n_max,length(y)); end 长。

y = [y, zeros(1, n_max - length(y))];

然后每次处理声音向量时,你可以用0填充它(对你无害,因为0表示没有声音),如下所示:

$queryUpdate = "UPDATE routing_has_work_center SET production_hour='$production_hour' WHERE routing_id = '$theID' ";

答案 1 :(得分:1)

n=noOfFiles
for k=1:n
M(k,1:length(filedata{k})) = filedata{k}
end

:P