这可能很容易,但我不是MatLab专家。我有一大堆wav文件,我需要从每个文件中提取一个30秒的样本。例子:
1.wav - need 1:34-2:04
2.wav - need 5:15 - 5:45
理想情况下,我想运行一个代码,将采取每个wav文件,并根据预生成的表提取正确的时间段,并将每个片段保存为一个新的wav文件(例如,1_snipp .wav将是我需要分析的30秒)。任何指向正确方向的点都很好。谢谢!
首先从录音中提取原始音频:[signal,fs] = audioread(‘file.wav’);
采样率存储在fs内,表示每秒的采样数。所以5秒等于5*fs。因此,可以提取具有特定时间戳的块:sig_chunk = signal(start_in_s*fs+1 : end_in_s*fs);
也可以从表中获取时间戳数据,并使用for循环来剪切音频。
最安全的选择是单独加载它们,并为每个使用掩码,然后保存。例如:
[x1,fs] = audioread('fileName1.wav');
tinit = 1*60 + 34; % In seconds
tend = 2*60 + 4;
ll = floor(tinit*fs) : floor(tend*fs);
x1 = x1(ll); % apply the mask to the segment of audio you want
audiowrite('fileName1edit.wav',x1,fs,'BitsPerSample',24)
然而,如果你有大量的文件要处理,一个不太可靠但更舒适的解决方案是将所有的wav文件转储到一个结构
中Files = dir('*.wav');
并调用
加载它们[x,fs] = audioread(Files(idx).name);
在length(Files)
的for循环中,您可以在其中提示一个对话框,询问分和秒开始以及分和秒结束。例如:
for idx = 1 : length(Files)
[x,fs] = audioread(Files(idx).name);
prompt = {'Min start:','Second start:','Min end:','Second end:'};
T = inputdlg(prompt,'Enter the times',[1,20]);
Ninit = round(fs*(str2num(T{1})*60 + str2num(T{2})));
Nend = round(fs*(str2num(T{3})*60 + str2num(T{4})));
ll = Ninit:Nend;
x = x(ll); % or x = x(Ninit:Nend);
audiowrite(Files(idx).name,...);
end
参见inputdlg()
的文档以获得更多示例。如果您没有使用_edit.mat
或类似的audiowrite()
编辑输出音频文件的字符串,请在文件夹中备份您的文件,以确保安全。