如何使用 Matlab 获取目录中音频文件的长度(以秒为单位)?

How do I get the length (in seconds) of audio files in a directory with Matlab?

我需要遍历包含一堆音频文件 (.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) 指定文件名)我得到一个只有一个值的矩阵,我猜它是所有文件长度的总和。

有tip/help吗?谢谢!

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

编辑 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);

根据您在编辑 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.');

我认为你的进展顺利。

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);