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

如何在MATLAB中使声音信号长度相同?,matlab,neural-network,speech-recognition,voice,backpropagation,Matlab,Neural Network,Speech Recognition,Voice,Backpropagation,我从一个网站上下载了这个语音识别。它工作得很好,它要求记录声音来创建数据集,然后你必须调用一个函数来使用神经网络训练系统 我想使用这段代码,使用我想要识别的20个单词的数据集进行训练 问题: 我有一个包含800个文件的数据集,其中包含20个单词,即每个单词有40个来自不同人群的录音。我用Windows录音机来收集文件。 问题是,在代码中,输入文件的大小总是设置为8000,另一方面,我的数据集不是常数,有些文件长2秒,有些文件长3秒,这意味着每个文件中的样本数不同 如果每个输入信号的采样值发生变化

我从一个网站上下载了这个语音识别。它工作得很好,它要求记录声音来创建数据集,然后你必须调用一个函数来使用神经网络训练系统

我想使用这段代码,使用我想要识别的20个单词的数据集进行训练

问题: 我有一个包含800个文件的数据集,其中包含20个单词,即每个单词有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
clc;清除所有;
加载(“voicetrainfinal.mat”);
Fs=8000;
对于l=1:20
清除y1 y2 y3;
显示(“录制语音”);
暂停();
x=波形记录(Fs,Fs);%wavrecord(n,Fs)以Fs的采样率记录n个样本
maxval=max(x);
如果maxvalt)
y1(j)=x(i);
j=j+1;
结束
结束
y2=y1/(最大值(abs(y1));
y3=[y2,零(13120长度(y2))];
y=过滤器([1-0.9],1,y3');%用于提升高频分量的高通滤波器
%%帧阻塞
blocklen=240;%30ms块
重叠=80;
块(1,:)=y(1:240);
因为i=1:18
块(i+1,:)=y(i*160:(i*160+blocklen-1));
结束
w=汉明(布洛克伦);
因为i=1:19
a=xcorr((块(i,:)*w'),12);%从滞后-12到12寻找自相关
对于j=1:12
自动(j,:)=fliplr(a(j+1:j+12));%从滞后0到11形成自相关矩阵
结束
z=fliplr(a(1:12));%形成滞后1到12的自相关列矩阵
alpha=pinv(自动)*z';
lpc(:,i)=α;
结束
wavplay(x,Fs);
X1=重塑(lpc,1228);
a1=乙状结肠(θ1*[1;X1']);
h=乙状结肠(θ2*[1;a1]);
m=最大值(h);
p1=查找(h==m);
如果(p1==10)
P=0
其他的
P=p1
结束
结束
在您的代码中,您有:

Fs=8000;
wavrecord(n,Fs) % records n samples at a sampling rate Fs
for i=1:8000
  if(abs(x(i))>t)
      y1(j)=x(i);
      j=j+1;
  end
end
似乎您将导入您的声音文件(此处为.wave文件),而不是录制:

您可以读取文件的长度,而不是硬编码
8000
值:

n = length(y);
然后在
for
循环中使用
n
变量:

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 = 0;
for file = ["file1" "file2" ... "filen"]
  [y, Fs] = wavread(filename);
  n_max = max(n_max,length(y));
end
然后,每次处理声音向量时,都可以用0填充它(对您无害,因为0表示没有声音),如下所示:


:p

除了代码之外,最好提供一些解释。在同一个矩阵中,代码的长度不同。n=noOfFiles%接受输入的总数。M(k,1:length(filedata{k}))=filedata{k}%将第k个文件的所有数据存储在M中。无论不同输入的长度有多大差异。它会占用每一个长度,并将零放在较短长度的额外部分。不需要单独填充或采用mac长度和全部。可能重复
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))];
n=noOfFiles
for k=1:n
M(k,1:length(filedata{k})) = filedata{k}
end