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

iqxoj9l9  于 2022-11-30  发布在  Matlab
关注(0)|答案(2)|浏览(453)

这可能很容易,但我不是MatLab的Maven。我有一个wav文件的备份,我需要从每个文件中提取一个30 s的样本。例如:
1.需要1:34-2:04
2. wav -需要5:15 - 5:45
理想情况下,我希望运行一个代码,该代码将获取每个wav文件,并根据预先生成的表提取正确的时间段,并将每个片段保存为一个新的wav文件(例如,1_snip.wav将是我需要分析的30秒)。任何指向正确方向的点都将是伟大的。谢谢!

pwuypxnk

pwuypxnk1#

首先从录音中提取原始音频:[signal,fs] = audioread(‘file.wav’);
采样率存储在fs中,表示每秒的采样数,因此,5秒等于5*fs,因此可以提取具有特定时间戳的块:sig_chunk = signal(start_in_s*fs+1 : end_in_s*fs);
还可以从表中获取时间戳数据,并使用for循环剪切音频。

epfja78i

epfja78i2#

最安全的选择是分别加载它们,并为每个对象使用一个掩码,然后保存。例如:

[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()中输出音频文件的字符串,请在文件夹中备份文件以确保安全。

相关问题