【问题标题】:How do I get the length (in seconds) of audio files in a directory with Matlab? [closed]如何使用 Matlab 获取目录中音频文件的长度(以秒为单位)? [关闭]
【发布时间】:2018-05-21 10:12:40
【问题描述】:

我需要浏览一个包含一堆音频文件 (.wav) 的目录并计算每个文件的长度(以秒为单位)(然后我想将它们放在一个 .xls 或 .txt 文件中排序列)。

我找到了这段用于计算音频文件长度的代码:

 [y,fs] = audioread(filename);
 TotalTime = length(y)./fs; % time in seconds

我有这个要通过一个目录:

files = dir('directory');
for file = files'
    % get the length of the audio file, possibly by adapting the code above?
end

但我不知道如何将两者放在一起。在循环中插入第一段代码时(当然用strcat('directory', file.name) 指定文件名),我得到一个具有单个值的矩阵,我猜这是所有文件长度的总和。

任何提示/帮助?谢谢!

编辑: 我需要的基本上是这样的:进入一个目录,遍历每个音频文件,获取每个文件的长度/持续时间(以秒为单位),将值保存在向量中,转到下一个音频文件;如上所述将最终向量导出到文件中。

编辑 2: 我试过这段代码:

files = dir('directory/*.wav');
i = 1
for file = files'
    [y,fs] = audioread((strcat('directory', file.name)));
    duration(i) = length(y)./fs; % time in seconds
    i = i+1;
end

但向量不包含确切顺序的持续时间。第二个文件的持续时间与向量的第二个值不对应,第三个也不对应。所以我猜出了点问题。

编辑 3 当我单独计算时,结果是一致的——即。如果我从第二个文件中提取 y 和 fs,然后计算长度(y)./fs,结果是正确的(我在 Audacity 中手动检查该文件的长度,看看是否对应于 Matlab 所说的),第三个相同和第四个文件(我尝试了四个,我有 256 个要计算,这就是为什么我想要一种快速自动完成的方法)。是的,我单独获得的值出现在向量中,但不是我期望的值,所以我认为循环中有问题。

编辑 4 我按照@EdR 的建议做了,我看到循环像这样遍历文件:文件 1.wav,然后是 10.wav,然后是 100.wav,101.wav 等等(我的文件编号从 1 到 256) .为避免这种情况,使用以下代码:

for file=1:256
    audioname=sprintf('%d',file);
    audioname=strcat('directory', audioname, '.wav');
    [y,fs] = audioread(audioname);
    duration(file) = length(y)./fs; % time in seconds
end

现在它可以工作并给出正确的长度。下一步是将此向量导出到 xls 文件中:每行中包含单个值的单列(直到现在我还没有找到这样做的方法)。

编辑 5

我用下面的代码解决了这个问题,谢谢大家!我将duration(file) 更改为duration(file,:),以便将值存储在单个列中(抱歉,我是Matlab 新手,慢慢了解解决遇到的具体问题需要什么)。

for file=1:256
    audioname=sprintf('%d',file);
    audioname=strcat('directory', audioname, '.wav');
    [y,fs] = audioread(audioname);
    duration(file,:) = length(y)./fs; % time in seconds
end

excelname = 'filename';
xlswrite(excelname, duration);

【问题讨论】:

  • 请编辑问题以更清楚地描述您在循环中所做的事情
  • 在循环中我只需要遍历目录并获取每个音频文件的长度。
  • 我需要的基本上是:进入一个目录,遍历每个音频文件,以秒为单位获取长度/持续时间,将值保存在向量中,转到下一个音频文件。
  • 如果您在循环中有一条语句A = somecalculations;,并且没有索引到正确长度的A,那么您将得到的只是循环中最终时间的值。如果不向我们展示详细信息,我们无法知道这是否是问题所在。
  • 长度是否看起来乱序,但与其中一个文件相对应?它们是否与您的预期时间相关,即更长的文件有更大的数字等?

标签: matlab file audio wav duration


【解决方案1】:

根据您编辑 4 中的代码,我已经更新了答案,可以编写 Excel 文件

for file=1:256
    audioname=sprintf('%d',file);
    audioname=strcat('directory', audioname, '.wav');
    [y,fs] = audioread(audioname);
    duration(file) = length(y)./fs; % time in seconds
end
xlswrite('duration.xls', duration.');

【讨论】:

  • 这正是我接下来所做的,但我检查了第二个值与第二个文件的长度不对应,第三个相同。所以我猜某处出了点问题。
  • @s.gastaldon 长度是否看起来有问题,但与其中一个文件相对应?它们是否与您的预期时间相关,即更长的文件有更大的数字等?
  • 如上所述,如果我单独计算,结果是一致的(即如果我从第二个文件中提取y和fs然后计算长度(y)./fs,结果是正确的,第三个和第四个文件也一样——我尝试了四个,我有 256 个要计算,所以检查相关性和对应关系对我来说并不容易,但我认为可以肯定的是循环不能正常工作,因为单独的操作会产生正确的结果)。
【解决方案2】:

我认为你一切顺利。

files = dir('directory');
result = {'filename','duration(s)'}
for ct = 1:length(files)
    [y,fs] = audioread(fullfile(files(ct).folder,files(ct).name));
    result(ct+1,:) = {files(ct).name,length(y)./fs}; % time in seconds
end
xlswrite('result.xlsx',result);

【讨论】:

  • 这还是按照这个顺序遍历目录:1.wav、10.wav、100.wav、101.wav、102.wav等等,而不是1.wav、2.wav , 3.wav...(我有 256 个名称为 [progressive number].wav 的 wav 文件)。但是感谢有关如何将值存储在向量中以使其在单列中的提示!我将它与 EDIT 4 中的代码一起使用,现在我得到了我想要的。谢谢!
  • 它将文件名保存在第一列。我认为以后使用 excel 对它们进行排序很容易,但是如果您想按顺序浏览它们,那么您当前的方法是可以的。您还可以让 matlab 自动将文件从 1.wav 重命名为 001.wav ;-)
  • 我喜欢上面的dir 生成文件名的原因是,如果您添加一个文件(例如 257.wav),您需要更改您的代码。或者如果有人删除了 102.wav,你的代码就会崩溃。通常使用dir 并稍后排序会更安全。
  • 很公平!在这种情况下,我确定不会删除或添加任何文件(它们是脑电图实验的刺激物),但感谢您的提示,我会记住这一点以备不时之需!
猜你喜欢
  • 1970-01-01
  • 2011-06-05
  • 2017-10-05
  • 2012-11-02
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
相关资源
最近更新 更多