1 /* ----------------------------------------------------------------- */ 2 /* The HMM-Based Speech Synthesis Engine "hts_engine API" */ 3 /* developed by HTS Working Group */ 4 /* http://hts-engine.sourceforge.net/ */ 5 /* ----------------------------------------------------------------- */ 6 /* */ 7 /* Copyright (c) 2001-2015 Nagoya Institute of Technology */ 8 /* Department of Computer Science */ 9 /* */ 10 /* 2001-2008 Tokyo Institute of Technology */ 11 /* Interdisciplinary Graduate School of */ 12 /* Science and Engineering */ 13 /* */ 14 /* All rights reserved. */ 15 /* */ 16 /* Redistribution and use in source and binary forms, with or */ 17 /* without modification, are permitted provided that the following */ 18 /* conditions are met: */ 19 /* */ 20 /* - Redistributions of source code must retain the above copyright */ 21 /* notice, this list of conditions and the following disclaimer. */ 22 /* - Redistributions in binary form must reproduce the above */ 23 /* copyright notice, this list of conditions and the following */ 24 /* disclaimer in the documentation and/or other materials provided */ 25 /* with the distribution. */ 26 /* - Neither the name of the HTS working group nor the names of its */ 27 /* contributors may be used to endorse or promote products derived */ 28 /* from this software without specific prior written permission. */ 29 /* */ 30 /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND */ 31 /* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, */ 32 /* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */ 33 /* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */ 34 /* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS */ 35 /* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, */ 36 /* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ 37 /* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, */ 38 /* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON */ 39 /* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, */ 40 /* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY */ 41 /* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */ 42 /* POSSIBILITY OF SUCH DAMAGE. */ 43 /* ----------------------------------------------------------------- */ 44 45 #ifndef HTS_HIDDEN_H 46 #define HTS_HIDDEN_H 47 48 #ifdef __cplusplus 49 #define HTS_HIDDEN_H_START extern "C" { 50 #define HTS_HIDDEN_H_END } 51 #else 52 #define HTS_HIDDEN_H_START 53 #define HTS_HIDDEN_H_END 54 #endif /* __CPLUSPLUS */ 55 56 HTS_HIDDEN_H_START; 57 58 /* hts_engine libraries */ 59 #include "HTS_engine.h" 60 61 /* common ---------------------------------------------------------- */ 62 63 #define HTS_MAXBUFLEN 1024 64 65 #if !defined(WORDS_BIGENDIAN) && !defined(WORDS_LITTLEENDIAN) 66 #define WORDS_LITTLEENDIAN 67 #endif /* !WORDS_BIGENDIAN && !WORDS_LITTLEENDIAN */ 68 #if defined(WORDS_BIGENDIAN) && defined(WORDS_LITTLEENDIAN) 69 #undef WORDS_BIGENDIAN 70 #endif /* WORDS_BIGENDIAN && WORDS_LITTLEENDIAN */ 71 72 #define MAX_F0 20000.0 73 #define MIN_F0 20.0 74 #define MAX_LF0 9.9034875525361280454891979401956 /* log(20000.0) */ 75 #define MIN_LF0 2.9957322735539909934352235761425 /* log(20.0) */ 76 #define HALF_TONE 0.05776226504666210911810267678818 /* log(2.0) / 12.0 */ 77 #define DB 0.11512925464970228420089957273422 /* log(10.0) / 20.0 */ 78 79 /* misc ------------------------------------------------------------ */ 80 81 typedef struct _HTS_File { 82 unsigned char type; 83 void *pointer; 84 } HTS_File; 85 86 /* HTS_fopen: wrapper for fopen */ 87 HTS_File *HTS_fopen_from_fn(const char *name, const char *opt); 88 89 /* HTS_fopen_from_fp: wrapper for fopen */ 90 HTS_File *HTS_fopen_from_fp(HTS_File * fp, size_t size); 91 92 /* HTS_fopen_from_data: wrapper for fopen */ 93 HTS_File *HTS_fopen_from_data(void *data, size_t size); 94 95 /* HTS_fclose: wrapper for fclose */ 96 void HTS_fclose(HTS_File * fp); 97 98 /* HTS_fgetc: wrapper for fgetc */ 99 int HTS_fgetc(HTS_File * fp); 100 101 /* HTS_feof: wrapper for feof */ 102 int HTS_feof(HTS_File * fp); 103 104 /* HTS_fseek: wrapper for fseek */ 105 int HTS_fseek(HTS_File * fp, long offset, int origin); 106 107 /* HTS_ftell: wrapper for ftell */ 108 long HTS_ftell(HTS_File * fp); 109 110 /* HTS_fread_big_endian: fread with byteswap */ 111 size_t HTS_fread_big_endian(void *buf, size_t size, size_t n, HTS_File * fp); 112 113 /* HTS_fread_little_endian: fread with byteswap */ 114 size_t HTS_fread_little_endian(void *buf, size_t size, size_t n, HTS_File * fp); 115 116 /* HTS_fwrite_little_endian: fwrite with byteswap */ 117 size_t HTS_fwrite_little_endian(const void *buf, size_t size, size_t n, FILE * fp); 118 119 /* HTS_get_pattern_token: get pattern token (single/double quote can be used) */ 120 HTS_Boolean HTS_get_pattern_token(HTS_File * fp, char *buff); 121 122 /* HTS_get_token: get token from file pointer (separators are space,tab,line break) */ 123 HTS_Boolean HTS_get_token_from_fp(HTS_File * fp, char *buff); 124 125 /* HTS_get_token: get token from file pointer with specified separator */ 126 HTS_Boolean HTS_get_token_from_fp_with_separator(HTS_File * fp, char *buff, char separator); 127 128 /* HTS_get_token_from_string: get token from string (separator are space,tab,line break) */ 129 HTS_Boolean HTS_get_token_from_string(const char *string, size_t * index, char *buff); 130 131 /* HTS_get_token_from_string_with_separator: get token from string with specified separator */ 132 HTS_Boolean HTS_get_token_from_string_with_separator(const char *str, size_t * index, char *buff, char separator); 133 134 /* HTS_calloc: wrapper for calloc */ 135 void *HTS_calloc(const size_t num, const size_t size); 136 137 /* HTS_strdup: wrapper for strdup */ 138 char *HTS_strdup(const char *string); 139 140 /* HTS_calloc_matrix: allocate double matrix */ 141 double **HTS_alloc_matrix(size_t x, size_t y); 142 143 /* HTS_free_matrix: free double matrix */ 144 void HTS_free_matrix(double **p, size_t x); 145 146 /* HTS_Free: wrapper for free */ 147 void HTS_free(void *p); 148 149 /* HTS_error: output error message */ 150 void HTS_error(int error, const char *message, ...); 151 152 /* audio ----------------------------------------------------------- */ 153 154 /* HTS_Audio_initialize: initialize audio */ 155 void HTS_Audio_initialize(HTS_Audio * audio); 156 157 /* HTS_Audio_set_parameter: set parameters for audio */ 158 void HTS_Audio_set_parameter(HTS_Audio * audio, size_t sampling_frequency, size_t max_buff_size); 159 160 /* HTS_Audio_write: send data to audio */ 161 void HTS_Audio_write(HTS_Audio * audio, short data); 162 163 /* HTS_Audio_flush: flush remain data */ 164 void HTS_Audio_flush(HTS_Audio * audio); 165 166 /* HTS_Audio_clear: free audio */ 167 void HTS_Audio_clear(HTS_Audio * audio); 168 169 /* model ----------------------------------------------------------- */ 170 171 /* HTS_ModelSet_initialize: initialize model set */ 172 void HTS_ModelSet_initialize(HTS_ModelSet * ms); 173 174 /* HTS_ModelSet_load: load HTS voices */ 175 HTS_Boolean HTS_ModelSet_load(HTS_ModelSet * ms, char **voices, size_t num_voices); 176 177 /* HTS_ModelSet_get_sampling_frequency: get sampling frequency of HTS voices */ 178 size_t HTS_ModelSet_get_sampling_frequency(HTS_ModelSet * ms); 179 180 /* HTS_ModelSet_get_fperiod: get frame period of HTS voices */ 181 size_t HTS_ModelSet_get_fperiod(HTS_ModelSet * ms); 182 183 /* HTS_ModelSet_get_fperiod: get stream option */ 184 const char *HTS_ModelSet_get_option(HTS_ModelSet * ms, size_t stream_index); 185 186 /* HTS_ModelSet_get_gv_flag: get GV flag */ 187 HTS_Boolean HTS_ModelSet_get_gv_flag(HTS_ModelSet * ms, const char *string, const RHVoice_parsed_label_string* parsed); 188 189 /* HTS_ModelSet_get_nstate: get number of state */ 190 size_t HTS_ModelSet_get_nstate(HTS_ModelSet * ms); 191 192 /* HTS_Engine_get_fullcontext_label_format: get full-context label format */ 193 const char *HTS_ModelSet_get_fullcontext_label_format(HTS_ModelSet * ms); 194 195 /* HTS_Engine_get_fullcontext_label_version: get full-context label version */ 196 const char *HTS_ModelSet_get_fullcontext_label_version(HTS_ModelSet * ms); 197 198 /* HTS_ModelSet_get_nstream: get number of stream */ 199 size_t HTS_ModelSet_get_nstream(HTS_ModelSet * ms); 200 201 /* HTS_ModelSet_get_nvoices: get number of HTS voices */ 202 size_t HTS_ModelSet_get_nvoices(HTS_ModelSet * ms); 203 204 /* HTS_ModelSet_get_vector_length: get vector length */ 205 size_t HTS_ModelSet_get_vector_length(HTS_ModelSet * ms, size_t stream_index); 206 207 /* HTS_ModelSet_is_msd: get MSD flag */ 208 HTS_Boolean HTS_ModelSet_is_msd(HTS_ModelSet * ms, size_t stream_index); 209 210 /* HTS_ModelSet_get_window_size: get dynamic window size */ 211 size_t HTS_ModelSet_get_window_size(HTS_ModelSet * ms, size_t stream_index); 212 213 /* HTS_ModelSet_get_window_left_width: get left width of dynamic window */ 214 int HTS_ModelSet_get_window_left_width(HTS_ModelSet * ms, size_t stream_index, size_t window_index); 215 216 /* HTS_ModelSet_get_window_right_width: get right width of dynamic window */ 217 int HTS_ModelSet_get_window_right_width(HTS_ModelSet * ms, size_t stream_index, size_t window_index); 218 219 /* HTS_ModelSet_get_window_coefficient: get coefficient of dynamic window */ 220 double HTS_ModelSet_get_window_coefficient(HTS_ModelSet * ms, size_t stream_index, size_t window_index, size_t coefficient_index); 221 222 /* HTS_ModelSet_get_window_max_width: get max width of dynamic window */ 223 size_t HTS_ModelSet_get_window_max_width(HTS_ModelSet * ms, size_t stream_index); 224 225 /* HTS_ModelSet_use_gv: get GV flag */ 226 HTS_Boolean HTS_ModelSet_use_gv(HTS_ModelSet * ms, size_t stream_index); 227 228 /* HTS_ModelSet_get_duration_index: get index of duration tree and PDF */ 229 void HTS_ModelSet_get_duration_index(HTS_ModelSet * ms, size_t voice_index, const char *string, const RHVoice_parsed_label_string* parsed, size_t * tree_index, size_t * pdf_index); 230 231 /* HTS_ModelSet_get_duration: get duration using interpolation weight */ 232 void HTS_ModelSet_get_duration(HTS_ModelSet * ms, const char *string, const RHVoice_parsed_label_string* parsed, const double *iw, double *mean, double *vari); 233 234 /* HTS_ModelSet_get_parameter_index: get index of parameter tree and PDF */ 235 void HTS_ModelSet_get_parameter_index(HTS_ModelSet * ms, size_t voice_index, size_t stream_index, size_t state_index, const char *string, const RHVoice_parsed_label_string* parsed, size_t * tree_index, size_t * pdf_index); 236 237 /* HTS_ModelSet_get_parameter: get parameter using interpolation weight */ 238 void HTS_ModelSet_get_parameter(HTS_ModelSet * ms, size_t stream_index, size_t state_index, const char *string, const RHVoice_parsed_label_string* parsed, const double *const *iw, double *mean, double *vari, double *msd); 239 240 void HTS_ModelSet_get_gv_index(HTS_ModelSet * ms, size_t voice_index, size_t stream_index, const char *string, const RHVoice_parsed_label_string* parsed, size_t * tree_index, size_t * pdf_index); 241 242 /* HTS_ModelSet_get_gv: get GV using interpolation weight */ 243 void HTS_ModelSet_get_gv(HTS_ModelSet * ms, size_t stream_index, const char *string, const RHVoice_parsed_label_string* parsed, const double *const *iw, double *mean, double *vari); 244 245 /* HTS_ModelSet_clear: free model set */ 246 void HTS_ModelSet_clear(HTS_ModelSet * ms); 247 248 /* label ----------------------------------------------------------- */ 249 250 /* HTS_Label_initialize: initialize label */ 251 void HTS_Label_initialize(HTS_Label * label); 252 253 /* HTS_Label_load_from_fn: load label from file name */ 254 void HTS_Label_load_from_fn(HTS_Label * label, size_t sampling_rate, size_t fperiod, const char *fn); 255 256 /* HTS_Label_load_from_strings: load label list from string list */ 257 void HTS_Label_load_from_strings(HTS_Label * label, size_t sampling_rate, size_t fperiod, char **lines, size_t num_lines); 258 259 /* HTS_Label_get_size: get number of label string */ 260 size_t HTS_Label_get_size(HTS_Label * label); 261 262 /* HTS_Label_get_string: get label string */ 263 const char *HTS_Label_get_string(HTS_Label * label, size_t index); 264 265 const RHVoice_parsed_label_string* HTS_Label_get_parsed(HTS_Label * label, size_t index); 266 267 /* HTS_Label_get_start_frame: get start frame */ 268 double HTS_Label_get_start_frame(HTS_Label * label, size_t index); 269 270 /* HTS_Label_get_end_frame: get end frame */ 271 double HTS_Label_get_end_frame(HTS_Label * label, size_t index); 272 273 double HTS_Label_get_dur_mod(HTS_Label * label, size_t index); 274 275 /* HTS_Label_clear: free label */ 276 void HTS_Label_clear(HTS_Label * label); 277 278 /* sstream --------------------------------------------------------- */ 279 280 /* HTS_SStreamSet_initialize: initialize state stream set */ 281 void HTS_SStreamSet_initialize(HTS_SStreamSet * sss); 282 283 /* HTS_SStreamSet_create: parse label and determine state duration */ 284 HTS_Boolean HTS_SStreamSet_create(HTS_SStreamSet * sss, HTS_ModelSet * ms, HTS_Label * label, HTS_Boolean phoneme_alignment_flag, double speed, double *duration_iw, double **parameter_iw, double **gv_iw); 285 286 /* HTS_SStreamSet_get_nstream: get number of stream */ 287 size_t HTS_SStreamSet_get_nstream(HTS_SStreamSet * sss); 288 289 /* HTS_SStreamSet_get_vector_length: get vector length */ 290 size_t HTS_SStreamSet_get_vector_length(HTS_SStreamSet * sss, size_t stream_index); 291 292 /* HTS_SStreamSet_is_msd: get MSD flag */ 293 HTS_Boolean HTS_SStreamSet_is_msd(HTS_SStreamSet * sss, size_t stream_index); 294 295 /* HTS_SStreamSet_get_total_state: get total number of state */ 296 size_t HTS_SStreamSet_get_total_state(HTS_SStreamSet * sss); 297 298 /* HTS_SStreamSet_get_total_frame: get total number of frame */ 299 size_t HTS_SStreamSet_get_total_frame(HTS_SStreamSet * sss); 300 301 /* HTS_SStreamSet_get_msd: get msd parameter */ 302 double HTS_SStreamSet_get_msd(HTS_SStreamSet * sss, size_t stream_index, size_t state_index); 303 304 /* HTS_SStreamSet_window_size: get dynamic window size */ 305 size_t HTS_SStreamSet_get_window_size(HTS_SStreamSet * sss, size_t stream_index); 306 307 /* HTS_SStreamSet_get_window_left_width: get left width of dynamic window */ 308 int HTS_SStreamSet_get_window_left_width(HTS_SStreamSet * sss, size_t stream_index, size_t window_index); 309 310 /* HTS_SStreamSet_get_window_right_width: get right width of dynamic window */ 311 int HTS_SStreamSet_get_window_right_width(HTS_SStreamSet * sss, size_t stream_index, size_t window_index); 312 313 /* HTS_SStreamSet_get_window_coefficient: get coefficient of dynamic window */ 314 double HTS_SStreamSet_get_window_coefficient(HTS_SStreamSet * sss, size_t stream_index, size_t window_index, int coefficient_index); 315 316 /* HTS_SStreamSet_get_window_max_width: get max width of dynamic window */ 317 size_t HTS_SStreamSet_get_window_max_width(HTS_SStreamSet * sss, size_t stream_index); 318 319 /* HTS_SStreamSet_use_gv: get GV flag */ 320 HTS_Boolean HTS_SStreamSet_use_gv(HTS_SStreamSet * sss, size_t stream_index); 321 322 /* HTS_SStreamSet_get_duration: get state duration */ 323 size_t HTS_SStreamSet_get_duration(HTS_SStreamSet * sss, size_t state_index); 324 325 /* HTS_SStreamSet_get_mean: get mean parameter */ 326 double HTS_SStreamSet_get_mean(HTS_SStreamSet * sss, size_t stream_index, size_t state_index, size_t vector_index); 327 328 /* HTS_SStreamSet_set_mean: set mean parameter */ 329 void HTS_SStreamSet_set_mean(HTS_SStreamSet * sss, size_t stream_index, size_t state_index, size_t vector_index, double f); 330 331 /* HTS_SStreamSet_get_vari: get variance parameter */ 332 double HTS_SStreamSet_get_vari(HTS_SStreamSet * sss, size_t stream_index, size_t state_index, size_t vector_index); 333 334 /* HTS_SStreamSet_set_vari: set variance parameter */ 335 void HTS_SStreamSet_set_vari(HTS_SStreamSet * sss, size_t stream_index, size_t state_index, size_t vector_index, double f); 336 337 /* HTS_SStreamSet_get_gv_mean: get GV mean parameter */ 338 double HTS_SStreamSet_get_gv_mean(HTS_SStreamSet * sss, size_t stream_index, size_t vector_index); 339 340 /* HTS_SStreamSet_get_gv_mean: get GV variance parameter */ 341 double HTS_SStreamSet_get_gv_vari(HTS_SStreamSet * sss, size_t stream_index, size_t vector_index); 342 343 /* HTS_SStreamSet_set_gv_switch: set GV switch */ 344 void HTS_SStreamSet_set_gv_switch(HTS_SStreamSet * sss, size_t stream_index, size_t state_index, HTS_Boolean i); 345 346 /* HTS_SStreamSet_get_gv_switch: get GV switch */ 347 HTS_Boolean HTS_SStreamSet_get_gv_switch(HTS_SStreamSet * sss, size_t stream_index, size_t state_index); 348 349 /* HTS_SStreamSet_clear: free state stream set */ 350 void HTS_SStreamSet_clear(HTS_SStreamSet * sss); 351 352 /* pstream --------------------------------------------------------- */ 353 354 /* check variance in finv() */ 355 #define INFTY ((double) 1.0e+38) 356 #define INFTY2 ((double) 1.0e+19) 357 #define INVINF ((double) 1.0e-38) 358 #define INVINF2 ((double) 1.0e-19) 359 360 /* GV */ 361 #define STEPINIT 0.1 362 #define STEPDEC 0.5 363 #define STEPINC 1.2 364 #define W1 1.0 365 #define W2 1.0 366 #define GV_MAX_ITERATION 5 367 368 /* HTS_PStreamSet_initialize: initialize parameter stream set */ 369 void HTS_PStreamSet_initialize(HTS_PStreamSet * pss); 370 371 /* HTS_PStreamSet_create: parameter generation using GV weight */ 372 HTS_Boolean HTS_PStreamSet_create(HTS_PStreamSet * pss, HTS_SStreamSet * sss, double *msd_threshold, double *gv_weight); 373 374 /* HTS_PStreamSet_get_nstream: get number of stream */ 375 size_t HTS_PStreamSet_get_nstream(HTS_PStreamSet * pss); 376 377 /* HTS_PStreamSet_get_static_length: get features length */ 378 size_t HTS_PStreamSet_get_vector_length(HTS_PStreamSet * pss, size_t stream_index); 379 380 /* HTS_PStreamSet_get_total_frame: get total number of frame */ 381 size_t HTS_PStreamSet_get_total_frame(HTS_PStreamSet * pss); 382 383 /* HTS_PStreamSet_get_parameter: get parameter */ 384 double HTS_PStreamSet_get_parameter(HTS_PStreamSet * pss, size_t stream_index, size_t frame_index, size_t vector_index); 385 386 /* HTS_PStreamSet_get_parameter_vector: get parameter vector */ 387 double *HTS_PStreamSet_get_parameter_vector(HTS_PStreamSet * pss, size_t stream_index, size_t frame_index); 388 389 /* HTS_PStreamSet_get_msd_flag: get generated MSD flag per frame */ 390 HTS_Boolean HTS_PStreamSet_get_msd_flag(HTS_PStreamSet * pss, size_t stream_index, size_t frame_index); 391 392 /* HTS_PStreamSet_is_msd: get MSD flag */ 393 HTS_Boolean HTS_PStreamSet_is_msd(HTS_PStreamSet * pss, size_t stream_index); 394 395 /* HTS_PStreamSet_clear: free parameter stream set */ 396 void HTS_PStreamSet_clear(HTS_PStreamSet * pss); 397 398 /* gstream --------------------------------------------------------- */ 399 400 /* HTS_GStreamSet_initialize: initialize generated parameter stream set */ 401 void HTS_GStreamSet_initialize(HTS_GStreamSet * gss); 402 403 /* HTS_GStreamSet_create: generate speech */ 404 HTS_Boolean HTS_GStreamSet_create(HTS_GStreamSet * gss, HTS_PStreamSet * pss, size_t stage, HTS_Boolean use_log_gain, size_t sampling_rate, size_t fperiod, double alpha, double beta, HTS_Boolean * stop, double volume, HTS_Audio * audio, BPF* bpf); 405 406 /* HTS_GStreamSet_get_total_nsamples: get total number of sample */ 407 size_t HTS_GStreamSet_get_total_nsamples(HTS_GStreamSet * gss); 408 409 /* HTS_GStreamSet_get_total_frame: get total number of frame */ 410 size_t HTS_GStreamSet_get_total_frame(HTS_GStreamSet * gss); 411 412 /* HTS_GStreamSet_get_static_length: get features length */ 413 size_t HTS_GStreamSet_get_vector_length(HTS_GStreamSet * gss, size_t stream_index); 414 415 /* HTS_GStreamSet_get_speech: get synthesized speech parameter */ 416 double HTS_GStreamSet_get_speech(HTS_GStreamSet * gss, size_t sample_index); 417 418 /* HTS_GStreamSet_get_parameter: get generated parameter */ 419 double HTS_GStreamSet_get_parameter(HTS_GStreamSet * gss, size_t stream_index, size_t frame_index, size_t vector_index); 420 421 /* HTS_GStreamSet_clear: free generated parameter stream set */ 422 void HTS_GStreamSet_clear(HTS_GStreamSet * gss); 423 424 /* vocoder --------------------------------------------------------- */ 425 426 #ifndef LZERO 427 #define LZERO (-1.0e+10) /* ~log(0) */ 428 #endif /* !LZERO */ 429 430 #ifndef ZERO 431 #define ZERO (1.0e-10) /* ~(0) */ 432 #endif /* !ZERO */ 433 434 #ifndef PI 435 #define PI 3.14159265358979323846 436 #endif /* !PI */ 437 438 #ifndef PI2 439 #define PI2 6.28318530717958647692 440 #endif /* !PI2 */ 441 442 #define RANDMAX 32767 443 444 #define SEED 1 445 #define B0 0x00000001 446 #define B28 0x10000000 447 #define B31 0x80000000 448 #define B31_ 0x7fffffff 449 #define Z 0x00000000 450 451 #ifdef HTS_EMBEDDED 452 #define GAUSS FALSE 453 #define PADEORDER 4 /* pade order (for MLSA filter) */ 454 #define IRLENG 64 /* length of impulse response */ 455 #else 456 #define GAUSS TRUE 457 #define PADEORDER 5 458 #define IRLENG 96 459 #endif /* HTS_EMBEDDED */ 460 461 #define CHECK_LSP_STABILITY_MIN 0.25 462 #define CHECK_LSP_STABILITY_NUM 4 463 464 /* for MGLSA filter */ 465 #define NORMFLG1 TRUE 466 #define NORMFLG2 FALSE 467 #define MULGFLG1 TRUE 468 #define MULGFLG2 FALSE 469 #define NGAIN FALSE 470 471 /* HTS_Vocoder: structure for setting of vocoder */ 472 typedef struct _HTS_Vocoder { 473 HTS_Boolean is_first; 474 size_t stage; /* Gamma=-1/stage: if stage=0 then Gamma=0 */ 475 double gamma; /* Gamma */ 476 HTS_Boolean use_log_gain; /* log gain flag (for LSP) */ 477 size_t fprd; /* frame shift */ 478 unsigned long next; /* temporary variable for random generator */ 479 HTS_Boolean gauss; /* flag to use Gaussian noise */ 480 double rate; /* sampling rate */ 481 double pitch_of_curr_point; /* used in excitation generation */ 482 double pitch_counter; /* used in excitation generation */ 483 double pitch_inc_per_point; /* used in excitation generation */ 484 double *pulses_ring_buff; /* used in excitation generation */ 485 double *noise_ring_buff; /* used in excitation generation */ 486 double *pulse_filter; /* used in excitation generation */ 487 double *noise_filter; /* used in excitation generation */ 488 size_t excite_buff_size; /* used in excitation generation */ 489 size_t excite_buff_index; /* used in excitation generation */ 490 unsigned char sw; /* switch used in random generator */ 491 int x; /* excitation signal */ 492 double *freqt_buff; /* used in freqt */ 493 size_t freqt_size; /* buffer size for freqt */ 494 double *spectrum2en_buff; /* used in spectrum2en */ 495 size_t spectrum2en_size; /* buffer size for spectrum2en */ 496 double r1, r2, s; /* used in random generator */ 497 double *postfilter_buff; /* used in postfiltering */ 498 size_t postfilter_size; /* buffer size for postfiltering */ 499 double *c, *cc, *cinc, *d1; /* used in the MLSA/MGLSA filter */ 500 double *lsp2lpc_buff; /* used in lsp2lpc */ 501 size_t lsp2lpc_size; /* buffer size of lsp2lpc */ 502 double *gc2gc_buff; /* used in gc2gc */ 503 size_t gc2gc_size; /* buffer size for gc2gc */ 504 } HTS_Vocoder; 505 506 /* HTS_Vocoder_initialize: initialize vocoder */ 507 void HTS_Vocoder_initialize(HTS_Vocoder * v, size_t m, size_t stage, HTS_Boolean use_log_gain, size_t rate, size_t fperiod); 508 509 /* HTS_Vocoder_synthesize: pulse/noise excitation and MLSA/MGLSA filster based waveform synthesis */ 510 void HTS_Vocoder_synthesize(HTS_Vocoder * v, size_t m, double lf0, double *spectrum, double *bap, BPF* bpf, double alpha, double beta, double volume, double *rawdata, HTS_Audio * audio); 511 512 /* HTS_Vocoder_clear: clear vocoder */ 513 void HTS_Vocoder_clear(HTS_Vocoder * v); 514 515 HTS_HIDDEN_H_END; 516 517 #endif /* !HTS_HIDDEN_H */ 518