这可能很容易,但我不是MatLab的Maven。我有一个wav文件的备份,我需要从每个文件中提取一个30 s的样本。例如:1.需要1:34-2:042. wav -需要5:15 - 5:45理想情况下,我希望运行一个代码,该代码将获取每个wav文件,并根据预先生成的表提取正确的时间段,并将每个片段保存为一个新的wav文件(例如,1_snip.wav将是我需要分析的30秒)。任何指向正确方向的点都将是伟大的。谢谢!
pwuypxnk1#
首先从录音中提取原始音频:[signal,fs] = audioread(‘file.wav’);采样率存储在fs中,表示每秒的采样数,因此,5秒等于5*fs,因此可以提取具有特定时间戳的块:sig_chunk = signal(start_in_s*fs+1 : end_in_s*fs);还可以从表中获取时间戳数据,并使用for循环剪切音频。
[signal,fs] = audioread(‘file.wav’);
sig_chunk = signal(start_in_s*fs+1 : end_in_s*fs);
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循环中,您可以在其中提示一个对话框,要求输入开始的分和秒以及结束的分和秒。例如:
length(Files)
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()中输出音频文件的字符串,请在文件夹中备份文件以确保安全。
inputdlg()
_edit.mat
audiowrite()
2条答案
按热度按时间pwuypxnk1#
首先从录音中提取原始音频:
[signal,fs] = audioread(‘file.wav’);
采样率存储在fs中,表示每秒的采样数,因此,5秒等于5*fs,因此可以提取具有特定时间戳的块:
sig_chunk = signal(start_in_s*fs+1 : end_in_s*fs);
还可以从表中获取时间戳数据,并使用for循环剪切音频。
epfja78i2#
最安全的选择是分别加载它们,并为每个对象使用一个掩码,然后保存。例如:
但是,如果您要处理大量文件,一个可靠性较低但更方便的解决方案可能是转储一个结构中的所有wav文件
并加载它们调用
在
length(Files)
的for循环中,您可以在其中提示一个对话框,要求输入开始的分和秒以及结束的分和秒。例如:请参阅
inputdlg()
的文稿以了解更多示例。如果您没有使用_edit.mat
或类似命令编辑audiowrite()
中输出音频文件的字符串,请在文件夹中备份文件以确保安全。