Dimitrios@0
|
1 function [] = try_eventdetection(inputFile,outputFile)
|
Dimitrios@0
|
2 % Perform event detection and produce collective results
|
Dimitrios@0
|
3 % for all different configurations
|
Dimitrios@0
|
4
|
Dimitrios@0
|
5 % Suggested name for outputFile: 'Outputs_(sid/bdm)/XX/scriptXX.txt'
|
Dimitrios@0
|
6
|
Dimitrios@0
|
7 % This script assumes that the system outputs are text files saved in a
|
Dimitrios@0
|
8 % preexisting folder "Outputs_<annotator>" and their names are of the form:
|
Dimitrios@0
|
9 % 'Outputs_(bdm/sid)/XX/scriptXX<...>.txt
|
Dimitrios@0
|
10 % where <...> is: _Bases_X-XX_thres_XXXX_filt_X
|
Dimitrios@0
|
11
|
Dimitrios@0
|
12 % All possible runs:
|
Dimitrios@0
|
13 %{
|
Dimitrios@0
|
14 try_eventdetection('Development_Set/stereo/script01.wav','Outputs_sid/01/script01.txt');
|
Dimitrios@0
|
15 try_eventdetection('Development_Set/stereo/script02.wav','Outputs_sid/02/script02.txt');
|
Dimitrios@0
|
16 try_eventdetection('Development_Set/stereo/script03.wav','Outputs_sid/03/script03.txt');
|
Dimitrios@0
|
17 try_eventdetection('Development_Set/stereo/script01.wav','Outputs_bdm/01/script01.txt');
|
Dimitrios@0
|
18 try_eventdetection('Development_Set/stereo/script02.wav','Outputs_bdm/02/script02.txt');
|
Dimitrios@0
|
19 try_eventdetection('Development_Set/stereo/script03.wav','Outputs_bdm/03/script03.txt');
|
Dimitrios@0
|
20 %}
|
Dimitrios@0
|
21
|
Dimitrios@0
|
22 % If normalised use thresholds: [200:50:900] and let line 53 on
|
Dimitrios@0
|
23 % If unnormalised use thresholds: [0:0.1:2.4] and comment out line 53
|
Dimitrios@0
|
24
|
Dimitrios@0
|
25 %Choose Annotation
|
Dimitrios@0
|
26 Annotators = {'_bdm', '_sid'};
|
Dimitrios@0
|
27 if isequal(outputFile(8:11),Annotators{1})
|
Dimitrios@0
|
28 ANOT_FLAG = 1;
|
Dimitrios@0
|
29 elseif isequal(outputFile(8:11),Annotators{2})
|
Dimitrios@0
|
30 ANOT_FLAG = 2;
|
Dimitrios@0
|
31 else
|
Dimitrios@0
|
32 error('Incorrect outputFile, please see description again.');
|
Dimitrios@0
|
33 end
|
Dimitrios@0
|
34
|
Dimitrios@0
|
35
|
Dimitrios@0
|
36 % Different Combinations
|
Dimitrios@0
|
37 AllnumBases = [ 5 8 10 12 15 20 20]; % Last number(20) corresponds to Dict20individual
|
Dimitrios@0
|
38 AllFiltering = [ 1 3 5 ];
|
Dimitrios@0
|
39 AllThres = [200:50:900];
|
Dimitrios@0
|
40
|
Dimitrios@0
|
41 for i = 1 : length(AllnumBases)
|
Dimitrios@0
|
42 % Initialize
|
Dimitrios@0
|
43 if (i == length(AllnumBases))
|
Dimitrios@0
|
44 loadfile = ['Dictionaries' Annotators{ANOT_FLAG} '/Dict20individual' '.mat'];
|
Dimitrios@0
|
45 else
|
Dimitrios@0
|
46 loadfile = ['Dictionaries' Annotators{ANOT_FLAG} '/Dict' num2str(AllnumBases(i)) '.mat'];
|
Dimitrios@0
|
47 end
|
Dimitrios@0
|
48 load(loadfile);
|
Dimitrios@0
|
49 Classes = {'alert','clearthroat','cough','doorslam','drawer','keyboard','keyes',...
|
Dimitrios@0
|
50 'knock','laughter','mouse','pageturn','pendrop','phone','printer',...
|
Dimitrios@0
|
51 'speech','switch'};
|
Dimitrios@0
|
52
|
Dimitrios@0
|
53
|
Dimitrios@0
|
54 % Read the audio for the Event, making sure no overflow occurs
|
Dimitrios@0
|
55 [x,fs] = wavread(inputFile);
|
Dimitrios@0
|
56
|
Dimitrios@0
|
57
|
Dimitrios@0
|
58 % Normalize wav files
|
Dimitrios@0
|
59 xnow = sum(x,2)/2;
|
Dimitrios@0
|
60 % If choosing not to normalize, the thershold parameter above has to be
|
Dimitrios@0
|
61 % adjusted: i.e. [0:0.1:2.2];
|
Dimitrios@0
|
62 xnow = xnow./std(xnow);
|
Dimitrios@0
|
63
|
Dimitrios@0
|
64
|
Dimitrios@0
|
65 % Calculate CQT
|
Dimitrios@0
|
66 [intCQT] = computeCQT(xnow);
|
Dimitrios@0
|
67 cqt_rep = intCQT(:,round(1:7.1128:size(intCQT,2)));
|
Dimitrios@0
|
68
|
Dimitrios@0
|
69
|
Dimitrios@0
|
70 % Perform NMF
|
Dimitrios@0
|
71 [W,H,errs,vout] = nmf_beta(cqt_rep,size(Dict,2),'beta',1,'W',Dict,'W0',Dict);
|
Dimitrios@0
|
72
|
Dimitrios@0
|
73
|
Dimitrios@0
|
74 % Reshape H
|
Dimitrios@0
|
75 Hnew = reshape(H,AllnumBases(i),16,size(H,2));
|
Dimitrios@0
|
76 Hnew2 = squeeze(sum(Hnew,1));
|
Dimitrios@0
|
77
|
Dimitrios@0
|
78 for j = 1 : length(AllThres)
|
Dimitrios@0
|
79 for k = 1 : length(AllFiltering)
|
Dimitrios@0
|
80 % Perform thresolding on Hnew2
|
Dimitrios@0
|
81 thr = AllThres(j);
|
Dimitrios@0
|
82 Hnew2 = medfilt1(Hnew2',AllFiltering(k))';
|
Dimitrios@0
|
83 eventRoll = double(Hnew2 > thr);
|
Dimitrios@0
|
84
|
Dimitrios@0
|
85
|
Dimitrios@0
|
86 % Create matrix of events (onset-offset-classNum)
|
Dimitrios@0
|
87 auxEventRoll = diff([zeros(1,16); eventRoll'; zeros(1,16);],1); p=0;
|
Dimitrios@0
|
88 nmat=[];
|
Dimitrios@0
|
89 for m=1:16
|
Dimitrios@0
|
90 onsets = find(auxEventRoll(:,m)==1);
|
Dimitrios@0
|
91 offsets = find(auxEventRoll(:,m)==-1);
|
Dimitrios@0
|
92 for n=1:length(onsets)
|
Dimitrios@0
|
93 if((offsets(n)/100-0.01) - (onsets(n)/100) > 0.05) % not output really short events
|
Dimitrios@0
|
94 p=p+1;
|
Dimitrios@0
|
95 nmat(p,1) = onsets(n)/100;
|
Dimitrios@0
|
96 nmat(p,2) = offsets(n)/100-0.01;
|
Dimitrios@0
|
97 nmat(p,3) = m;
|
Dimitrios@0
|
98 end;
|
Dimitrios@0
|
99 end;
|
Dimitrios@0
|
100 end;
|
Dimitrios@0
|
101 nmat = sortrows(nmat,1);
|
Dimitrios@0
|
102
|
Dimitrios@0
|
103
|
Dimitrios@0
|
104 % Print output
|
Dimitrios@0
|
105 if (i == length(AllnumBases))
|
Dimitrios@0
|
106 outputFileName = [outputFile(1:end-4) '_Bases_' num2str(AllnumBases(i)) ...
|
Dimitrios@0
|
107 'individual_thres_' num2str(AllThres(j)) '_filt_' num2str(AllFiltering(k)) '.txt'];
|
Dimitrios@0
|
108 else
|
Dimitrios@0
|
109 outputFileName = [outputFile(1:end-4) '_Bases_' num2str(AllnumBases(i)) ...
|
Dimitrios@0
|
110 '_thres_' num2str(AllThres(j)) '_filt_' num2str(AllFiltering(k)) '.txt'];
|
Dimitrios@0
|
111 end
|
Dimitrios@0
|
112 fid=fopen(outputFileName,'w');
|
Dimitrios@0
|
113 for m=1:size(nmat,1)
|
Dimitrios@0
|
114 fprintf(fid,'%.2f\t%.2f\t%s\n',nmat(m,1),nmat(m,2),Classes{nmat(m,3)});
|
Dimitrios@0
|
115 end;
|
Dimitrios@0
|
116 fclose(fid);
|
Dimitrios@0
|
117
|
Dimitrios@0
|
118 end
|
Dimitrios@0
|
119 end
|
Dimitrios@0
|
120
|
Dimitrios@0
|
121 end
|
Dimitrios@0
|
122
|