| File: | modules/UniSyn/UniSyn.cc |
| Location: | line 196, column 5 |
| Description: | Value stored to 'a' is never read |
| 1 | /*************************************************************************/ |
| 2 | /* */ |
| 3 | /* Centre for Speech Technology Research */ |
| 4 | /* University of Edinburgh, UK */ |
| 5 | /* Copyright (c) 1996,1997 */ |
| 6 | /* All Rights Reserved. */ |
| 7 | /* */ |
| 8 | /* Permission is hereby granted, free of charge, to use and distribute */ |
| 9 | /* this software and its documentation without restriction, including */ |
| 10 | /* without limitation the rights to use, copy, modify, merge, publish, */ |
| 11 | /* distribute, sublicense, and/or sell copies of this work, and to */ |
| 12 | /* permit persons to whom this work is furnished to do so, subject to */ |
| 13 | /* the following conditions: */ |
| 14 | /* 1. The code must retain the above copyright notice, this list of */ |
| 15 | /* conditions and the following disclaimer. */ |
| 16 | /* 2. Any modifications must be clearly marked as such. */ |
| 17 | /* 3. Original authors' names are not deleted. */ |
| 18 | /* 4. The authors' names are not used to endorse or promote products */ |
| 19 | /* derived from this software without specific prior written */ |
| 20 | /* permission. */ |
| 21 | /* */ |
| 22 | /* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */ |
| 23 | /* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */ |
| 24 | /* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */ |
| 25 | /* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */ |
| 26 | /* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */ |
| 27 | /* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */ |
| 28 | /* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */ |
| 29 | /* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */ |
| 30 | /* THIS SOFTWARE. */ |
| 31 | /* */ |
| 32 | /*************************************************************************/ |
| 33 | /* */ |
| 34 | /* Author: Paul Taylor */ |
| 35 | /* Date: February 1998 */ |
| 36 | /* --------------------------------------------------------------------- */ |
| 37 | /* Waveform Generation Scheme Interface File */ |
| 38 | /* */ |
| 39 | /*************************************************************************/ |
| 40 | #include "siod.h" |
| 41 | #include "EST.h" |
| 42 | #include "UniSyn.h" |
| 43 | #include "us_synthesis.h" |
| 44 | #include "Phone.h" |
| 45 | |
| 46 | VAL_REGISTER_TYPE(ivector,EST_IVector)val_type val_type_ivector="ivector"; EST_IVector *ivector(const EST_Val &v) { if (v.type() == val_type_ivector) return ( EST_IVector *)v.internal_ptr(); else (EST_error_where = __null ), (*EST_error_func)("val not of type val_type_""ivector"); return __null; } static void val_delete_ivector(void *v) { delete ( EST_IVector *)v; } EST_Val est_val(const EST_IVector *v) { return EST_Val(val_type_ivector, (void *)v,val_delete_ivector); } |
| 47 | VAL_REGISTER_TYPE(wavevector,EST_WaveVector)val_type val_type_wavevector="wavevector"; EST_WaveVector *wavevector (const EST_Val &v) { if (v.type() == val_type_wavevector) return (EST_WaveVector *)v.internal_ptr(); else (EST_error_where = __null), (*EST_error_func)("val not of type val_type_""wavevector" ); return __null; } static void val_delete_wavevector(void *v ) { delete (EST_WaveVector *)v; } EST_Val est_val(const EST_WaveVector *v) { return EST_Val(val_type_wavevector, (void *)v,val_delete_wavevector ); }; |
| 48 | |
| 49 | SIOD_REGISTER_TYPE(wavevector, EST_WaveVector)EST_WaveVector *wavevector(LISP x) { return wavevector(val(x) ); } int wavevector_p(LISP x) { if (val_p(x) && (val_type_wavevector == val(x).type())) return (1==1); else return (1==0); } LISP siod(const EST_WaveVector *v) { if (v == 0) return ((struct obj *) 0); else return siod(est_val(v)); }; |
| 50 | |
| 51 | void map_to_relation(EST_IVector &map, EST_Relation &r, |
| 52 | const EST_Track &source_pm, |
| 53 | const EST_Track &target_pm); |
| 54 | |
| 55 | EST_Features *scheme_param(const EST_String& param, const EST_String &path) |
| 56 | { |
| 57 | EST_Features *f, *p; |
| 58 | |
| 59 | f = feats(siod_get_lval(param, "Couldn't find scheme paramete named: " |
| 60 | + param)); |
| 61 | |
| 62 | p = (path == "") ? f : &f->A(path); |
| 63 | return p; |
| 64 | } |
| 65 | |
| 66 | |
| 67 | LISP FT_us_linear_smooth_amplitude( LISP lutt ) |
| 68 | { |
| 69 | EST_Utterance *utt = get_c_utt( lutt )(utterance(lutt)); |
| 70 | |
| 71 | us_linear_smooth_amplitude( utt ); |
| 72 | |
| 73 | return lutt; |
| 74 | } |
| 75 | |
| 76 | |
| 77 | static LISP FT_wavevector_get_wave( LISP l_wavevector, LISP l_framenum ) |
| 78 | { |
| 79 | EST_WaveVector *wv = wavevector( l_wavevector ); |
| 80 | int i = get_c_int( l_framenum ); |
| 81 | |
| 82 | if( i<0 || i>wv->length() ) |
| 83 | EST_error(EST_error_where = __null), (*EST_error_func)( "index out of bounds" ); |
| 84 | |
| 85 | return siod( &((*wv)[i]) ); |
| 86 | } |
| 87 | |
| 88 | |
| 89 | LISP FT_us_unit_concat(LISP lutt) |
| 90 | { |
| 91 | EST_String window_name; |
| 92 | float window_factor; |
| 93 | bool window_symmetric; |
| 94 | |
| 95 | EST_Features *f = scheme_param("Param", "unisyn"); |
| 96 | |
| 97 | window_name = f->S("window_name"); |
| 98 | window_factor = f->F("window_factor"); |
| 99 | |
| 100 | window_symmetric = (f->I("window_symmetric",1) == 0) ? false : true; |
| 101 | |
| 102 | us_unit_concat(*get_c_utt(lutt)(utterance(lutt)), window_factor, window_name, false, window_symmetric); |
| 103 | return lutt; |
| 104 | } |
| 105 | |
| 106 | LISP FT_us_unit_raw_concat(LISP lutt) |
| 107 | { |
| 108 | us_unit_raw_concat(*get_c_utt(lutt)(utterance(lutt))); |
| 109 | return lutt; |
| 110 | } |
| 111 | |
| 112 | |
| 113 | LISP FT_us_energy_normalise(LISP lutt, LISP lrname) |
| 114 | { |
| 115 | EST_Utterance *utt = get_c_utt(lutt)(utterance(lutt)); |
| 116 | EST_String rname = get_c_string(lrname); |
| 117 | |
| 118 | us_energy_normalise(*utt->relation(rname)); |
| 119 | return lutt; |
| 120 | } |
| 121 | |
| 122 | LISP FT_us_generate_wave(LISP lutt, LISP l_f_method, LISP l_o_method) |
| 123 | { |
| 124 | EST_String filter_method = get_c_string(l_f_method); |
| 125 | EST_String ola_method = get_c_string(l_o_method); |
| 126 | EST_Utterance *utt = get_c_utt(lutt)(utterance(lutt)); |
| 127 | |
| 128 | EST_Features *f = scheme_param("Param", "unisyn"); |
| 129 | if(f->I("window_symmetric",1) == 0){ |
| 130 | ola_method = "asymmetric_window"; |
| 131 | } |
| 132 | us_generate_wave(*utt, filter_method, ola_method); |
| 133 | |
| 134 | return lutt; |
| 135 | } |
| 136 | |
| 137 | LISP FT_us_mapping(LISP lutt, LISP method) |
| 138 | { |
| 139 | us_mapping(*get_c_utt(lutt)(utterance(lutt)), get_c_string(method)); |
| 140 | return lutt; |
| 141 | } |
| 142 | |
| 143 | LISP FT_us_get_copy_wave(LISP lutt, LISP l_sig_file, LISP l_pm_file, |
| 144 | LISP l_seg_file) |
| 145 | { |
| 146 | EST_Utterance *utt = get_c_utt(lutt)(utterance(lutt)); |
| 147 | EST_Relation seg; |
| 148 | EST_String sig_file = get_c_string(l_sig_file); |
| 149 | EST_String seg_file = get_c_string(l_seg_file); |
| 150 | EST_String pm_file = get_c_string(l_pm_file); |
| 151 | |
| 152 | EST_Track *pm = new EST_Track; |
| 153 | EST_Wave *sig = new EST_Wave; |
| 154 | |
| 155 | if (pm->load(pm_file) != format_okread_ok) |
| 156 | return NIL((struct obj *) 0); |
| 157 | |
| 158 | if (sig->load(sig_file) != format_okread_ok) |
| 159 | return NIL((struct obj *) 0); |
| 160 | |
| 161 | if (seg.load(seg_file) != format_okread_ok) |
| 162 | return NIL((struct obj *) 0); |
| 163 | |
| 164 | if (!ph_is_silence(seg.tail()->f("name"))) |
| 165 | { |
| 166 | EST_Item *n = seg.tail()->insert_after(); |
| 167 | n->set("name", ph_silence()); |
| 168 | n->set("end", seg.tail()->prev()->F("end") + 0.1); |
| 169 | } |
| 170 | |
| 171 | us_get_copy_wave(*utt, *sig, *pm, seg); |
| 172 | return lutt; |
| 173 | } |
| 174 | |
| 175 | |
| 176 | LISP FT_f0_to_pitchmarks(LISP lutt, LISP l_f0_name, LISP l_pm_name, |
| 177 | LISP l_end_time) |
| 178 | { |
| 179 | EST_Utterance *utt = get_c_utt(lutt)(utterance(lutt)); |
| 180 | int num_channels=0; |
| 181 | const float default_f0 = 100.0; |
| 182 | EST_Relation *f0_rel=0, *pm_rel=0; |
| 183 | EST_Track *f0=0, *pm=0; |
| 184 | EST_Item *a; |
| 185 | |
| 186 | float end_time = (l_end_time == NIL((struct obj *) 0)) ? -1 : get_c_float(l_end_time); |
| 187 | |
| 188 | f0_rel = utt->relation(get_c_string(l_f0_name), 1); |
| 189 | pm_rel = utt->create_relation(get_c_string(l_pm_name)); |
| 190 | |
| 191 | f0 = track(f0_rel->head()->f("f0")); |
| 192 | pm = new EST_Track; |
| 193 | |
| 194 | a = pm_rel->append(); |
| 195 | a->set_val("coefs", est_val(pm)); |
| 196 | a = pm_rel->append(); |
Value stored to 'a' is never read | |
| 197 | |
| 198 | if (utt->relation_present("SourceCoef")) |
| 199 | { |
| 200 | EST_Track *source_coef = |
| 201 | track(utt->relation("SourceCoef")->head()->f("coefs")); |
| 202 | num_channels = source_coef->num_channels(); |
| 203 | } |
| 204 | |
| 205 | f0_to_pitchmarks(*f0, *pm, num_channels, default_f0, end_time); |
| 206 | |
| 207 | return lutt; |
| 208 | } |
| 209 | |
| 210 | LISP FT_map_to_relation(LISP lutt, LISP lsource_name, LISP ltarget_name, |
| 211 | LISP lrel_name) |
| 212 | { |
| 213 | EST_Utterance *utt = get_c_utt(lutt)(utterance(lutt)); |
| 214 | EST_Track *source_pm = 0; |
| 215 | EST_Track *target_pm = 0; |
| 216 | EST_IVector *map = 0; |
| 217 | target_pm = |
| 218 | track(utt->relation(get_c_string(ltarget_name))->head()->f("coefs")); |
| 219 | source_pm = |
| 220 | track(utt->relation(get_c_string(lsource_name))->head()->f("coefs")); |
| 221 | map = ivector(utt->relation("US_map")->head()->f("map")); |
| 222 | |
| 223 | utt->create_relation(get_c_string(lrel_name)); |
| 224 | |
| 225 | map_to_relation(*map, *utt->relation(get_c_string(lrel_name)), |
| 226 | *source_pm, *target_pm); |
| 227 | |
| 228 | return NIL((struct obj *) 0); |
| 229 | } |
| 230 | |
| 231 | void festival_UniSyn_init(void) |
| 232 | { |
| 233 | proclaim_module("UniSyn"); |
| 234 | |
| 235 | register_unisyn_features(); |
| 236 | |
| 237 | init_subr_2( "wavevector.getwave", FT_wavevector_get_wave, |
| 238 | "(wavevector.getwave WAVEVECTOR FRAMENUM)\n\ |
| 239 | retrieves an EST_Wave frame (int FRAMENUM) from a wavevector."); |
| 240 | |
| 241 | init_subr_1("us_linear_smooth_amplitude", FT_us_linear_smooth_amplitude, |
| 242 | "(us_linear_smooth_amplitude UTT)\n\ |
| 243 | Perform linear amplitute smoothing on diphone joins."); |
| 244 | |
| 245 | init_subr_1("us_unit_raw_concat", FT_us_unit_raw_concat, |
| 246 | "(us_init_raw_concat UTT)."); |
| 247 | |
| 248 | init_subr_2("us_energy_normalise", FT_us_energy_normalise, |
| 249 | "(us_ps_synthesis UTT SIGPR)\n\ |
| 250 | Synthesize utterance UTT using signal processing technique SIGPR \n\ |
| 251 | for the UniSyn pitch-synchronous synthesizer."); |
| 252 | |
| 253 | init_subr_3("us_generate_wave", FT_us_generate_wave, |
| 254 | "(us_td_synthesis UTT FILTER_METHOD OLA_METHOD)\n\ |
| 255 | Synthesize utterance UTT using signal processing technique SIGPR \n\ |
| 256 | for the UniSyn pitch-synchronous synthesizer."); |
| 257 | |
| 258 | init_subr_2("us_mapping", FT_us_mapping, |
| 259 | "(us_mapping UTT method)\n\ |
| 260 | Synthesize utterance UTT using signal processing technique SIGPR \n\ |
| 261 | for the UniSyn pitch-synchronous synthesizer."); |
| 262 | |
| 263 | init_subr_1("us_unit_concat", FT_us_unit_concat, |
| 264 | "(us_unit_concat UTT)\n\ |
| 265 | Concat coef and wave information in unit stream into a single \n\ |
| 266 | Frames structure storing the result in the Frame relation"); |
| 267 | |
| 268 | init_subr_4("us_f0_to_pitchmarks", FT_f0_to_pitchmarks, |
| 269 | "(us_f0_to_pitchmarks UTT F0_relation PM_relation END_TIME)\n\ |
| 270 | From the F0 contour in F0_relation, create a set of pitchmarks\n\ |
| 271 | in PM_relation. If END_TIME is not nil, Extra pitchmarks will be \n\ |
| 272 | created at the default interval up to this point"); |
| 273 | |
| 274 | init_subr_4("map_to_relation", FT_map_to_relation, |
| 275 | "(map_to_relation UTT Source_relation Target_relation new_relation)\n\ |
| 276 | From the F0 contour in F0_relation, create a set of pitchmarks\n\ |
| 277 | in PM_relation. If END_TIME is not nil, Extra pitchmarks will be \n\ |
| 278 | created at the default interval up to this point"); |
| 279 | |
| 280 | init_subr_4("us_get_copy_wave", FT_us_get_copy_wave, |
| 281 | "(warp_utterance UTT (Wavefile Pitchmark_file))\n\ |
| 282 | Change waveform to match prosodic specification of utterance."); |
| 283 | |
| 284 | |
| 285 | #ifdef HAVE_US_TDPSOLA_TM |
| 286 | us_init_tdpsola(); |
| 287 | #endif |
| 288 | |
| 289 | } |
| 290 | |
| 291 | /* |
| 292 | |
| 293 | init_subr_2("us_F0targets_to_pitchmarks", FT_us_F0targets_to_pitchmarks, |
| 294 | "(us_F0targets_to_pitchmarks UTT Segment_Relation)\n\ |
| 295 | Make set of pitchmarks according to F0 target specification"); |
| 296 | |
| 297 | LISP FT_merge_pitchmarks(LISP lutt, LISP l_pm1, LISP l_pm2, |
| 298 | LISP l_guide_name) |
| 299 | { |
| 300 | EST_Utterance *utt = get_c_utt(lutt); |
| 301 | |
| 302 | EST_Track *pm1 = |
| 303 | track(utt->relation(get_c_string(l_pm1), 1)->head()->f("coefs", 1)); |
| 304 | EST_Track *pm2 = |
| 305 | track(utt->relation(get_c_string(l_pm2), 1)->head()->f("coefs", 1)); |
| 306 | |
| 307 | EST_Relation *guide = utt->relation(get_c_string(l_guide_name), 1); |
| 308 | |
| 309 | EST_Relation *pm_rel = utt->create_relation("TargetCoefs"); |
| 310 | |
| 311 | EST_Track *target_pm = new EST_Track; |
| 312 | |
| 313 | EST_Item *a = pm_rel->append(); |
| 314 | a->fset_val("coefs", est_val(target_pm)); |
| 315 | |
| 316 | merge_pitchmarks(*get_c_utt(lutt), *pm1, *pm2, *target_pm, *guide); |
| 317 | |
| 318 | return lutt; |
| 319 | } |
| 320 | LISP FT_warp_pitchmarks(LISP lutt, LISP l_pm_file, LISP l_seg_file) |
| 321 | { |
| 322 | EST_Utterance *utt = get_c_utt(lutt); |
| 323 | |
| 324 | EST_String pm_file = get_c_string(l_pm_file); |
| 325 | EST_String seg_file = get_c_string(l_seg_file); |
| 326 | |
| 327 | EST_Track *pm = new EST_Track; |
| 328 | EST_Relation seg; |
| 329 | |
| 330 | if (pm->load(pm_file) != format_ok) |
| 331 | return NIL; |
| 332 | |
| 333 | if (seg.load(seg_file) != format_ok) |
| 334 | return NIL; |
| 335 | |
| 336 | warp_pitchmarks(*utt, pm, seg, *utt->relation("Segment")); |
| 337 | |
| 338 | return lutt; |
| 339 | } |
| 340 | |
| 341 | init_subr_3("us_warp_pitchmarks", FT_warp_pitchmarks, |
| 342 | "(warp_utterance UTT (Wavefile Pitchmark_file))\n\ |
| 343 | Change waveform to match prosodic specification of utterance."); |
| 344 | |
| 345 | LISP FT_us_load_utt_segments(LISP l_utt, LISP l_filename) |
| 346 | { |
| 347 | EST_String filename = get_c_string(l_filename); |
| 348 | EST_Utterance tu; |
| 349 | EST_Utterance *u = get_c_utt(l_utt); |
| 350 | EST_Item *s, *t; |
| 351 | |
| 352 | if (tu.load(filename) != format_ok) |
| 353 | festival_error(); |
| 354 | |
| 355 | u->relation("Segment")->clear(); |
| 356 | |
| 357 | for (s = tu.relation("Segment")->head(); s; s = s->next()) |
| 358 | { |
| 359 | t = u->relation("Segment")->append(); |
| 360 | t->fset("name", s->fS("name")); |
| 361 | t->fset("end", s->fS("end")); |
| 362 | } |
| 363 | |
| 364 | return l_utt; |
| 365 | } |
| 366 | |
| 367 | void us_F0targets_to_pitchmarks(EST_Utterance &utt, |
| 368 | const EST_String &seg_relation); |
| 369 | |
| 370 | LISP FT_us_F0targets_to_pitchmarks(LISP lutt, LISP lseg) |
| 371 | { |
| 372 | EST_String s = (lseg == NIL) ? "" : get_c_string(lseg); |
| 373 | us_F0targets_to_pitchmarks(*get_c_utt(lutt), s); |
| 374 | |
| 375 | return lutt; |
| 376 | } |
| 377 | |
| 378 | |
| 379 | */ |