Как я могу прослушать все файлы в папке - PullRequest
0 голосов
/ 30 января 2019

У меня есть папка с файлами, названными так: "speaker1_001.wav".Идет с 001 до динамика 1_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

1 Ответ

0 голосов
/ 31 января 2019

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

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

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

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

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

Более того, поскольку в соответствии с опубликованным кодом вы заранее знаете path и корневое имя файлов inout, вы можетеСоздайте полное имя файла, просто добавив различные строки вместо использования 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...