ref: 397265f5791291defa76487c2388e1898e2e433c
dir: /src/cg/cst_spamf0.c/
/*************************************************************************/ /* */ /* Language Technologies Institute */ /* Carnegie Mellon University */ /* Copyright (c) 2011 */ /* All Rights Reserved. */ /* */ /* Permission is hereby granted, free of charge, to use and distribute */ /* this software and its documentation without restriction, including */ /* without limitation the rights to use, copy, modify, merge, publish, */ /* distribute, sublicense, and/or sell copies of this work, and to */ /* permit persons to whom this work is furnished to do so, subject to */ /* the following conditions: */ /* 1. The code must retain the above copyright notice, this list of */ /* conditions and the following disclaimer. */ /* 2. Any modifications must be clearly marked as such. */ /* 3. Original authors' names are not deleted. */ /* 4. The authors' names are not used to endorse or promote products */ /* derived from this software without specific prior written */ /* permission. */ /* */ /* CARNEGIE MELLON UNIVERSITY AND THE CONTRIBUTORS TO THIS WORK */ /* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */ /* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */ /* SHALL CARNEGIE MELLON UNIVERSITY NOR THE CONTRIBUTORS BE LIABLE */ /* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */ /* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */ /* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */ /* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */ /* THIS SOFTWARE. */ /* */ /*************************************************************************/ /* Authors: Gopala Anumanchipalli (gopalakr@cs.cmu.edu) */ /* Date: November 2011 */ /*************************************************************************/ #include "cst_cg.h" #include "cst_hrg.h" #include "cst_utt_utils.h" #include "cst_spamf0.h" #include "cst_math.h" static void cst_synthtilt(const cst_cg_db *cg_db, const float start, const float peak, const float tiltamp, const float tiltdur, const float tilttilt, cst_track *ftrack); cst_utterance *cst_spamf0(cst_utterance *utt) { cst_track *spamf0_track=NULL; cst_track *param_track=NULL; cst_item *s; cst_cg_db *cg_db; const cst_cart *acc_tree, *phrase_tree; float end,f0val, syldur; int num_frames,f,i; cg_db = val_cg_db(utt_feat_val(utt,"cg_db")); spamf0_track=new_track(); cst_track_resize(spamf0_track, (utt_feat_int(utt,"param_track_num_frames")), 1); acc_tree = cg_db->spamf0_accent_tree; phrase_tree = cg_db->spamf0_phrase_tree; end = 0.0; num_frames = 0; for (s = utt_rel_head(utt,"Segment"); s; s=item_next(s)) { end = ffeature_float(s,"end"); if(cst_streq("pau",ffeature_string(s,"name"))) { f0val=0; } else { f0val=val_float(cart_interpret(s,phrase_tree)); } for ( ; ((num_frames * cg_db->frame_advance) <= end) && (num_frames < utt_feat_int(utt,"param_track_num_frames")); num_frames++) { spamf0_track->frames[num_frames][0]=f0val; } } for (s=utt_rel_head(utt,"Syllable"); s; s=item_next(s)) { f = val_int(cart_interpret(s,acc_tree)); syldur = ffeature_float(s,"R:SylStructure.daughtern.R:Segment.end") - ffeature_float(s,"R:SylStructure.daughter1.R:Segment.p.end"); cst_synthtilt(cg_db, ffeature_float(s,"R:SylStructure.daughter1.R:Segment.p.end"), cg_db->spamf0_accent_vectors[f][0], cg_db->spamf0_accent_vectors[f][2], syldur, cg_db->spamf0_accent_vectors[f][6], spamf0_track); } param_track = val_track(utt_feat_val(utt,"param_track")); for (i=0;i<utt_feat_int(utt,"param_track_num_frames");i++) { param_track->frames[i][0]=spamf0_track->frames[i][0]; } delete_track(spamf0_track); return utt; } static void cst_synthtilt(const cst_cg_db *cg_db, const float start, const float peak, const float tiltamp, const float tiltdur, const float tilttilt, cst_track *ftrack) { float arise,afall,drise,dfall,i; int num_frames; arise= tiltamp*(1+tilttilt)/2; afall= tiltamp*(1-tilttilt)/2; drise= tiltdur*(1+tilttilt)/2; dfall= tiltdur*(1-tilttilt)/2; num_frames=(int)ceil((double)(start/cg_db->frame_advance)); /* Synthesizing the rise event */ for (i=cg_db->frame_advance;((num_frames * cg_db->frame_advance)<(start+(drise/2))) ; num_frames++,i+=cg_db->frame_advance) { ftrack->frames[num_frames][0]+= peak - arise + (2 * arise * (i/drise) * (i/drise)); ftrack->frames[num_frames][0]=exp(ftrack->frames[num_frames][0]); } for (;((num_frames * cg_db->frame_advance)<(start+drise)) ; num_frames++,i+=cg_db->frame_advance) { ftrack->frames[num_frames][0]+= peak - 2 * arise * (1- (i/drise)) * (1- (i/drise)); ftrack->frames[num_frames][0]=exp(ftrack->frames[num_frames][0]); } /* Synthesizing the fall event */ for (i=cg_db->frame_advance;((num_frames * cg_db->frame_advance)<(start+drise+(dfall/2))) ; num_frames++,i+=cg_db->frame_advance) { ftrack->frames[num_frames][0]+= peak + afall - (2 * afall * (i/dfall) * (i/dfall)) - afall; ftrack->frames[num_frames][0]=exp(ftrack->frames[num_frames][0]); } for (;((num_frames * cg_db->frame_advance)<(start+drise+dfall)) ; num_frames++,i+=cg_db->frame_advance) { ftrack->frames[num_frames][0]+= peak + (2 * afall * (1- (i/dfall)) * (1- (i/dfall))) - afall; ftrack->frames[num_frames][0]=exp(ftrack->frames[num_frames][0]); } return ; }