Как я могу аудиочитать все файлы в папке

У меня есть папка с файлами с таким названием: "speaker1_001.wav". Он идет от 001 до Speaker1_020. Как я могу сделать цикл for для «аудиочтения» всех файлов и сохранения значения в переменных с разными именами?

Это то, что я получил, но я получаю только одну переменную вместо 20.

mypath = fullfile('TrainVoices', 'speaker1');
for idx = 1:20
  filename = fullfile(mypath, sprintf('speaker1_%d.wav', idx));
  nameSpeaker = sprintf('speaker1_%d', idx);
  [nameSpeaker, fs] = audioread(filename);
end

person Alejandro    schedule 30.01.2019    source источник
comment
Я запутался с вашим вопросом! Сначала скажите мне, работает ли данный фрагмент кода? Если да, то спрашиваете ли вы, возможно ли работать с разными именами файлов, которые могут не иметь похожей тенденции в именах, как этот speaker1_%d.wav   -  person RC0993    schedule 31.01.2019


Ответы (1)


В своем коде вы пытаетесь динамически создать имя выходной переменной nameSpeaker с помощью инструкции nameSpeaker = sprintf('speaker1_%d', idx);, чтобы использовать ее в качестве выходной переменной при вызове audioread.

Это неверно, поскольку вы фактически присваиваете строку, созданную с помощью sprintf, переменной nameSpeaker, а не «меняете» ее имя.

Кроме того, вы должны управлять «нулями», включенными в имя файла.

Часть этой ошибки (которую можно исправить) в целом не рекомендуется использовать динамически созданную переменную.

Возможным решением может быть сохранение wav data в структуре, которая позволяет динамически создавать имя поля.

Более того, поскольку в соответствии с опубликованным вами кодом вы заранее знаете path и корневое имя входных файлов, вы можете создать полное имя файла, просто добавив разные строки, а не используя fullfile

Далее вы можете найти возможную реализацию предлагаемого решения.

На выходе будет структура с именем nameSpeaker с набором полей с именами speaker1_1, speaker1_2, speaker1_3 ... и т. д. после имени входного файла, в котором для простоты удалены «нули».

Каждое из этих полей представляет собой структуру с полями: data и fs, содержащими данные wav-файла.

Например:

данные speaker1_001.wav arfe хранятся в структуре

nameSpeaker.speaker1_1.data
nameSpeaker.speaker1_1.fa

данные speaker1_002.wav arfe хранятся в структуре

nameSpeaker.speaker1_2.data
nameSpeaker.speaker1_2.fs

и так далее.

% Defina the path
mypath='TrainVoices\speaker1'
% Define the file root name
f_root_name='speaker1_'
% Define the extension of the input file\
ext='.wav'
% Loop over the input filess
for idx = 1:20
   %& add the proper number of "0" to tjhe filename
   if(idx <= 9)
      f_name=[f_root_name '00' num2str(idx)]
   else
      f_name=[f_root_name '0' num2str(idx)]
   end
   % Build the filename
   filename=fullfile(mypath,[f_name ext])
   % Read the wav file
   [data,fs] = audioread(filename);
   % Store the wav file data in a struct
   nameSpeaker.([f_root_name num2str(idx)]).data=data;
   nameSpeaker.([f_root_name num2str(idx)]).fs=fs;
end

Вы можете получить доступ к данным, просто указав «idx» файла.

Например, чтобы получить доступ к данным speaker1_001.wav, вы можете просто определить файл «idx», а затем соответствующим образом построить имена полей:

file_idx=3
data=nameSpeaker.([f_root_name num2str(file_idx)]).data
fs=nameSpeaker.([f_root_name num2str(file_idx)]).fs
person il_raffa    schedule 31.01.2019