| /*************************************************************************/ |
| /* */ |
| /* 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; |
| } |
| |
| 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 ; |
| } |