00001
00117
00118
00119
00120
00121
00122
00123
00124 #include <julius/julius.h>
00125
00126 #undef RDEBUG
00127
00128
00158 static void
00159 init_param(MFCCCalc *mfcc)
00160 {
00161 Value *para;
00162
00163 para = mfcc->para;
00164
00165
00166
00167 mfcc->param->header.samptype = F_MFCC;
00168 if (para->delta) mfcc->param->header.samptype |= F_DELTA;
00169 if (para->acc) mfcc->param->header.samptype |= F_ACCL;
00170 if (para->energy) mfcc->param->header.samptype |= F_ENERGY;
00171 if (para->c0) mfcc->param->header.samptype |= F_ZEROTH;
00172 if (para->absesup) mfcc->param->header.samptype |= F_ENERGY_SUP;
00173 if (para->cmn) mfcc->param->header.samptype |= F_CEPNORM;
00174
00175 mfcc->param->header.wshift = para->smp_period * para->frameshift;
00176 mfcc->param->header.sampsize = para->veclen * sizeof(VECT);
00177 mfcc->param->veclen = para->veclen;
00178
00179
00180 if (param_alloc(mfcc->param, 1, mfcc->param->veclen) == FALSE) {
00181 j_internal_error("ERROR: segmented: failed to allocate memory for rest param\n");
00182 }
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192 }
00193
00221 boolean
00222 RealTimeInit(Recog *recog)
00223 {
00224 Value *para;
00225 Jconf *jconf;
00226 RealBeam *r;
00227 MFCCCalc *mfcc;
00228
00229
00230 jconf = recog->jconf;
00231 r = &(recog->real);
00232
00233
00234
00235 for(mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
00236 if (mfcc->frontend.ssload_filename && mfcc->frontend.ssbuf == NULL) {
00237 if ((mfcc->frontend.ssbuf = new_SS_load_from_file(mfcc->frontend.ssload_filename, &(mfcc->frontend.sslen))) == NULL) {
00238 jlog("ERROR: failed to read \"%s\"\n", mfcc->frontend.ssload_filename);
00239 return FALSE;
00240 }
00241
00242 if (mfcc->frontend.sslen != mfcc->wrk->bflen) {
00243 jlog("ERROR: noise spectrum length not match\n");
00244 return FALSE;
00245 }
00246 mfcc->wrk->ssbuf = mfcc->frontend.ssbuf;
00247 mfcc->wrk->ssbuflen = mfcc->frontend.sslen;
00248 mfcc->wrk->ss_alpha = mfcc->frontend.ss_alpha;
00249 mfcc->wrk->ss_floor = mfcc->frontend.ss_floor;
00250 }
00251 }
00252
00253 for(mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
00254
00255 para = mfcc->para;
00256
00257
00258
00259 if (para->energy && para->enormal) energy_max_init(&(mfcc->ewrk));
00260
00261
00262 if (para->delta) mfcc->db = WMP_deltabuf_new(para->baselen, para->delWin);
00263 if (para->acc) mfcc->ab = WMP_deltabuf_new(para->baselen * 2, para->accWin);
00264
00265
00266 mfcc->tmpmfcc = (VECT *)mymalloc(sizeof(VECT) * para->vecbuflen);
00267
00268
00269 if (para->cmn) mfcc->cmn.wrk = CMN_realtime_new(para->mfcc_dim, mfcc->cmn.map_weight);
00270
00271
00272 if (mfcc->cmn.load_filename) {
00273 if (para->cmn) {
00274 if ((mfcc->cmn.loaded = CMN_load_from_file(mfcc->cmn.wrk, mfcc->cmn.load_filename))== FALSE) {
00275 jlog("WARNING: failed to read initial cepstral mean from \"%s\", do flat start\n", mfcc->cmn.load_filename);
00276 }
00277 } else {
00278 jlog("WARNING: CMN not required on AM, file \"%s\" ignored\n", mfcc->cmn.load_filename);
00279 }
00280 }
00281
00282 }
00283
00284
00285 r->maxframelen = MAXSPEECHLEN / recog->jconf->input.frameshift;
00286
00287
00288 r->windowlen = recog->jconf->input.framesize + 1;
00289
00290
00291 r->window = mymalloc(sizeof(SP16) * r->windowlen);
00292
00293 return TRUE;
00294 }
00295
00320 void
00321 reset_mfcc(Recog *recog)
00322 {
00323 Value *para;
00324 PROCESS_AM *am;
00325 MFCCCalc *mfcc;
00326 RealBeam *r;
00327
00328 r = &(recog->real);
00329
00330
00331
00332 for(mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
00333
00334 para = mfcc->para;
00335
00336
00337
00338 if (para->energy && para->enormal) energy_max_prepare(&(mfcc->ewrk), para);
00339
00340
00341 if (para->delta) WMP_deltabuf_prepare(mfcc->db);
00342 if (para->acc) WMP_deltabuf_prepare(mfcc->ab);
00343 }
00344
00345
00346
00347 for(am=recog->amlist;am;am=am->next) {
00348 outprob_prepare(&(am->hmmwrk), r->maxframelen);
00349 }
00350 }
00351
00378 boolean
00379 RealTimePipeLinePrepare(Recog *recog)
00380 {
00381 RealBeam *r;
00382 PROCESS_AM *am;
00383 MFCCCalc *mfcc;
00384 #ifdef SPSEGMENT_NAIST
00385 RecogProcess *p;
00386 #endif
00387
00388 r = &(recog->real);
00389
00390
00391
00392 r->windownum = 0;
00393
00394 for(mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
00395
00396
00397 init_param(mfcc);
00398
00399
00400 mfcc->f = 0;
00401
00402
00403 if (mfcc->para->cmn) CMN_realtime_prepare(mfcc->cmn.wrk);
00404 }
00405
00406
00407 for(am=recog->amlist;am;am=am->next) {
00408 if (!check_param_coherence(am->hmminfo, am->mfcc->param)) {
00409 jlog("ERROR: input parameter type does not match AM\n");
00410 return FALSE;
00411 }
00412 }
00413
00414
00415
00416 reset_mfcc(recog);
00417
00418 #ifdef BACKEND_VAD
00419 if (recog->jconf->decodeopt.segment) {
00420
00421 spsegment_init(recog);
00422 }
00423 #else
00424 recog->triggered = FALSE;
00425 #endif
00426
00427 return TRUE;
00428 }
00429
00462 boolean
00463 RealTimeMFCC(MFCCCalc *mfcc, SP16 *window, int windowlen)
00464 {
00465 int i;
00466 boolean ret;
00467 VECT *tmpmfcc;
00468 Value *para;
00469
00470 tmpmfcc = mfcc->tmpmfcc;
00471 para = mfcc->para;
00472
00473
00474
00475 for (i=0; i < windowlen; i++) {
00476 mfcc->wrk->bf[i+1] = (float) window[i];
00477 }
00478 WMP_calc(mfcc->wrk, tmpmfcc, para);
00479
00480 if (para->energy && para->enormal) {
00481
00482
00483
00484
00485
00486
00487
00488
00489 tmpmfcc[para->baselen-1] = energy_max_normalize(&(mfcc->ewrk), tmpmfcc[para->baselen-1], para);
00490 }
00491
00492 if (para->delta) {
00493
00494
00495 ret = WMP_deltabuf_proceed(mfcc->db, tmpmfcc);
00496 #ifdef RDEBUG
00497 printf("DeltaBuf: ret=%d, status=", ret);
00498 for(i=0;i<mfcc->db->len;i++) {
00499 printf("%d", mfcc->db->is_on[i]);
00500 }
00501 printf(", nextstore=%d\n", mfcc->db->store);
00502 #endif
00503
00504
00505
00506 if (! ret) {
00507 return FALSE;
00508 }
00509
00510
00511
00512 memcpy(tmpmfcc, mfcc->db->vec, sizeof(VECT) * para->baselen * 2);
00513 }
00514
00515 if (para->acc) {
00516
00517
00518
00519
00520 ret = WMP_deltabuf_proceed(mfcc->ab, tmpmfcc);
00521 #ifdef RDEBUG
00522 printf("AccelBuf: ret=%d, status=", ret);
00523 for(i=0;i<mfcc->ab->len;i++) {
00524 printf("%d", mfcc->ab->is_on[i]);
00525 }
00526 printf(", nextstore=%d\n", mfcc->ab->store);
00527 #endif
00528
00529
00530
00531 if (! ret) {
00532 return FALSE;
00533 }
00534
00535
00536
00537
00538
00539
00540 memcpy(tmpmfcc, mfcc->ab->vec, sizeof(VECT) * para->baselen * 2);
00541 memcpy(&(tmpmfcc[para->baselen*2]), &(mfcc->ab->vec[para->baselen*3]), sizeof(VECT) * para->baselen);
00542 }
00543
00544 #ifdef POWER_REJECT
00545 if (para->energy || para->c0) {
00546 mfcc->avg_power += tmpmfcc[para->baselen-1];
00547 }
00548 #endif
00549
00550 if (para->delta && (para->energy || para->c0) && para->absesup) {
00551
00552
00553 memmove(&(tmpmfcc[para->baselen-1]), &(tmpmfcc[para->baselen]), sizeof(VECT) * (para->vecbuflen - para->baselen));
00554 }
00555
00556
00557
00558
00559
00560
00561 if (para->cmn) CMN_realtime(mfcc->cmn.wrk, tmpmfcc);
00562
00563 return TRUE;
00564 }
00565
00634 int
00635 RealTimePipeLine(SP16 *Speech, int nowlen, Recog *recog)
00636 {
00637 int i, now;
00638 MFCCCalc *mfcc;
00639 RealBeam *r;
00640 int maxf;
00641 boolean ok_p;
00642
00643 RecogProcess *p;
00644 PROCESS_AM *am;
00645 int rewind_frame;
00646 boolean reprocess;
00647 boolean all_false, all_true;
00648
00649 r = &(recog->real);
00650
00651
00652
00653
00654
00655
00656 now = 0;
00657
00658
00659
00660 r->last_is_segmented = FALSE;
00661
00662 #ifdef RDEBUG
00663 printf("got %d samples\n", nowlen);
00664 #endif
00665
00666 while (now < nowlen) {
00667
00668
00669 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
00670 if (mfcc->f >= r->maxframelen) return(1);
00671 }
00672
00673
00674 for(i = min(r->windowlen - r->windownum, nowlen - now); i > 0 ; i--)
00675 r->window[r->windownum++] = (float) Speech[now++];
00676
00677
00678
00679
00680 if (r->windownum < r->windowlen) break;
00681 #ifdef RDEBUG
00682
00683
00684
00685 #endif
00686
00687 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
00688 mfcc->valid = FALSE;
00689
00690
00691
00692 if ((*(recog->calc_vector))(mfcc, r->window, r->windowlen)) {
00693 mfcc->valid = TRUE;
00694
00695
00696 if (param_alloc(mfcc->param, mfcc->f + 1, mfcc->param->veclen) == FALSE) {
00697 jlog("ERROR: failed to allocate memory for incoming MFCC vectors\n");
00698 return -1;
00699 }
00700 memcpy(mfcc->param->parvec[mfcc->f], mfcc->tmpmfcc, sizeof(VECT) * mfcc->param->veclen);
00701 #ifdef RDEBUG
00702 printf("DeltaBuf: %02d: got frame %d\n", mfcc->id, mfcc->f);
00703 #endif
00704 }
00705 }
00706
00707
00708 ok_p = FALSE;
00709 maxf = 0;
00710 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
00711 if (!mfcc->valid) continue;
00712 if (maxf < mfcc->f) maxf = mfcc->f;
00713 if (mfcc->f == 0) {
00714 ok_p = TRUE;
00715 }
00716 }
00717 if (ok_p && maxf == 0) {
00718
00719 if (recog->jconf->decodeopt.segment) {
00720 #ifdef BACKEND_VAD
00721
00722 #else
00723 if (!recog->process_segment) {
00724 callback_exec(CALLBACK_EVENT_RECOGNITION_BEGIN, recog);
00725 }
00726 callback_exec(CALLBACK_EVENT_SEGMENT_BEGIN, recog);
00727 callback_exec(CALLBACK_EVENT_PASS1_BEGIN, recog);
00728 recog->triggered = TRUE;
00729 #endif
00730 } else {
00731 callback_exec(CALLBACK_EVENT_RECOGNITION_BEGIN, recog);
00732 callback_exec(CALLBACK_EVENT_PASS1_BEGIN, recog);
00733 recog->triggered = TRUE;
00734 }
00735 }
00736
00737
00738 switch (decode_proceed(recog)) {
00739 case -1:
00740 return -1;
00741 break;
00742 case 0:
00743 break;
00744 case 1:
00745
00746
00747 r->last_is_segmented = TRUE;
00748 if (recog->jconf->decodeopt.segment) {
00749
00750
00751
00752
00753 r->rest_len = nowlen - now;
00754 if (r->rest_len > 0) {
00755
00756 if (r->rest_Speech == NULL) {
00757 r->rest_alloc_len = r->rest_len;
00758 r->rest_Speech = (SP16 *)mymalloc(sizeof(SP16)*r->rest_alloc_len);
00759 } else if (r->rest_alloc_len < r->rest_len) {
00760 r->rest_alloc_len = r->rest_len;
00761 r->rest_Speech = (SP16 *)myrealloc(r->rest_Speech, sizeof(SP16)*r->rest_alloc_len);
00762 }
00763 memcpy(r->rest_Speech, &(Speech[now]), sizeof(SP16) * r->rest_len);
00764 }
00765 }
00766
00767
00768 return 1;
00769 }
00770
00771 #ifdef BACKEND_VAD
00772
00773 if (recog->jconf->decodeopt.segment) {
00774 if (recog->triggered == FALSE) {
00775 if (spsegment_trigger_sync(recog)) {
00776 if (!recog->process_segment) {
00777 callback_exec(CALLBACK_EVENT_RECOGNITION_BEGIN, recog);
00778 }
00779 callback_exec(CALLBACK_EVENT_SEGMENT_BEGIN, recog);
00780 callback_exec(CALLBACK_EVENT_PASS1_BEGIN, recog);
00781 recog->triggered = TRUE;
00782 }
00783 }
00784 }
00785 #endif
00786
00787 if (spsegment_need_restart(recog, &rewind_frame, &reprocess) == TRUE) {
00788
00789 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
00790 if (!mfcc->valid) continue;
00791 mfcc->param->header.samplenum = mfcc->f + 1;
00792 mfcc->param->samplenum = mfcc->f + 1;
00793 }
00794
00795 spsegment_restart_mfccs(recog, rewind_frame, reprocess);
00796
00797 recog->adin->rehash = TRUE;
00798
00799 for(am=recog->amlist;am;am=am->next) {
00800 outprob_prepare(&(am->hmmwrk), am->mfcc->param->samplenum);
00801 }
00802 if (reprocess) {
00803
00804 while(1) {
00805 ok_p = TRUE;
00806 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
00807 if (! mfcc->valid) continue;
00808 mfcc->f++;
00809 if (mfcc->f < mfcc->param->samplenum) {
00810 mfcc->valid = TRUE;
00811 ok_p = FALSE;
00812 } else {
00813 mfcc->valid = FALSE;
00814 }
00815 }
00816 if (ok_p) {
00817
00818
00819 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
00820 if (! mfcc->valid) continue;
00821 mfcc->f--;
00822 }
00823 break;
00824 }
00825
00826 switch (decode_proceed(recog)) {
00827 case -1:
00828 return -1;
00829 break;
00830 case 0:
00831 break;
00832 case 1:
00833
00834 break;
00835 }
00836
00837 callback_exec(CALLBACK_EVENT_PASS1_FRAME, recog);
00838 }
00839 }
00840 }
00841
00842
00843 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
00844 if (mfcc->valid) {
00845 callback_exec(CALLBACK_EVENT_PASS1_FRAME, recog);
00846 break;
00847 }
00848 }
00849
00850
00851
00852 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
00853 if (!mfcc->valid) continue;
00854 mfcc->f++;
00855 }
00856
00857
00858
00859 memmove(r->window, &(r->window[recog->jconf->input.frameshift]), sizeof(SP16) * (r->windowlen - recog->jconf->input.frameshift));
00860 r->windownum -= recog->jconf->input.frameshift;
00861 }
00862
00863
00864
00865
00866
00867 return(0);
00868 }
00869
00903 int
00904 RealTimeResume(Recog *recog)
00905 {
00906 MFCCCalc *mfcc;
00907 RealBeam *r;
00908 boolean ok_p;
00909 #ifdef SPSEGMENT_NAIST
00910 RecogProcess *p;
00911 #endif
00912
00913 r = &(recog->real);
00914
00915
00916
00917 reset_mfcc(recog);
00918
00919
00920
00921 for(mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
00922 if (mfcc->param->samplenum == 0) mfcc->valid = FALSE;
00923 else mfcc->valid = TRUE;
00924 #ifdef RDEBUG
00925 printf("Resume: %02d: f=%d\n", mfcc->id, mfcc->mfcc->param->samplenum-1);
00926 #endif
00927
00928
00929 mfcc->f = 0;
00930 }
00931
00932 #ifdef BACKEND_VAD
00933 if (recog->jconf->decodeopt.segment) {
00934 spsegment_init(recog);
00935 }
00936
00937 #else
00938 recog->triggered = FALSE;
00939 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
00940 if (!mfcc->valid) continue;
00941 callback_exec(CALLBACK_EVENT_SEGMENT_BEGIN, recog);
00942 callback_exec(CALLBACK_EVENT_PASS1_BEGIN, recog);
00943 recog->triggered = TRUE;
00944 break;
00945 }
00946 #endif
00947
00948
00949
00950
00951 while(1) {
00952 ok_p = TRUE;
00953 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
00954 if (! mfcc->valid) continue;
00955 if (mfcc->f < mfcc->param->samplenum) {
00956 mfcc->valid = TRUE;
00957 ok_p = FALSE;
00958 } else {
00959 mfcc->valid = FALSE;
00960 }
00961 }
00962 if (ok_p) {
00963
00964
00965 break;
00966 }
00967
00968
00969 switch (decode_proceed(recog)) {
00970 case -1:
00971 return -1;
00972 break;
00973 case 0:
00974 break;
00975 case 1:
00976
00977 r->last_is_segmented = TRUE;
00978 return 1;
00979 }
00980
00981 #ifdef BACKEND_VAD
00982
00983 if (recog->jconf->decodeopt.segment) {
00984 if (recog->triggered == FALSE) {
00985 if (spsegment_trigger_sync(recog)) {
00986 callback_exec(CALLBACK_EVENT_SEGMENT_BEGIN, recog);
00987 callback_exec(CALLBACK_EVENT_PASS1_BEGIN, recog);
00988 recog->triggered = TRUE;
00989 }
00990 }
00991 }
00992 #endif
00993
00994
00995 callback_exec(CALLBACK_EVENT_PASS1_FRAME, recog);
00996
00997
00998
00999 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
01000 if (!mfcc->valid) continue;
01001 mfcc->f++;
01002 }
01003
01004 }
01005
01006
01007 memmove(r->window, &(r->window[recog->jconf->input.frameshift]), sizeof(SP16) * (r->windowlen - recog->jconf->input.frameshift));
01008 r->windownum -= recog->jconf->input.frameshift;
01009
01010
01011
01012
01013
01014 if (r->rest_len > 0) {
01015 return(RealTimePipeLine(r->rest_Speech, r->rest_len, recog));
01016 }
01017
01018
01019
01020 return 0;
01021
01022 }
01023
01024
01058 boolean
01059 RealTimeParam(Recog *recog)
01060 {
01061 boolean ret1, ret2;
01062 RealBeam *r;
01063 int ret;
01064 int maxf;
01065 boolean ok_p;
01066 MFCCCalc *mfcc;
01067 Value *para;
01068 #ifdef RDEBUG
01069 int i;
01070 #endif
01071
01072 r = &(recog->real);
01073
01074 if (r->last_is_segmented) {
01075
01076
01077
01078
01079
01080
01081
01082 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
01083 mfcc->param->header.samplenum = mfcc->f + 1;
01084 mfcc->param->samplenum = mfcc->f + 1;
01085 }
01086 decode_end_segmented(recog);
01087
01088
01089
01090 return(TRUE);
01091 }
01092
01093
01094
01095 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
01096 if (mfcc->para->delta || mfcc->para->acc) {
01097 mfcc->valid = TRUE;
01098 } else {
01099 mfcc->valid = FALSE;
01100 }
01101 }
01102
01103
01104 while (1) {
01105
01106
01107 ok_p = FALSE;
01108 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
01109 if (mfcc->valid) {
01110 ok_p = TRUE;
01111 break;
01112 }
01113 }
01114 if (!ok_p) break;
01115
01116
01117 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
01118
01119 para = mfcc->para;
01120
01121 if (! mfcc->valid) continue;
01122
01123
01124 ret1 = WMP_deltabuf_flush(mfcc->db);
01125 #ifdef RDEBUG
01126 printf("DeltaBufLast: ret=%d, status=", ret1);
01127 for(i=0;i<mfcc->db->len;i++) {
01128 printf("%d", mfcc->db->is_on[i]);
01129 }
01130 printf(", nextstore=%d\n", mfcc->db->store);
01131 #endif
01132 if (ret1) {
01133
01134 if (para->energy && para->absesup) {
01135 memcpy(mfcc->tmpmfcc, mfcc->db->vec, sizeof(VECT) * (para->baselen - 1));
01136 memcpy(&(mfcc->tmpmfcc[para->baselen-1]), &(mfcc->db->vec[para->baselen]), sizeof(VECT) * para->baselen);
01137 } else {
01138 memcpy(mfcc->tmpmfcc, mfcc->db->vec, sizeof(VECT) * para->baselen * 2);
01139 }
01140 if (para->acc) {
01141
01142 ret2 = WMP_deltabuf_proceed(mfcc->ab, mfcc->tmpmfcc);
01143 #ifdef RDEBUG
01144 printf("AccelBuf: ret=%d, status=", ret2);
01145 for(i=0;i<mfcc->ab->len;i++) {
01146 printf("%d", mfcc->ab->is_on[i]);
01147 }
01148 printf(", nextstore=%d\n", mfcc->ab->store);
01149 #endif
01150 if (ret2) {
01151
01152 memcpy(mfcc->tmpmfcc, mfcc->ab->vec, sizeof(VECT) * (para->veclen - para->baselen));
01153 memcpy(&(mfcc->tmpmfcc[para->veclen - para->baselen]), &(mfcc->ab->vec[para->veclen - para->baselen]), sizeof(VECT) * para->baselen);
01154 } else {
01155
01156
01157 continue;
01158 }
01159 }
01160
01161 } else {
01162
01163
01164 if (para->acc) {
01165
01166 ret2 = WMP_deltabuf_flush(mfcc->ab);
01167 #ifdef RDEBUG
01168 printf("AccelBuf: ret=%d, status=", ret2);
01169 for(i=0;i<mfcc->ab->len;i++) {
01170 printf("%d", mfcc->ab->is_on[i]);
01171 }
01172 printf(", nextstore=%d\n", mfcc->ab->store);
01173 #endif
01174 if (ret2) {
01175
01176 memcpy(mfcc->tmpmfcc, mfcc->ab->vec, sizeof(VECT) * (para->veclen - para->baselen));
01177 memcpy(&(mfcc->tmpmfcc[para->veclen - para->baselen]), &(mfcc->ab->vec[para->veclen - para->baselen]), sizeof(VECT) * para->baselen);
01178 } else {
01179
01180 mfcc->valid = FALSE;
01181 continue;
01182 }
01183 } else {
01184
01185 mfcc->valid = FALSE;
01186 continue;
01187 }
01188 }
01189
01190 if(para->cmn) CMN_realtime(mfcc->cmn.wrk, mfcc->tmpmfcc);
01191 if (param_alloc(mfcc->param, mfcc->f + 1, mfcc->param->veclen) == FALSE) {
01192 jlog("ERROR: failed to allocate memory for incoming MFCC vectors\n");
01193 return FALSE;
01194 }
01195
01196 memcpy(mfcc->param->parvec[mfcc->f], mfcc->tmpmfcc, sizeof(VECT) * mfcc->param->veclen);
01197 }
01198
01199
01200 ok_p = FALSE;
01201 maxf = 0;
01202 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
01203 if (!mfcc->valid) continue;
01204 if (maxf < mfcc->f) maxf = mfcc->f;
01205 if (mfcc->f == 0) {
01206 ok_p = TRUE;
01207 }
01208 }
01209
01210 if (ok_p && maxf == 0) {
01211
01212 if (recog->jconf->decodeopt.segment) {
01213 #ifdef BACKEND_VAD
01214
01215 #else
01216 if (!recog->process_segment) {
01217 callback_exec(CALLBACK_EVENT_RECOGNITION_BEGIN, recog);
01218 }
01219 callback_exec(CALLBACK_EVENT_SEGMENT_BEGIN, recog);
01220 callback_exec(CALLBACK_EVENT_PASS1_BEGIN, recog);
01221 recog->triggered = TRUE;
01222 #endif
01223 } else {
01224 callback_exec(CALLBACK_EVENT_RECOGNITION_BEGIN, recog);
01225 callback_exec(CALLBACK_EVENT_PASS1_BEGIN, recog);
01226 recog->triggered = TRUE;
01227 }
01228 }
01229
01230
01231 ret = decode_proceed(recog);
01232 if (ret == -1) {
01233 return -1;
01234 } else if (ret == 1) {
01235
01236 break;
01237 }
01238
01239 #ifdef BACKEND_VAD
01240
01241 if (recog->jconf->decodeopt.segment) {
01242 if (recog->triggered == FALSE) {
01243 if (spsegment_trigger_sync(recog)) {
01244 if (!recog->process_segment) {
01245 callback_exec(CALLBACK_EVENT_RECOGNITION_BEGIN, recog);
01246 }
01247 callback_exec(CALLBACK_EVENT_SEGMENT_BEGIN, recog);
01248 callback_exec(CALLBACK_EVENT_PASS1_BEGIN, recog);
01249 recog->triggered = TRUE;
01250 }
01251 }
01252 }
01253 #endif
01254
01255
01256 callback_exec(CALLBACK_EVENT_PASS1_FRAME, recog);
01257
01258
01259 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
01260 if (! mfcc->valid) continue;
01261 mfcc->f++;
01262 if (mfcc->f > r->maxframelen) mfcc->valid = FALSE;
01263 }
01264 }
01265
01266
01267 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
01268 mfcc->param->header.samplenum = mfcc->f;
01269 mfcc->param->samplenum = mfcc->f;
01270 }
01271
01272 decode_end(recog);
01273
01274 return(TRUE);
01275 }
01276
01295 void
01296 RealTimeCMNUpdate(MFCCCalc *mfcc, Recog *recog)
01297 {
01298 float mseclen;
01299 boolean cmn_update_p;
01300 Value *para;
01301 Jconf *jconf;
01302 RecogProcess *r;
01303
01304 jconf = recog->jconf;
01305 para = mfcc->para;
01306
01307
01308 if(para->cmn) {
01309 if (mfcc->cmn.update) {
01310 cmn_update_p = TRUE;
01311 for(r=recog->process_list;r;r=r->next) {
01312 if (!r->live) continue;
01313 if (r->am->mfcc != mfcc) continue;
01314 if (r->result.status < 0) {
01315 cmn_update_p = FALSE;
01316 break;
01317 }
01318 }
01319 if (cmn_update_p) {
01320
01321 CMN_realtime_update(mfcc->cmn.wrk);
01322 } else {
01323
01324 if (verbose_flag) {
01325 #ifdef BACKEND_VAD
01326 if (!recog->jconf->decodeopt.segment || recog->triggered) {
01327 jlog("STAT: skip CMN parameter update since last input was invalid\n");
01328 }
01329 #else
01330 jlog("STAT: skip CMN parameter update since last input was invalid\n");
01331 #endif
01332 }
01333 }
01334 }
01335
01336 if (mfcc->cmn.save_filename) {
01337 if (CMN_save_to_file(mfcc->cmn.wrk, mfcc->cmn.save_filename) == FALSE) {
01338 jlog("WARNING: failed to save CMN parameter to \"%s\"\n", mfcc->cmn.save_filename);
01339 }
01340 }
01341 }
01342 }
01343
01356 void
01357 RealTimeTerminate(Recog *recog)
01358 {
01359 MFCCCalc *mfcc;
01360
01361 for (mfcc = recog->mfcclist; mfcc; mfcc = mfcc->next) {
01362 mfcc->param->header.samplenum = mfcc->f;
01363 mfcc->param->samplenum = mfcc->f;
01364 }
01365
01366
01367 decode_end(recog);
01368 }
01369
01381 void
01382 realbeam_free(Recog *recog)
01383 {
01384 RealBeam *r;
01385
01386 r = &(recog->real);
01387
01388 if (recog->real.window) {
01389 free(recog->real.window);
01390 recog->real.window = NULL;
01391 }
01392 if (recog->real.rest_Speech) {
01393 free(recog->real.rest_Speech);
01394 recog->real.rest_Speech = NULL;
01395 }
01396 }
01397
01398