00001
00116
00117
00118
00119
00120
00121
00122
00123 #include <julius.h>
00124
00125 #undef RDEBUG
00126
00127
00128 static HTK_Param *param = NULL;
00129 static Value para;
00130 static float *bf;
00131 static DeltaBuf *db;
00132 static DeltaBuf *ab;
00133 static VECT *tmpmfcc;
00134 static int maxframelen;
00135 static int last_time;
00136
00137 static boolean last_is_segmented;
00138 #ifdef SP_BREAK_CURRENT_FRAME
00139 static SP16 *rest_Speech = NULL;
00140 static int rest_alloc_len = 0;
00141 static int rest_len;
00142 #endif
00143
00144 static int f_raw;
00145 static int f;
00146 static SP16 *window;
00147 static int windowlen;
00148 static int windownum;
00149
00150
00151
00152
00153
00154
00155
00156
00168 static void
00169 init_param()
00170 {
00171
00172
00173 param = new_param();
00174
00175
00176 param->header.samptype = F_MFCC;
00177 if (para.delta) param->header.samptype |= F_DELTA;
00178 if (para.acc) param->header.samptype |= F_ACCL;
00179 if (para.energy) param->header.samptype |= F_ENERGY;
00180 if (para.c0) param->header.samptype |= F_ZEROTH;
00181 if (para.absesup) param->header.samptype |= F_ENERGY_SUP;
00182 if (para.cmn) param->header.samptype |= F_CEPNORM;
00183
00184 param->header.wshift = para.smp_period * para.frameshift;
00185 param->header.sampsize = para.veclen * sizeof(VECT);
00186 param->veclen = para.veclen;
00187
00188
00189
00190 param->parvec = (VECT **)mymalloc(sizeof(VECT *) * maxframelen);
00191
00192
00193
00194
00195
00196
00197
00198
00199 }
00200
00210 void
00211 RealTimeInit()
00212 {
00213
00214
00215 init_para(¶);
00216
00217
00218 if (ssload_filename && ssbuf == NULL) {
00219 if ((ssbuf = new_SS_load_from_file(ssload_filename, &sslen)) == NULL) {
00220 j_error("Error: failed to read \"%s\"\n", ssload_filename);
00221 }
00222 }
00223
00224
00225 WMP_init(para, &bf, ssbuf, sslen);
00226
00227
00228 if (para.delta) db = WMP_deltabuf_new(para.baselen, para.delWin);
00229 if (para.acc) ab = WMP_deltabuf_new(para.baselen * 2, para.accWin);
00230
00231
00232 tmpmfcc = (VECT *)mymalloc(sizeof(VECT) * para.vecbuflen);
00233
00234
00235 maxframelen = MAXSPEECHLEN / para.frameshift;
00236
00237
00238 windowlen = para.framesize + 1;
00239
00240
00241 window = mymalloc(sizeof(SP16) * windowlen);
00242
00243
00244 if (para.cmn) CMN_realtime_init(para.mfcc_dim, cmn_map_weight);
00245
00246
00247 if (cmnload_filename) {
00248 if (para.cmn) {
00249 if ((cmn_loaded = CMN_load_from_file(cmnload_filename, para.mfcc_dim))== FALSE) {
00250 j_printf("Warning: failed to read cepstral mean from \"%s\"\n", cmnload_filename);
00251 }
00252 } else {
00253 j_printf("Warning: CMN not required, file \"%s\" ignored\n", cmnload_filename);
00254 }
00255 }
00256 }
00257
00258
00259
00269 void
00270 RealTimePipeLinePrepare()
00271 {
00272
00273
00274 init_param();
00275
00276
00277 if (para.delta) WMP_deltabuf_prepare(db);
00278 if (para.acc) WMP_deltabuf_prepare(ab);
00279
00280
00281
00282
00283 outprob_prepare(maxframelen);
00284
00285
00286 if (!check_param_coherence(hmminfo, param)) {
00287 j_error("parameter type not match?\n");
00288 }
00289
00290
00291 f_raw = 0;
00292 f = 0;
00293 windownum = 0;
00294
00295
00296
00297 if (para.cmn) CMN_realtime_prepare();
00298
00299
00300
00301 if (record_dirname != NULL) {
00302 record_sample_open();
00303 }
00304
00305 #ifdef VISUALIZE
00306
00307
00308
00309 speechlen = 0;
00310 #endif
00311 }
00312
00351 int
00352 RealTimePipeLine(SP16 *Speech, int nowlen)
00353 {
00354 int i, now;
00355 boolean ret;
00356
00357
00358
00359
00360
00361
00362 now = 0;
00363
00364
00365
00366 last_is_segmented = FALSE;
00367
00368
00369
00370 if (f_raw == 0) status_recstart();
00371
00372 #ifdef RDEBUG
00373 printf("got %d samples\n", nowlen);
00374 #endif
00375
00376
00377
00378 if (record_dirname != NULL) {
00379 record_sample_write(Speech, nowlen);
00380 }
00381
00382 #ifdef VISUALIZE
00383
00384 adin_cut_callback_store_buffer(Speech, nowlen);
00385 #endif
00386
00387 while (now < nowlen) {
00388
00389
00390 if (f_raw >= maxframelen) return(1);
00391
00392
00393 for(i = min(windowlen - windownum, nowlen - now); i > 0 ; i--)
00394 window[windownum++] = (float) Speech[now++];
00395
00396
00397
00398
00399 if (windownum < windowlen) break;
00400 #ifdef RDEBUG
00401
00402
00403
00404 #endif
00405
00406
00407
00408 for (i=0; i < windowlen; i++) {
00409 bf[i+1] = (float) window[i];
00410 }
00411 WMP_calc(tmpmfcc, bf, para, ssbuf);
00412
00413 if (para.delta) {
00414
00415
00416 ret = WMP_deltabuf_proceed(db, tmpmfcc);
00417 #ifdef RDEBUG
00418 printf("DeltaBuf: ret=%d, status=", ret);
00419 for(i=0;i<db->len;i++) {
00420 printf("%d", db->is_on[i]);
00421 }
00422 printf(", nextstore=%d\n", db->store);
00423 #endif
00424
00425
00426
00427 if (! ret) {
00428 goto next_input;
00429 }
00430
00431
00432 memcpy(tmpmfcc, db->vec, sizeof(VECT) * para.baselen * 2);
00433 }
00434
00435 if (para.acc) {
00436
00437
00438
00439
00440 ret = WMP_deltabuf_proceed(ab, tmpmfcc);
00441 #ifdef RDEBUG
00442 printf("AccelBuf: ret=%d, status=", ret);
00443 for(i=0;i<ab->len;i++) {
00444 printf("%d", ab->is_on[i]);
00445 }
00446 printf(", nextstore=%d\n", ab->store);
00447 #endif
00448
00449
00450
00451 if (! ret) {
00452 goto next_input;
00453 }
00454
00455
00456
00457
00458
00459
00460 memcpy(tmpmfcc, ab->vec, sizeof(VECT) * para.baselen * 2);
00461 memcpy(&(tmpmfcc[para.baselen*2]), &(ab->vec[para.baselen*3]), sizeof(VECT) * para.baselen);
00462 }
00463
00464 if (para.delta && para.energy && para.absesup) {
00465
00466
00467 memmove(&(tmpmfcc[para.baselen-1]), &(tmpmfcc[para.baselen]), sizeof(VECT) * (para.vecbuflen - para.baselen));
00468 }
00469
00470
00471
00472
00473 #ifdef RDEBUG
00474 printf("DeltaBuf: got frame %d\n", f_raw);
00475 #endif
00476
00477
00478 if (para.cmn) CMN_realtime(tmpmfcc, para.mfcc_dim);
00479
00480
00481
00482 param->parvec[f_raw] = (VECT *)mymalloc(sizeof(VECT) * param->veclen);
00483 memcpy(param->parvec[f_raw], tmpmfcc, sizeof(VECT) * param->veclen);
00484 f = f_raw;
00485
00486
00487
00488
00489
00490 if (f == 0) {
00491
00492
00493 get_back_trellis_init(param, wchmm, &backtrellis);
00494 }
00495 #ifndef MULTIPATH_VERSION
00496 if (f != 0) {
00497 #endif
00498
00499
00500 if (get_back_trellis_proceed(f, param, wchmm, &backtrellis
00501 #ifdef MULTIPATH_VERSION
00502 ,FALSE
00503 #endif
00504 ) == FALSE) {
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520 last_is_segmented = TRUE;
00521
00522
00523 last_time = f-1;
00524 #ifdef SP_BREAK_CURRENT_FRAME
00525
00526
00527
00528
00529 param->header.samplenum = f_raw+1;
00530 param->samplenum = f_raw+1;
00531 rest_len = nowlen - now;
00532 if (rest_len > 0) {
00533
00534 if (rest_Speech == NULL) {
00535 rest_alloc_len = rest_len;
00536 rest_Speech = (SP16 *)mymalloc(sizeof(SP16)*rest_alloc_len);
00537 } else if (rest_alloc_len < rest_len) {
00538 rest_alloc_len = rest_len;
00539 rest_Speech = (SP16 *)myrealloc(rest_Speech, sizeof(SP16)*rest_alloc_len);
00540 }
00541 memcpy(rest_Speech, &(Speech[now]), sizeof(SP16) * rest_len);
00542 }
00543 #else
00544
00545
00546 param->header.samplenum = f;
00547 param->samplenum = f;
00548 #endif
00549
00550
00551 return(1);
00552 }
00553 #ifndef MULTIPATH_VERSION
00554 }
00555 #endif
00556
00557
00558 f_raw++;
00559
00560 next_input:
00561
00562
00563
00564 memmove(window, &(window[para.frameshift]), sizeof(SP16) * (windowlen - para.frameshift));
00565 windownum -= para.frameshift;
00566 }
00567
00568
00569
00570
00571
00572 return(0);
00573 }
00574
00575 #ifdef SP_BREAK_CURRENT_FRAME
00576
00610 int
00611 RealTimeResume()
00612 {
00613 int t;
00614
00615
00616
00617 param = rest_param;
00618
00619
00620
00621 outprob_prepare(maxframelen);
00622 param->parvec = (VECT **)myrealloc(param->parvec, sizeof(VECT *) * maxframelen);
00623
00624
00625 f_raw = param->samplenum - 1;
00626
00627
00628
00629 if (f_raw >= 0) {
00630 f = f_raw;
00631 #ifdef RDEBUG
00632 printf("Resume: f=%d,f_raw=%d\n", f, f_raw);
00633 #endif
00634 get_back_trellis_init(param, wchmm, &backtrellis);
00635 for (t=
00636 #ifdef MULTIPATH_VERSION
00637 0
00638 #else
00639 1
00640 #endif
00641 ;t<=f;t++) {
00642 if (get_back_trellis_proceed(t, param, wchmm, &backtrellis
00643 #ifdef MULTIPATH_VERSION
00644 ,FALSE
00645 #endif
00646 ) == FALSE) {
00647
00648 last_is_segmented = TRUE;
00649 last_time = t-1;
00650 return(1);
00651 }
00652 }
00653 }
00654
00655 f_raw++;
00656 f = f_raw;
00657
00658
00659
00660 memmove(window, &(window[para.frameshift]), sizeof(SP16) * (windowlen - para.frameshift));
00661 windownum -= para.frameshift;
00662
00663
00664
00665
00666
00667 if (rest_len > 0) {
00668 #ifdef RDEBUG
00669 printf("Resume: rest %d samples\n", rest_len);
00670 #endif
00671 return(RealTimePipeLine(rest_Speech, rest_len));
00672 }
00673
00674
00675
00676 return 0;
00677 }
00678 #endif
00679
00680
00681
00682
00699 HTK_Param *
00700 RealTimeParam(LOGPROB *backmax)
00701 {
00702 boolean ret1, ret2;
00703
00704 if (last_is_segmented) {
00705
00706
00707
00708
00709
00710
00711 *backmax = finalize_1st_pass(&backtrellis, winfo, last_time);
00712 #ifdef SP_BREAK_CURRENT_FRAME
00713 finalize_segment(&backtrellis, param, last_time);
00714 #endif
00715
00716
00717 return(param);
00718 }
00719
00720
00721
00722
00723 if (para.delta || para.acc) {
00724
00725
00726 while(1) {
00727
00728
00729 ret1 = WMP_deltabuf_flush(db);
00730 #ifdef RDEBUG
00731 {
00732 int i;
00733 printf("DeltaBufLast: ret=%d, status=", ret1);
00734 for(i=0;i<db->len;i++) {
00735 printf("%d", db->is_on[i]);
00736 }
00737 printf(", nextstore=%d\n", db->store);
00738 }
00739 #endif
00740 if (ret1) {
00741
00742 if (para.energy && para.absesup) {
00743 memcpy(tmpmfcc, db->vec, sizeof(VECT) * (para.baselen - 1));
00744 memcpy(&(tmpmfcc[para.baselen-1]), &(db->vec[para.baselen]), sizeof(VECT) * para.baselen);
00745 } else {
00746 memcpy(tmpmfcc, db->vec, sizeof(VECT) * para.baselen * 2);
00747 }
00748 if (para.acc) {
00749
00750 ret2 = WMP_deltabuf_proceed(ab, tmpmfcc);
00751 #ifdef RDEBUG
00752 printf("AccelBuf: ret=%d, status=", ret2);
00753 for(i=0;i<ab->len;i++) {
00754 printf("%d", ab->is_on[i]);
00755 }
00756 printf(", nextstore=%d\n", ab->store);
00757 #endif
00758 if (ret2) {
00759
00760 memcpy(tmpmfcc, ab->vec, sizeof(VECT) * (para.veclen - para.baselen));
00761 memcpy(&(tmpmfcc[para.veclen - para.baselen]), &(ab->vec[para.veclen - para.baselen]), sizeof(VECT) * para.baselen);
00762 } else {
00763
00764
00765 continue;
00766 }
00767 }
00768 } else {
00769
00770 if (para.acc) {
00771
00772 ret2 = WMP_deltabuf_flush(ab);
00773 #ifdef RDEBUG
00774 printf("AccelBuf: ret=%d, status=", ret2);
00775 for(i=0;i<ab->len;i++) {
00776 printf("%d", ab->is_on[i]);
00777 }
00778 printf(", nextstore=%d\n", ab->store);
00779 #endif
00780 if (ret2) {
00781
00782 memcpy(tmpmfcc, ab->vec, sizeof(VECT) * (para.veclen - para.baselen));
00783 memcpy(&(tmpmfcc[para.veclen - para.baselen]), &(ab->vec[para.veclen - para.baselen]), sizeof(VECT) * para.baselen);
00784 } else {
00785
00786 break;
00787 }
00788 } else {
00789
00790 break;
00791 }
00792 }
00793 if(para.cmn) CMN_realtime(tmpmfcc, para.mfcc_dim);
00794 param->parvec[f_raw] = (VECT *)mymalloc(sizeof(VECT) * param->veclen);
00795 memcpy(param->parvec[f_raw], tmpmfcc, sizeof(VECT) * param->veclen);
00796 f = f_raw;
00797 if (f == 0) {
00798 get_back_trellis_init(param, wchmm, &backtrellis);
00799 }
00800 #ifdef MULTIPATH_VERSION
00801 get_back_trellis_proceed(f, param, wchmm, &backtrellis, FALSE);
00802 #else
00803 if (f != 0) {
00804 get_back_trellis_proceed(f, param, wchmm, &backtrellis);
00805 }
00806 #endif
00807 f_raw++;
00808 }
00809 }
00810
00811
00812
00813 param->header.samplenum = f_raw;
00814 param->samplenum = f_raw;
00815
00816
00817
00818
00819 if (f_raw == 0) {
00820 j_printf("Error: too short input to compute delta coef! (%d frames)\n", f_raw);
00821 *backmax = finalize_1st_pass(&backtrellis, winfo, param->samplenum);
00822 } else {
00823
00824
00825 get_back_trellis_end(param, wchmm, &backtrellis);
00826 *backmax = finalize_1st_pass(&backtrellis, winfo, param->samplenum);
00827 #ifdef SP_BREAK_CURRENT_FRAME
00828 finalize_segment(&backtrellis, param, param->samplenum);
00829 #endif
00830 }
00831
00832
00833
00834 return(param);
00835 }
00836
00849 void
00850 RealTimeCMNUpdate(HTK_Param *param)
00851 {
00852 float mseclen;
00853 boolean cmn_update_p;
00854
00855
00856 if(para.cmn) {
00857 if (cmn_update) {
00858 cmn_update_p = TRUE;
00859 if (rejectshortlen > 0) {
00860
00861 mseclen = (float)param->samplenum * (float)smpPeriod * (float)fshift / 10000.0;
00862 if (mseclen < rejectshortlen) {
00863 cmn_update_p = FALSE;
00864 }
00865 }
00866 if (gmm_reject_cmn_string != NULL) {
00867
00868 if(! gmm_valid_input()) {
00869 cmn_update_p = FALSE;
00870 }
00871 }
00872 if (cmn_update_p) {
00873
00874 CMN_realtime_update();
00875 } else {
00876
00877 j_printf("CMN not updated\n");
00878 }
00879 }
00880
00881 if (cmnsave_filename) {
00882 if (CMN_save_to_file(cmnsave_filename) == FALSE) {
00883 j_printf("Warning: failed to save cmn data to \"%s\"\n", cmnsave_filename);
00884 }
00885 }
00886 }
00887 }
00888
00897 void
00898 RealTimeTerminate()
00899 {
00900 param->header.samplenum = f_raw;
00901 param->samplenum = f_raw;
00902
00903
00904
00905
00906 if (f_raw == 0) {
00907 finalize_1st_pass(&backtrellis, winfo, param->samplenum);
00908 } else {
00909
00910
00911 status_recend();
00912 get_back_trellis_end(param, wchmm, &backtrellis);
00913 finalize_1st_pass(&backtrellis, winfo, param->samplenum);
00914 #ifdef SP_BREAK_CURRENT_FRAME
00915 finalize_segment(&backtrellis, param, param->samplenum);
00916 #endif
00917 }
00918
00919
00920 free_param(param);
00921 }