0

我现在正在使用 pocketSphinx 来构建一个 C 库。问题是,如果我将 main 函数与所有头文件(如下代码)放在一起,它工作得很好。然后我做了一个静态库(代码不包括主函数)。但是当我试图在另一个主函数中使用这个库时,错误发生了:

/usr/local/include/sphinxbase/ad.h:106:27:致命错误:sphinx_config.h:没有这样的文件或目录

...编译时。我认为这可能是与我的头文件路径有关的问题。

谁能告诉我如何解决这个问题?

下面的代码运行良好:

//system headerfiles

#include <stdio.h>  
#include <string.h>  
#include <sys/types.h>  
#include <sys/time.h>  
#include <signal.h>  
#include <setjmp.h>  

//用于录制和播放的通用实时音频接口

#include <sphinxbase/ad.h>  
#include <sphinxbase/cont_ad.h>  

//pocketsphinx 头文件

#include <sphinxbase/err.h>      
#include "pocketsphinx.h"

static ps_decoder_t *ps;  
static cmd_ln_t *config;  

static void print_word_times(int32 start)  
{  
ps_seg_t *iter = ps_seg_iter(ps, NULL);  
while (iter != NULL)   
{  
    int32 sf, ef, pprob;  
    float conf;  

    ps_seg_frames (iter, &sf, &ef);  
    pprob = ps_seg_prob (iter, NULL, NULL, NULL);  
    conf = logmath_exp(ps_get_logmath(ps), pprob);  
    printf ("%s %f %f %f\n", ps_seg_word (iter), (sf + start) / 100.0, (ef + start) /     100.0, conf);  
    iter = ps_seg_next (iter);  
}  
}  

/* Sleep for specified msec */  
static void sleep_msec(int32 ms)  
{  
struct timeval tmo;  

tmo.tv_sec = 0;  
tmo.tv_usec = ms * 1000;  //original was 1000 try to modify here to reduce                              the sleeping time
select(0, NULL, NULL, NULL, &tmo);  
}  



char const *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 top 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");  


    /* 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 speech 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 and 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);  

        /* 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);  

return hyp;
}  

static jmp_buf jbuf;  
static void sighandler(int signo)  
{  
    longjmp(jbuf, 1);  
}

int main(int argc, char *argv[])  
{   
char const *word; 
    config = cmd_ln_init(NULL, ps_args(), TRUE,
"-hmm", MODELDIR "/hmm/en_US/hub4wsj_sc_8k",
"-lm", "/home/nieluming/Desktop/speech_lib/models/2253.lm",
"-dict", "/home/nieluming/Desktop/speech_lib/models/2253.dic",
NULL);  

    if (config == NULL)  
        return 1;  


    ps = ps_init(config);  
    if (ps == NULL)  
        return 1;  

    signal(SIGINT, &sighandler);  
    if (setjmp(jbuf) == 0)   
        word = recognize_from_microphone();  

printf("%s\n", word);

        ps_free(ps);  
    return 0;  
 }

正如我所说,当我用上面的代码和如下的头文件制作一个库时:

#ifndef MIC_RECOG_H
#define MIC_RECOG_H

char const *recognize_from_microphone();

#endif

使用这个库时会发生“没有头文件问题”。

4

1 回答 1

2

添加-I/usr/local/include/sphinxbase到正在使用的编译器选项集。

-I <path>添加path到正在搜索的路径集以查找要包含的文件。

于 2013-06-13T09:00:30.023 回答