Menu

programming by pocketsphinx

Help
lucy
2013-05-14
2013-05-14
  • lucy

    lucy - 2013-05-14

    I am programming by pocketsphinx to speech recognize on WIN7 32bit ,the environment is vs
    Now I meet some problem:

    My code:

    #include <stdio.h>
    #include <string.h>
    #include <time.h>
    #include <sys/types.h>
    #include <sys/timeb.h>
    #include <signal.h>
    #include <setjmp.h>
    
    #include <sphinxbase/err.h>
    #include <sphinxbase/ad.h>
    #include <sphinxbase/cont_ad.h>
    
    #include "pocketsphinx.h"
    
    static ps_decoder_t *ps;
    static cmd_ln_t *config;
    
    //sleep for specified msec   
    static void sleep_msec(int32 ms)
    {
         Sleep(ms);
    }
    
    static void recognize_from_microphone()
    {
        ad_rec_t *ad;
        int16 adbuf[4096];
        int32 k,ts,rem;
        char const *hyp;
        char const *uttid;
        cont_ad_t *cont;
        char word[256];
    
        if((ad=ad_open_dev(cmd_ln_str_r(config,"-adcdev"),(int)cmd_ln_float32_r(config,"-samprate")))==NULL)
            E_FATAL("Failed to open audio device \n");
    
        /*Initialize continuous listening module*/
        if((cont=cont_ad_init(ad,ad_read))==NULL)
            E_FATAL("Failed to initialize voice activity detection\n");
        if(ad_start_rec(ad)<0)
            E_FATAL("Failed to start recording\n");
        if(cont_ad_calib(cont)<0)
            E_FATAL("Failed to calibrate voice activity detection\n");
    
        for(;;)
        {
            /*Indicate listening for next utterance*/
            printf("READY...\n");
            fflush(stdout);
            fflush(stderr);
    
            /*Wait data for next utterance*/
            while((k=cont_ad_read(cont,adbuf,4096))==0)
                sleep_msec(100);
            if(k<0)
                E_FATAL("Failed to read audio\n");
            /*
            Non-zero amount of data received;start recognition of new utterance.
            NULL argument to uttproc_begin_utt=>automatic generation of utterance-id
            */
            if(ps_start_utt(ps,NULL)<0)
                E_FATAL("Failed to start utterance\n");
            ps_process_raw(ps,adbuf,k,FALSE,FALSE);
            printf("Listening...\n");
            fflush(stdout);
    
            /*Note timestamp for this first block of data*/
            ts=cont->read_ts;
    
            /*Decode utterance until end (marked by a "long " silence ,>1sec)*/
            for(;;)
            {
                /*Read non-silence audio data ,if any ,from continuous listening module*/
                if((k=cont_ad_read(cont,adbuf,4096))<0)
                    E_FATAL("Failed to read audio\n");
                if(k==0)
                {
                    /*No such data  available ;check current timestamp(时间戳) with most recent
                    speech to see if more than 1 sec elapsed .If so ,end of utterance.*/
                    if((cont->read_ts-ts)>DEFAULT_SAMPLES_PER_SEC)
                        break;
                }
                else
                {
                    /*New speech data received; note current timestamp*/
                    ts=cont->read_ts;
                }
                /*Decode whatever data was read above */
                rem=ps_process_raw(ps,adbuf,k,FALSE,FALSE);
                /*If no work to be done,sleep a bit*/
                if((rem==0)&&(k==0))
                    sleep_msec(20);
            }
            /*
            Utterance ended ;flush any accumulated ,unprocessed A/D data to stop
            listening until current utterance completely decoded
            */
            ad_stop_rec(ad);
            while(ad_read(ad,adbuf,4096)>=0);
            cont_ad_reset(cont);
    
            printf("Stopped listening ,please wait...\n");
            fflush(stdout);
            /*Finish decoding,obtain and print result */
            ps_end_utt(ps);
            hyp=ps_get_hyp(ps,NULL,&uttid);
            printf("%s:%s\n",uttid,hyp);
            fflush(stdout);
    
            /*Exit if the first word spoken was 再见*/
            if(hyp)
            {
                sscanf(hyp,"%s",word);
                if(strcmp(word,"再见")==0)
                    break;
            }
            /*Resume A/D recording for next utterance*/
            if (ad_start_rec(ad) < 0) 
                 E_FATAL("Failed to start recording\n"); 
        } 
    
            cont_ad_close(cont); 
            ad_close(ad); 
    } 
    
    static jmp_buf jbuf; 
    static void sighandler(int signo) 
    { 
        longjmp(jbuf, 1); 
    } 
    
    #define MODELDIR "E:/pocketsphinx/bin/Release"
    int main(int argc, char* argv[])
    {
    
        config=cmd_ln_init(NULL,ps_args(),TRUE,
            "-hmm",MODELDIR "/tdt_sc_8k",
            "-lm",MODELDIR "/7646.lm",
            "-dict",MODELDIR "/7646.dic",
            NULL);
        if(config==NULL)
            return 1;
        ps=ps_init(config);
        if(ps==NULL)
            return 1;
        signal(SIGINT,&sighandler);
        if(setjmp(jbuf)==0)
            recognize_from_microphone();
        ps_free(ps);
        return 0;
    }
    

    when run comes to error:

    INFO: ngram_search_fwdtree.c(326): after: max nonroot chan increased to 144
    INFO: ngram_search_fwdtree.c(338): after: 6 root, 16 non-root channels, 7 single
    -phone words
    INFO: ngram_search_fwdflat.c(156): fwdflat: min_ef_width = 4, max_sf_win = 25
    ERROR: "cmd_ln.c", line 942: Unknown argument: -adcdev
    Allocating 32 buffers of 2500 samples each
    READY...
    

    But it can recognize well.
    I have no ideas about this error ,please tell me how to solve it .

     

    Last edit: Nickolay V. Shmyrev 2013-05-14
  • Nickolay V. Shmyrev

    I have no ideas about this error ,please tell me how to solve it .

    In this line

    if((ad=ad_open_dev(cmd_ln_str_r(config,"-adcdev"),(int)cmd_ln_float32_r(config,"-samprate")))==NUL
    

    You request config option not described in config init:

     config=cmd_ln_init(NULL,ps_args(),TRUE,
    

    You need to add ''adcdev'' option description to ps_args array or just use NULL instead of calling ''cmd_ln_str_r(config,"-adcdev")''.

     

Log in to post a comment.

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.