Mercurial > hg > audio-degradation-toolbox
diff demo_batchProcessing.m @ 0:9d682f5e3927
put files here from the old repository
author | matthiasm |
---|---|
date | Thu, 08 Aug 2013 11:01:12 +0100 |
parents | |
children | 1a058eb51073 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/demo_batchProcessing.m Thu Aug 08 11:01:12 2013 +0100 @@ -0,0 +1,212 @@ +function demo_batchProcessing() + +% This is an example script to process a whole dataset using the Audio +% Degradation Toolbox including code to translate given ground truth +% annotations. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Audio Degradation Toolbox +% +% Centre for Digital Music, Queen Mary University of London. +% This file copyright 2013 Sebastian Ewert, Matthias Mauch and QMUL. +% +% This program is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License as +% published by the Free Software Foundation; either version 2 of the +% License, or (at your option) any later version. See the file +% COPYING included with this distribution for more information. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +addpath(fullfile(pwd,'AudioDegradationToolbox')); + +% the following file should list all the files to process. Every line +% should specify one audio file, one audio file and a ground truth file in +% CSV format, or just the ground truth file. This example scripts treats +% the first column of a CSV file as time information that needs to be +% adjusted. If this is not correct, the script needs to be adapted. +filename_listOfFiles = 'listOfFiles.txt'; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 1 testdata/472TNA3M_snippet.wav +% 2 testdata/clarinet.wav +% 3 testdata/p009m_drum.wav +% 4 testdata/RWC-C08.wav ; testdata/RWC-C08.csv +% 5 testdata/p009m_drum.csv +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% line 1-3: just process audio, line 4: process audio and ground truth data +% at the same time, line 5: process only ground truth data + +% destination directory +outputDirectory = 'demoOutput/'; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% read list of files to process +fid = fopen(filename_listOfFiles); +files=textscan(fid,'%s %s','delimiter',';'); +fclose(fid); +numLines = length(files{1}); +if length(files)>1 && (length(files{2}) < numLines) + files{2}{length(files{2})+1:numLines} = ''; +end +files{1} = strtrim(files{1}); +files{2} = strtrim(files{2}); + +% create outputDirectory if necessary +if ~exist(outputDirectory,'dir') + mkdir(outputDirectory); +end + +% loop over files to process +parfor k=1:numLines % use this if you have the parallel computing toolbox +% for k=1:numLines + [path1,name1,ext1] = fileparts(files{1}{k}); + [path2,name2,ext2] = fileparts(files{2}{k}); + + % check whether a wav and/or csv file is given + audiofilename = []; audiopath = []; csvfilename=[]; csvpath = []; + if strcmpi(ext1,'.csv') + csvpath = path1; + csvfilename = [name1,ext1]; + elseif strcmpi(ext1,'.wav') + audiopath = path1; + audiofilename = [name1,ext1]; + end + if strcmpi(ext2,'.csv') + csvpath = path2; + csvfilename = [name2,ext2]; + elseif strcmpi(ext2,'.wav') + audiopath = path2; + audiofilename = [name2,ext2]; + end + + % Read audio and CSV data + f_audio = []; samplingFreq = []; nbits = []; + timepositions_beforeDegr = []; remainingColumns = []; + if ~isempty(audiofilename) + fprintf('Reading %s\n',audiofilename); + [f_audio,samplingFreq,nbits] = wavread(fullfile(audiopath,audiofilename)); + end + if ~isempty(csvfilename) + fprintf('Reading %s\n',csvfilename); + + fid = fopen(fullfile(csvpath,csvfilename)); + linestring = fgetl(fid); + numberOfColumns = length(strfind(linestring,','))+1; + fclose(fid); + + fid = fopen(fullfile(csvpath,csvfilename)); + data = textscan(fid,['%f' repmat('%s', 1, numberOfColumns-1) '%*[^\n]'], 'delimiter', ',', 'collectoutput', true); + fclose(fid); + + timepositions_beforeDegr = data{1}; + remainingColumns = data{2}; + end + + % Start the degradation process + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + degradationname = 'liveRecording'; + PathToOutput = fullfile(outputDirectory,degradationname); + if ~exist(PathToOutput,'dir') mkdir(PathToOutput); end + [f_audio_out,timepositions_afterDegr] = applyDegradation(degradationname, f_audio, samplingFreq, timepositions_beforeDegr); + + if ~isempty(audiofilename) + wavwrite(f_audio_out,samplingFreq,nbits,fullfile(PathToOutput,audiofilename)); + end + if ~isempty(csvfilename) + writeCsvFile(fullfile(PathToOutput,csvfilename),timepositions_afterDegr,remainingColumns); + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + degradationname = 'strongMp3Compression'; + PathToOutput = fullfile(outputDirectory,degradationname); + if ~exist(PathToOutput,'dir') mkdir(PathToOutput); end + [f_audio_out,timepositions_afterDegr] = applyDegradation(degradationname, f_audio, samplingFreq, timepositions_beforeDegr); + + if ~isempty(audiofilename) + wavwrite(f_audio_out,samplingFreq,nbits,fullfile(PathToOutput,audiofilename)); + end + if ~isempty(csvfilename) + writeCsvFile(fullfile(PathToOutput,csvfilename),timepositions_afterDegr,remainingColumns); + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + degradationname = 'vinylRecording'; + PathToOutput = fullfile(outputDirectory,degradationname); + if ~exist(PathToOutput,'dir') mkdir(PathToOutput); end + [f_audio_out,timepositions_afterDegr] = applyDegradation(degradationname, f_audio, samplingFreq, timepositions_beforeDegr); + + if ~isempty(audiofilename) + wavwrite(f_audio_out,samplingFreq,nbits,fullfile(PathToOutput,audiofilename)); + end + if ~isempty(csvfilename) + writeCsvFile(fullfile(PathToOutput,csvfilename),timepositions_afterDegr,remainingColumns); + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + degradationname = 'radioBroadcast'; + PathToOutput = fullfile(outputDirectory,degradationname); + if ~exist(PathToOutput,'dir') mkdir(PathToOutput); end + [f_audio_out,timepositions_afterDegr] = applyDegradation(degradationname, f_audio, samplingFreq, timepositions_beforeDegr); + + if ~isempty(audiofilename) + wavwrite(f_audio_out,samplingFreq,nbits,fullfile(PathToOutput,audiofilename)); + end + if ~isempty(csvfilename) + writeCsvFile(fullfile(PathToOutput,csvfilename),timepositions_afterDegr,remainingColumns); + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + degradationname = 'smartPhoneRecording'; + PathToOutput = fullfile(outputDirectory,degradationname); + if ~exist(PathToOutput,'dir') mkdir(PathToOutput); end + [f_audio_out,timepositions_afterDegr] = applyDegradation(degradationname, f_audio, samplingFreq, timepositions_beforeDegr); + + if ~isempty(audiofilename) + wavwrite(f_audio_out,samplingFreq,nbits,fullfile(PathToOutput,audiofilename)); + end + if ~isempty(csvfilename) + writeCsvFile(fullfile(PathToOutput,csvfilename),timepositions_afterDegr,remainingColumns); + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + degradationname = 'smartPhonePlayback'; + PathToOutput = fullfile(outputDirectory,degradationname); + if ~exist(PathToOutput,'dir') mkdir(PathToOutput); end + [f_audio_out,timepositions_afterDegr] = applyDegradation(degradationname, f_audio, samplingFreq, timepositions_beforeDegr); + + if ~isempty(audiofilename) + wavwrite(f_audio_out,samplingFreq,nbits,fullfile(PathToOutput,audiofilename)); + end + if ~isempty(csvfilename) + writeCsvFile(fullfile(PathToOutput,csvfilename),timepositions_afterDegr,remainingColumns); + end + +end + +end + + +function writeCsvFile(filename, cols_numeric, remainingColsCell) + +numberOfAdditionalColumns = size(remainingColsCell,2); + +fid = fopen(filename,'w'); +for m=1:size(cols_numeric,1) + fprintf(fid,'%f',cols_numeric(m,1)); + for n=2:size(cols_numeric,2) + fprintf(fid,' %f',cols_numeric(m,n)); + end + for n=1:numberOfAdditionalColumns + fprintf(fid,' %s',remainingColsCell{m,n}); + end + fprintf(fid,'\n'); +end +fclose(fid); + +end + +