【问题标题】:Ideas for extracting a portion of a wav file and saving as new wav file in MATLAB在 MATLAB 中提取一部分 wav 文件并另存为新 wav 文件的想法
【发布时间】:2022-11-29 02:51:32
【问题描述】:

这可能很容易,但我不是 MatLab 专家。我有一批 wav 文件,我需要从每个文件中提取一个 30s 的样本。例子:

1.wav - 需要1:34-2:04

2.wav - 需要5:15 - 5:45

理想情况下,我想运行一个代码,它将获取每个 wav 文件并根据预先生成的表提取正确的时间段,并将每个 sn-p 保存为一个新的 wav 文件(例如,1_snip.wav 将是我的 30 秒需要分析)。任何指向正确方向的点都会很棒。谢谢!

【问题讨论】:

    标签: matlab audio acoustics


    【解决方案1】:

    首先从录音中提取原始音频: [signal,fs] = audioread(‘file.wav’);

    采样率存储在 fs 中,代表每秒的采样数。所以,5 秒就是 5*fs。因此可以提取具有特定时间戳的块: sig_chunk = signal(start_in_s*fs+1 : end_in_s*fs);

    也可以从表中获取时间戳数据并使用 for 循环来剪切音频。

    【讨论】:

      【解决方案2】:

      最安全的选择是单独加载它们并为每个使用掩码然后保存。例如:

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

      【讨论】:

        猜你喜欢
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多