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 }