⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vc1.m

📁 这是一个用于语音信号处理的工具箱
💻 M
📖 第 1 页 / 共 2 页
字号:
% Script: vc1.m is an m-file to execute the voice conversion algorithm which
%         matches the speaking rate to the target speaker.
%
%         vc1 is a call function evoked by vcapp.m on figure(vwin_f)

%---------------------------------------------------
% time-align speech1 to match to the pace of speech2
%---------------------------------------------------

disp('Align the source parameter in time axis...')

[dum,tM2]=size(road);

% 1.1 calculate pitch period (pp1) of each frame for speech1
[M1,dum]=size(cofa1);
pp1=zeros(1,M1);
for k=1:length(vcidx11)
   s_fram=vcidx11(k);
   e_fram=vcidx12(k);
   for kf=s_fram:e_fram
      spoint=(kf-1)*m_len+1;
      epoint=spoint+2*m_len+Order;
      pitchs=diff( gci1( gci1>spoint & gci1<epoint ) );
      if isempty(pitchs)
         pp1(kf)=pp1(kf-1);
      else
         pp1(kf)=mean(pitchs);
      end
   end 
end

% 1.2 calculate pitch period (pp2) of each frame for speech2
[M2,dum]=size(cofa2);
pp2=zeros(1,M2);
for k=1:length(vcidx21)
   s_fram=vcidx21(k);
   e_fram=vcidx22(k);
   for kf=s_fram:e_fram
      spoint=(kf-1)*m_len+1;
      epoint=spoint+2*m_len+Order;
      pitchs=diff( gci2(gci2>spoint & gci2<epoint ) );
      if isempty(pitchs)
         pp2(kf)=pp2(kf-1);
      else
         pp2(kf)=mean(pitchs);
      end
   end 
end
clear pitchs;

% 1.3 collect the pitch period data ****
pp1_ref=pp1( road(2,:) );
pp2_ref=pp2( road(1,:) );

% 1.4 collect the ngm data ****
tM2=length(road(1,:));
tmp=ngm1(road(2,:), : );
tmp1=tmp(1:4*tM2);
ngm1_ref(1)=mean( tmp1(1:4) );
for kf=2:tM2-1
   ngm1_ref(kf)=mean( tmp1( kf*4-4 : kf*4+1 ) );
end
ngm1_ref(tM2)=mean( tmp1(4*tM2-3:4*tM2) );

tmp=ngm2(road(1,:), : );
tmp2=tmp(1:4*tM2);
ngm2_ref(1)=mean( tmp2(1:4) );
for kf=2:tM2-1
   ngm2_ref(kf)=mean( tmp2( kf*4-4 : kf*4+1 ) );
end
ngm2_ref(tM2)=mean( tmp2(4*tM2-3:4*tM2) );

clear tmp tmp1 tmp2;

% 1.5 collect the gpcf1 data ****
gpcf1_ref=gpcf1( road(2,:),: );
gpcf2_ref=gpcf2( road(1,:),: );

% 1.6 collect the FF1 data ****
if vt==2
   FF1_ref=FF1( road(2,:), :);
   FF2_ref=FF2( road(1,:), :);
end

%-----------------------------------------------------------------------%
% Voice Conversion Algorithm                                            %
%       method=1  bias model                                            %
%       method=2  linear model                                          %
%       method=3  just copy the value from target                       %
%       method=4  do not modify the value of the source but time-align  %
%-----------------------------------------------------------------------%

% the following acoustic features (parameters) are created
%    vctyp3  = voicetype classifications
%    gci3    = gci index
%    cofa3   = LP coeffiecints
%    gm3     = voiced gain contour
%    gpcf3   = glottal pulse shape
%    nidx3   = stochastic codebook index
%    ngm3    = whole gain index
%    FF3     = formant frequency
%    FB3     = formant bandwidth

%--------------------------------------------------------
%************ copy vctyp3, cofa3 and nidx3 **************
vctyp3=vctyp2;
cofa3=cofa2;
nidx3=nidx2;

%---------------------------------------------------------
%************** convert gci1 to match gci2  **************

% find the starting and ending GCI points for the target speech
for k=1:length(vcidx21)
   spoint=(vcidx21(k)-1)*m_len-m_len/4;
   [dum,idx]=min( abs(gci2-spoint) );
   gci_s(k)=gci2(idx);      % starting GCI point
   epoint=(vcidx22(k)-1)*m_len+5*m_len/4;
   [dum,idx]=min( abs(gci2-epoint) );
   gci_e(k)=gci2(idx);      % ending GCI point
end

gci3=[];
gci_method=get(v_pp_pit,'Value');
x_ref=road(1,:);

if gci_method==1
   out=lrest(pp1_ref, pp2_ref, 0, SHOW);
   b=out(1);
   pp3_ref=pp1_ref+b;
   
   kk=0;
   for k=1:length(vcidx21)
      s_fram=vcidx21(k);
      e_fram=vcidx22(k);
      
      spoint=gci_s(k);
      
      for kf=s_fram:e_fram
         kk=kk+1;
         epoint=kf*m_len+2*Order+1;
         if kf==e_fram
            epoint=gci_e(k);
         end
         p00=pp3_ref( kk );
         gci_insert=gci_dis(p00,0,spoint,epoint);
         gci3=[gci3 gci_insert];
         o_spoint=spoint;
         spoint=max(gci_insert);
         if isempty(spoint)
            spoint=o_spoint;
         end
      end
      clear s_fram e_fram
   end
   disp('The bias model is used to convert pitch contour.');
   disp(b);
   disp('Normalized Standard Deviation=');
   disp(out(3)/mean(pp2_ref));
   
elseif gci_method==2
   out=lrest(pp1_ref,pp2_ref,1,SHOW);
   a=out(2);
   b=out(1);
   pp3_ref=a*pp1_ref+b;
   
   kk=0;
   for k=1:length(vcidx21)
      s_fram=vcidx21(k);
      e_fram=vcidx22(k);
      spoint=gci_s(k);
      
      for kf=s_fram:e_fram
         kk=kk+1;
         epoint=kf*m_len+2*Order+1;
         if ( kf==e_fram )
            epoint=gci_e(k);
         end
         p00=pp3_ref(kk);
         gci_insert=gci_dis(p00,0,spoint,epoint);
         gci3=[gci3 gci_insert];
         o_spoint=spoint;
         spoint=max(gci_insert);
         if isempty(spoint)
            spoint=o_spoint;
         end
      end
   end
   
   disp('The linear model is used to convert pitch contour.');
   disp([a b]);
   disp('Normalized Standard Deviation=');
   disp(out(3)/mean(pp2_ref));
   
elseif gci_method==3
   gci3=gci2;
   pp3_ref=pp2_ref;
   
elseif gci_method==4
   
   pp3_ref=pp1_ref;
   kk=0;
   for k=1:length(vcidx21)
      s_fram=vcidx21(k);
      e_fram=vcidx22(k);
      spoint=gci_s(k);
      
      for kf=s_fram:e_fram
         kk=kk+1;
         epoint=kf*m_len+2*Order;
         if kf==e_fram
            epoint=gci_e(k);
         end
         
         p00=pp3_ref( kk );
         gci_insert=gci_dis(p00,0,spoint,epoint);
         gci3=[gci3 gci_insert];
         o_spoint=spoint;
         spoint=max(gci_insert);
         if isempty(spoint)
            spoint=o_spoint;
         end
      end 
   end
   
end

if SHOW==1
   figure(dtwdisplay_f);
   plot(x_ref,pp1_ref,'y',x_ref,pp3_ref,'r',x_ref,pp2_ref,'g');
   title('pitch conversion (source: yellow ; converted: red ; target:green)');
   pause(1);
end

clear gci_insert p00 pp1 pp2 pp1_ref pp2_ref pp3_ref tmp;

%---------------------------------------------------
%************ convert ngm1 to match ngm2  **********

ngm3=ngm2;
ngm_method=get(v_pp_gai,'Value');

if ngm_method==1
   out=lrest(ngm1_ref, ngm2_ref, 0, SHOW)
   b=out(1);
   ngm3_ref=abs(ngm1_ref+b);
   
   x_ref=road(1,:);
   tM2=length(x_ref);
   tmp_gm=zeros(tM2,4);
   
   % ---interpolate ngm3---
   s_fram=1;
   for k=1:length(vcidx21);
      e_fram=s_fram+vcidx22(k)-vcidx21(k);
      
      % smoothing the starting frame
      kf=s_fram;
      gm_x=[1 m_len/2 m_len+m_len];
      %When using segmentation we don't want to start the gain contour of the segment at 0
      if ~exist('seg','var')
         ngm3_ref(kf)=0.13*ngm3_ref(kf+1);
         gm_y=[0 ngm3_ref(kf) ngm3_ref(kf+1)];
      else 
         gm_y=[ngm3_ref(kf) ngm3_ref(kf) ngm3_ref(kf+1)];
      end
      gm_z=m_len/4*[0 1 2 3]+m_len/8;
      tmp=interp1(gm_x,gm_y,gm_z,'spline');
      tmp_gm(kf,1:4)=tmp(:)';
      
      for kf=s_fram+1:e_fram-1
         gm_x=[-1*m_len/2 m_len/2 m_len+m_len];
         gm_y=[ngm3_ref(kf-1) ngm3_ref(kf) ngm3_ref(kf+1)];
         gm_z=m_len/4*[0 1 2 3]+m_len/8;
         tmp=interp1(gm_x,gm_y,gm_z);
         tmp_gm(kf,1:4)=tmp(:)';
      end
      
      % smoothing the ending frame
      kf=e_fram;
      gm_x=[-1*m_len/2 m_len/2 m_len];
      %When using segmentation we don't want to end the gain contour of the segment at 0
      if ~exist('seg','var')
         ngm3_ref(kf)=0.13*ngm3_ref(kf-1);
         gm_y=[ngm3_ref(kf-1) ngm3_ref(kf) 0];
      else 
         gm_y=[ngm3_ref(kf-1) ngm3_ref(kf) ngm3_ref(kf)];
      end
      gm_z=m_len/4*[0 1 2 3]+m_len/8;
      tmp=interp1(gm_x,gm_y,gm_z,'spline');
      tmp_gm(kf,1:4)=tmp(:)';
      
      s_fram=e_fram+1;
   end  %% for k=1:length(vcidx21)
   
   ngm3( x_ref,1:4)=tmp_gm;
   
   disp('The bias model is used to convert the gain contour.');
   disp(b);
   disp('Normalized Standard Deviation=');
   disp(out(3)/mean(ngm2_ref));

elseif ngm_method==2
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -