错误:无法读取音频(pocketsphinx + espeak)

时间:2018-05-03 07:11:09

标签: error-handling callback pocketsphinx espeak

我试图通过pocketsphinx识别来自麦克风的声音并通过espeak传递它来表达它在实时/连续语音中识别的内容(我的意思是用户说出一个单词/句子,pocketsphinx将会识别它并在char* hyp内收集它,然后将hyp传递给使用speech()的{​​{1}}函数来说明espeak内的内容。但我不是&# 39;我知道为什么会得到

  

无法读取音频

在这部分代码中:

hyp

这是完整的代码:

if ((k = ad_read(ad, adbuf, 2048)) < 0)
    E_FATAL("Failed to read audio\n");

注意:我使用了static ps_decoder_t *ps; static cmd_ln_t *config; static FILE *rawfd; ad_rec_t *ad; char *hyp; espeak_POSITION_TYPE position_type; espeak_AUDIO_OUTPUT output; char *path=NULL; int Buflength = 2048, Options=0; void* user_data; char Voice[] = {"English"}; unsigned int Size,position=0, end_position=0, flags=espeakCHARS_AUTO, *unique_identifier; t_espeak_callback *SynthCallback; espeak_PARAMETER Parm; static void after_speech() { espeak_Synth( hyp, Size, position, position_type, end_position, flags,unique_identifier, user_data ); espeak_Synchronize( ); ad_start_rec(ad); } int receive_espeak_events(short *wav, int numsamples, espeak_EVENT *event) { while (event->type != espeakEVENT_LIST_TERMINATED) { if (event->type == espeakEVENT_MSG_TERMINATED) { after_speech(); } ++event; } return 0; } static void initFuncs() { espeak_Initialize(output, Buflength, path, AUDIO_OUTPUT_PLAYBACK ); //AUDIO_OUTPUT_SYNCHRONOUS ); //Options ); espeak_SetVoiceByName(Voice); } static void sleep_msec(int32 ms) { struct timeval tmo; tmo.tv_sec = 0; tmo.tv_usec = ms * 1000; select(0, NULL, NULL, NULL, &tmo); } static void speech(char* hyp) { Size = strlen(hyp)+1; espeak_SetSynthCallback(receive_espeak_events); } static void recognize_from_microphone() { int16 adbuf[2048]; uint8 utt_started, in_speech; int32 k; 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"); if (ad_start_rec(ad) < 0) E_FATAL("Failed to start recording\n"); if (ps_start_utt(ps) < 0) E_FATAL("Failed to start utterance\n"); utt_started = FALSE; E_INFO("Ready....\n"); for (;;) { if ((k = ad_read(ad, adbuf, 2048)) < 0) E_FATAL("Failed to read audio\n"); ps_process_raw(ps, adbuf, k, FALSE, FALSE); in_speech = ps_get_in_speech(ps); if (in_speech && !utt_started) { utt_started = TRUE; E_INFO("Listening...\n"); } if (!in_speech && utt_started) { ps_end_utt(ps); hyp = (char*)ps_get_hyp(ps, NULL ); if (hyp != NULL) { ad_stop_rec(ad); speech(hyp); printf("%s\n",hyp); fflush(stdout); // sleep_msec(3000); } if (ps_start_utt(ps) < 0) E_FATAL("Failed to start utterance\n"); utt_started = FALSE; E_INFO("Ready....\n"); } }//for loop ad_close(ad); } int main(int argc, char *argv[]) { initFuncs(); config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", "/home/m/myrobot3/robot/model_parameters/robot.cd_cont_1000", "-lm","/home/m/myrobot3/robot/etc/robot.lm.bin", "-dict", "/home/m/myrobot3/robot/etc/robot.dic", NULL); ps = ps_init(config); recognize_from_microphone(); ps_free(ps); cmd_ln_free_r(config); return 0; } ,因为我必须espeak_SetSynthCallback(receive_espeak_events); pocketphinx正在收听新的声音,直到pause结束讲述之前识别的声音。所以我在espeak循环中找到新的ad_stop_rec(ad);后尝试hyp(),然后在for(;;)回调中发生ad_start_rec(ad);时尝试espeakEVENT_MSG_TERMINATED

0 个答案:

没有答案