在MATLAB中提取wav文件的一部分并保存为新的wav文件的想法



这可能很容易,但我不是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()编辑输出音频文件的字符串,请在文件夹中备份您的文件,以确保安全。

相关内容

  • 没有找到相关文章

最新更新