Dimitrios@0: function [] = try_eventdetection(inputFile,outputFile) Dimitrios@0: % Perform event detection and produce collective results Dimitrios@0: % for all different configurations Dimitrios@0: Dimitrios@0: % Suggested name for outputFile: 'Outputs_(sid/bdm)/XX/scriptXX.txt' Dimitrios@0: Dimitrios@0: % This script assumes that the system outputs are text files saved in a Dimitrios@0: % preexisting folder "Outputs_" and their names are of the form: Dimitrios@0: % 'Outputs_(bdm/sid)/XX/scriptXX<...>.txt Dimitrios@0: % where <...> is: _Bases_X-XX_thres_XXXX_filt_X Dimitrios@0: Dimitrios@0: % All possible runs: Dimitrios@0: %{ Dimitrios@0: try_eventdetection('Development_Set/stereo/script01.wav','Outputs_sid/01/script01.txt'); Dimitrios@0: try_eventdetection('Development_Set/stereo/script02.wav','Outputs_sid/02/script02.txt'); Dimitrios@0: try_eventdetection('Development_Set/stereo/script03.wav','Outputs_sid/03/script03.txt'); Dimitrios@0: try_eventdetection('Development_Set/stereo/script01.wav','Outputs_bdm/01/script01.txt'); Dimitrios@0: try_eventdetection('Development_Set/stereo/script02.wav','Outputs_bdm/02/script02.txt'); Dimitrios@0: try_eventdetection('Development_Set/stereo/script03.wav','Outputs_bdm/03/script03.txt'); Dimitrios@0: %} Dimitrios@0: Dimitrios@0: % If normalised use thresholds: [200:50:900] and let line 53 on Dimitrios@0: % If unnormalised use thresholds: [0:0.1:2.4] and comment out line 53 Dimitrios@0: Dimitrios@0: %Choose Annotation Dimitrios@0: Annotators = {'_bdm', '_sid'}; Dimitrios@0: if isequal(outputFile(8:11),Annotators{1}) Dimitrios@0: ANOT_FLAG = 1; Dimitrios@0: elseif isequal(outputFile(8:11),Annotators{2}) Dimitrios@0: ANOT_FLAG = 2; Dimitrios@0: else Dimitrios@0: error('Incorrect outputFile, please see description again.'); Dimitrios@0: end Dimitrios@0: Dimitrios@0: Dimitrios@0: % Different Combinations Dimitrios@0: AllnumBases = [ 5 8 10 12 15 20 20]; % Last number(20) corresponds to Dict20individual Dimitrios@0: AllFiltering = [ 1 3 5 ]; Dimitrios@0: AllThres = [200:50:900]; Dimitrios@0: Dimitrios@0: for i = 1 : length(AllnumBases) Dimitrios@0: % Initialize Dimitrios@0: if (i == length(AllnumBases)) Dimitrios@0: loadfile = ['Dictionaries' Annotators{ANOT_FLAG} '/Dict20individual' '.mat']; Dimitrios@0: else Dimitrios@0: loadfile = ['Dictionaries' Annotators{ANOT_FLAG} '/Dict' num2str(AllnumBases(i)) '.mat']; Dimitrios@0: end Dimitrios@0: load(loadfile); Dimitrios@0: Classes = {'alert','clearthroat','cough','doorslam','drawer','keyboard','keyes',... Dimitrios@0: 'knock','laughter','mouse','pageturn','pendrop','phone','printer',... Dimitrios@0: 'speech','switch'}; Dimitrios@0: Dimitrios@0: Dimitrios@0: % Read the audio for the Event, making sure no overflow occurs Dimitrios@0: [x,fs] = wavread(inputFile); Dimitrios@0: Dimitrios@0: Dimitrios@0: % Normalize wav files Dimitrios@0: xnow = sum(x,2)/2; Dimitrios@0: % If choosing not to normalize, the thershold parameter above has to be Dimitrios@0: % adjusted: i.e. [0:0.1:2.2]; Dimitrios@0: xnow = xnow./std(xnow); Dimitrios@0: Dimitrios@0: Dimitrios@0: % Calculate CQT Dimitrios@0: [intCQT] = computeCQT(xnow); Dimitrios@0: cqt_rep = intCQT(:,round(1:7.1128:size(intCQT,2))); Dimitrios@0: Dimitrios@0: Dimitrios@0: % Perform NMF Dimitrios@0: [W,H,errs,vout] = nmf_beta(cqt_rep,size(Dict,2),'beta',1,'W',Dict,'W0',Dict); Dimitrios@0: Dimitrios@0: Dimitrios@0: % Reshape H Dimitrios@0: Hnew = reshape(H,AllnumBases(i),16,size(H,2)); Dimitrios@0: Hnew2 = squeeze(sum(Hnew,1)); Dimitrios@0: Dimitrios@0: for j = 1 : length(AllThres) Dimitrios@0: for k = 1 : length(AllFiltering) Dimitrios@0: % Perform thresolding on Hnew2 Dimitrios@0: thr = AllThres(j); Dimitrios@0: Hnew2 = medfilt1(Hnew2',AllFiltering(k))'; Dimitrios@0: eventRoll = double(Hnew2 > thr); Dimitrios@0: Dimitrios@0: Dimitrios@0: % Create matrix of events (onset-offset-classNum) Dimitrios@0: auxEventRoll = diff([zeros(1,16); eventRoll'; zeros(1,16);],1); p=0; Dimitrios@0: nmat=[]; Dimitrios@0: for m=1:16 Dimitrios@0: onsets = find(auxEventRoll(:,m)==1); Dimitrios@0: offsets = find(auxEventRoll(:,m)==-1); Dimitrios@0: for n=1:length(onsets) Dimitrios@0: if((offsets(n)/100-0.01) - (onsets(n)/100) > 0.05) % not output really short events Dimitrios@0: p=p+1; Dimitrios@0: nmat(p,1) = onsets(n)/100; Dimitrios@0: nmat(p,2) = offsets(n)/100-0.01; Dimitrios@0: nmat(p,3) = m; Dimitrios@0: end; Dimitrios@0: end; Dimitrios@0: end; Dimitrios@0: nmat = sortrows(nmat,1); Dimitrios@0: Dimitrios@0: Dimitrios@0: % Print output Dimitrios@0: if (i == length(AllnumBases)) Dimitrios@0: outputFileName = [outputFile(1:end-4) '_Bases_' num2str(AllnumBases(i)) ... Dimitrios@0: 'individual_thres_' num2str(AllThres(j)) '_filt_' num2str(AllFiltering(k)) '.txt']; Dimitrios@0: else Dimitrios@0: outputFileName = [outputFile(1:end-4) '_Bases_' num2str(AllnumBases(i)) ... Dimitrios@0: '_thres_' num2str(AllThres(j)) '_filt_' num2str(AllFiltering(k)) '.txt']; Dimitrios@0: end Dimitrios@0: fid=fopen(outputFileName,'w'); Dimitrios@0: for m=1:size(nmat,1) Dimitrios@0: fprintf(fid,'%.2f\t%.2f\t%s\n',nmat(m,1),nmat(m,2),Classes{nmat(m,3)}); Dimitrios@0: end; Dimitrios@0: fclose(fid); Dimitrios@0: Dimitrios@0: end Dimitrios@0: end Dimitrios@0: Dimitrios@0: end Dimitrios@0: