fun_nm1.m
来自「这是一个用于语音信号处理的工具箱」· M 代码 · 共 476 行
M
476 行
%function func_newmap1(name)
disp(' ');
disp('FUNCTION: func_newmap1.m *********************************');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% jmw
%
% 6/27/94
%
% 5/02/94 4/06/94
%
% segment duration calculation program development
%
% this version also allows time expansion as well as time compression
%
% it also checks calculated duration with the specified
% MINIMUM duration and adjusts if too short. MD file is
% LOADED from disk ...
%
% This version uses the previously calculated and saved indx
% vector to decide which frames live and which frames die ...
%
% modified by D. G. Childers 2/16/98
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
file_string=sprintf('./temp/%s_Data.mat',name);
s=sprintf('loading %s',file_string);
disp(s);
s=sprintf('load %s',file_string);
eval(s);
file_string = sprintf('./temp/%s.mat', name);
s=sprintf('loading ./%s from hard disk ...',file_string);
disp(s);
s=sprintf('load %s', file_string);
eval(s);
signal = eval(name);
file_string=sprintf('./temp/%s_SegNLabels.mat',name);
s=sprintf('loading %s',file_string);
disp(s);
s=sprintf('load %s',file_string);
eval(s);
file_string=sprintf('./temp/%s_SF.mat',name);
s=sprintf('loading %s',file_string);
disp(s);
s=sprintf('load %s',file_string);
eval(s);
% load minimum durations
file_string=sprintf('./temp/%s_MD.mat',name);
s=sprintf('loading %s',file_string);
disp(s);
s=sprintf('load %s',file_string);
eval(s);
% load manual override flags and scale factors
file_string=sprintf('./temp/%s_MSF.mat',name);
s=sprintf('loading %s',file_string);
disp(s);
s=sprintf('load %s',file_string);
eval(s);
% load MASTERMAP
file_string=sprintf('./temp/%s_Maps.mat',name);
s=sprintf('loading %s',file_string);
disp(s);
s=sprintf('load %s',file_string);
eval(s);
disp(' ');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% initialize
initial_dur = zeros(1,seg_cnt); % starting segment durations
Excite = []; % indexes of frames that will be kept
ranking = zeros(1,length(VUS_voicetype));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% record entire first & last silent (non-word) Excitations
initial_dur(seg_cnt) = (seg_range(seg_cnt,2)-seg_range(seg_cnt,1)+1);
Excite = [Excite [seg_frame(1,1):1:seg_frame(1,2)] ];
Excite = [Excite [seg_frame(seg_cnt,1):1:seg_frame(seg_cnt,2)] ];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% data to be recorded for later use - results of mapping process
% also initialize values for first (silent) segment
map_seg_choice = [];
map_seg_choice(1,:) = choice_1(1,:); % record first (silent) segment
map_seg_dur = [];
map_seg_dur(1) = (seg_range(1,2)-seg_range(1,1)+1);
% record first (silent) segment
map_seg_range = [];
map_seg_range(1,:) = seg_range(1,:); % record first (silent) segment
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% display titles for console display
s1=sprintf('seg #');
s1a=sprintf('\tsegment');
s2=sprintf('\t initial');
s3=sprintf(' min ');
s4=sprintf(' final');
s5=sprintf(' spec''d');
s6=sprintf(' actual');
s7=sprintf('\tapplied');
s8=sprintf('\t manual ');
disp([s1 s1a s2 s3 s4 s5 s6 s7 s8]);
s11a=sprintf('\ttype');
s12=sprintf('\t dur');
s13=sprintf('\t dur');
s14=sprintf('\t dur');
s15=sprintf('\t sf');
s16=sprintf('\t sf');
s17=sprintf('\trules');
s18=sprintf('\t override ?');
disp([s11a s12 s13 s14 s15 s16 s17 s18]);
disp(' ');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% do word segments
map_seg_cnt = 1; % counter of _output_ segments
for i = 2:seg_cnt-1, % ignore first and last (silent) segments
dur(i) = (seg_range(i,2)-seg_range(i,1)+1);
initial_dur(i) = dur(i);
ndur(i) = dur(i);
% scale durations accordingly (if appropriate)
md_flag_1 = []; % flag to indicate min. duration violation before mods
md_flag_2 = []; % flag to indicate min. duration violation after mods
if (man_override_flag(i) == 0)
if (strcmp(choice_1(i,:),' silent'))
md(i) = sil_md;
sf(i) = sil_sf;
elseif (strcmp(choice_1(i,:),' nasal'))
md(i) = nas_md;
sf(i) = nas_sf;
elseif (strcmp(choice_1(i,:),' vowel'))
md(i) = vwl_md;
sf(i) = vwl_sf;
elseif (strcmp(choice_1(i,:),' unv stop'))
md(i) = ust_md;
sf(i) = ust_sf;
elseif (strcmp(choice_1(i,:),' unv fric'))
md(i) = ufr_md;
sf(i) = ufr_sf;
elseif (strcmp(choice_1(i,:),' voicfric'))
md(i) = vfr_md;
sf(i) = vfr_sf;
elseif (strcmp(choice_1(i,:),' voicebar'))
md(i) = bar_md;
sf(i) = bar_sf;
elseif (strcmp(choice_1(i,:),'semivowel'))
md(i) = smv_md;
sf(i) = smv_sf;
end;
elseif (man_override_flag(i) == 1)
sf(i) = man_sf(i);
if (strcmp(choice_1(i,:),' silent'))
md(i) = sil_md;
elseif (strcmp(choice_1(i,:),' nasal'))
md(i) = nas_md;
elseif (strcmp(choice_1(i,:),' vowel'))
md(i) = vwl_md;
elseif (strcmp(choice_1(i,:),' unv stop'))
md(i) = ust_md;
elseif (strcmp(choice_1(i,:),' unv fric'))
md(i) = ufr_md;
elseif (strcmp(choice_1(i,:),' voicfric'))
md(i) = vfr_md;
elseif (strcmp(choice_1(i,:),' voicebar'))
md(i) = bar_md;
elseif (strcmp(choice_1(i,:),'semivowel'))
md(i) = smv_md;
end;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% process each segment
if (initial_dur(i) > md(i))
ndur(i) = dur(i) * sf(i);
if (ndur(i) < md(i))
md_flag_2 = 1;
ndur(i) = md(i);
end;
else
md_flag_1 = 1;
ndur(i) = dur(i) * sf(i);
if (ndur(i) < md(i))
ndur(i) = initial_dur(i);
end;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dur(i) = round(ndur(i)); % round to nearest sample number
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% calculate/read/sort index vector (instead of using outside function)
[r,indx]=sort(MASTERMAP(seg_frame(i,1):seg_frame(i,2)));
indx=indx + seg_frame(i,1) - 1;
%disp([indx' r']);
% save ranking for later display
for k=1:length(indx),
ranking(indx(k)) = r(k);
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% if frames are to be CUT do this part only
if (dur(i) <= initial_dur(i) )
reqd_cut = initial_dur(i) - dur(i); % number of samples that are
% required to be cut
total_cut = 0; % counter to keep track of
% number of samples cut
done = 0; % flag
while (~done)
% temp count
new_cut = range(indx(1),2) - range(indx(1),1) + 1;
if ( (total_cut + new_cut) < reqd_cut)
total_cut = total_cut + new_cut;
N = length(indx);
indx = indx(2:N); % remove first frame of
% list
done = 0;
elseif ( (total_cut + new_cut) == reqd_cut)
total_cut = total_cut + new_cut;
N = length(indx);
indx = indx(2:N);
done = 1;
elseif ( (total_cut + new_cut) > reqd_cut)
d1 = abs(total_cut - reqd_cut);
d2 = abs(total_cut+new_cut - reqd_cut);
if (d1 <= d2)
done = 1;
else
total_cut = total_cut + new_cut;
N = length(indx);
indx = indx(2:N);
done = 1;
end;
end;
end;
Excite = sort([Excite indx]); % update Excitation record
total_mod = (-1 * total_cut);
end; % end CUT routine
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% if frames are to be ADDED do this part only
if (dur(i) > initial_dur(i) )
% reverse order of indx (put highest scores first)
indx = rev_1a(indx);
reqd_add = dur(i)-initial_dur(i); % number of samples that are
% required to be added
total_add = 0; % counter to keep track of
% number of samples added
done = 0; % flag
indx_cnt = 0;
while (~done)
% temp count
indx_cnt = indx_cnt + 1;
new_add= range(indx(indx_cnt),2)-range(indx(indx_cnt),1)+1;
if ( (total_add + new_add) < reqd_add)
total_add = total_add + new_add;
indx = [indx indx(indx_cnt)];
done = 0;
elseif ( (total_add + new_add) == reqd_add)
total_add = total_add + new_add;
indx = [indx indx(indx_cnt)];
done = 1;
elseif ( (total_add + new_add) > reqd_add)
d1 = abs(total_add - reqd_add);
d2 = abs(total_add+new_add - reqd_add);
if (d1 <= d2)
done = 1;
else
total_add = total_add + new_add;
indx = [indx indx(indx_cnt)];
done = 1;
end;
end;
end;
Excite = sort([Excite indx]); % update Excitation record
total_mod = total_add;
end; % end ADD routine
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% display results for either add or cut
s1=sprintf('%2d',i);
s2=sprintf(' %s',choice_1(i,:));
s3=sprintf('\t%7d',initial_dur(i));
s4=sprintf('\t%7d',md(i));
%s5=sprintf('\t%7d',dur(i));
s5=sprintf('\t%7d',initial_dur(i) + total_mod);
s6=sprintf('\t %4.2f ',sf(i));
s7=sprintf(' %4.2f', (initial_dur(i) +total_mod)/(initial_dur(i)));
s8 = []; s9 = []; s10 = [];
if (~isempty(md_flag_1))
s8 = sprintf('\t1');
else
s8 = sprintf('\t');
end;
if (~isempty(md_flag_2))
s9 = sprintf(' 2');
end;
if (man_override_flag(i) == 1)
s10=sprintf('\t yes');
else
s10=sprintf('\t no');
end;
serror= [s8 s9 s10];
disp([s1 s2 s3 s4 s5 s6 s7 serror]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% compute mapped parameters for recording (for either add or cut)
if (isempty(indx))
% segment was completely removed - skip it
;
else
map_seg_cnt = map_seg_cnt + 1;
map_seg_choice(map_seg_cnt,:)=choice_1(i,:);
map_seg_dur(map_seg_cnt) = initial_dur(i)+total_mod;
d=map_seg_dur(map_seg_cnt)-1;
map_seg_range(map_seg_cnt,1) = map_seg_range(map_seg_cnt-1,2)+1;
map_seg_range(map_seg_cnt,2) = map_seg_range(map_seg_cnt,1)+d;
end;
end; % end loop for each input segment
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% enter last segment's values in mapping data to be saved
map_seg_cnt = map_seg_cnt + 1;
map_seg_choice(map_seg_cnt,:)=choice_1(seg_cnt,:);
map_seg_dur(map_seg_cnt) = initial_dur(seg_cnt);
map_seg_dur = map_seg_dur';
map_seg_range(map_seg_cnt,1) = map_seg_range(map_seg_cnt-1,2)+1;
d=map_seg_dur(map_seg_cnt)-1;
map_seg_range(map_seg_cnt,2) = map_seg_range(map_seg_cnt,1)+d;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% save results
disp(' ');
s=sprintf('saving ./%s_Excite.mat to hard disk ...', name);
disp(s);
s=sprintf('save temp/%s_Excite Excite ', name);
eval(s);
s=sprintf('saving ./%s_MapData.mat to hard disk ...', name);
disp(s);
s1=sprintf('map_seg_dur map_seg_choice map_seg_range map_seg_cnt');
s2=sprintf('save temp/%s_MapData s1', name);
eval(s2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% create message window and write message in that window also
message_window=figure('Unit','normalized',...
'Position',[0.05 0.2 0.9 0.2],...
'Resize','off',...
'Color',BACK_COLOR,...
'Numbertitle','off',...
'Name','Message');
axis('off');
ss=sprintf('The Map calculations are finished. Press Synthesis.');
text(-0.05,1,ss,'color',[0 0 1],'FontSize',10);
pause(3.);
close(message_window);
clear message_window;
%%%%%%%%%%%%%%%%%%%%%%%%%
%return;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% clean up time
clear N i sil_sf
clear bar_sf initial_dur smv_sf
clear choice_1 total_cut
clear choice_2 nas_sf ufr_sf
clear d1 new_cut ust_sf
clear d2 reliability_1 vfr_sf
clear done reliability_2 vwl_sf
clear dur reqd_cut
clear Excite num_frames seg_cnt
clear VUS_voicetype power %seg_frame
clear cofa r seg_range
clear file_string range seg_type
clear indx residue voicetype
clear s3 s s1
clear s2
clear map_seg_choice map_seg_dur seg_frame
clear map_seg_cnt
clear d map_seg_range
clear indx_cnt new_add reqd_add total_add
clear bar_md sil_md ufr_md vfr_md
clear md_flag_2 nas_md smv_md ust_md vwl_md ndur
clear s12 s13 s14 s15 s16 s17 s1a s4 s5 s6 s7 s8 s9 serror sf md md_flag_1
clear s11a total_mod
clear a h k ranking
clear s10 s18 man_sf man_override_flag MASTERMAP
s=sprintf('clear %s', name);
eval(s);
clear s
%clear a h k ranking signal
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?