如何在代码中通过麦克风使用PocketSphinx进行语音识别

时间:2019-07-15 16:22:43

标签: c++ pocketsphinx

请告诉我..我应该如何用C ++编写,我知道命令行可以使用麦克风。但是我不知道如何通过代码将其写出。我在此找不到任何相关的api。口袋狮身人面像。

1 个答案:

答案 0 :(得分:0)

据我所知,没有用于Pocketsphinx的c ++ API,但是您可以使用this C API。

示例代码:

#include <iostream>
#include <string>
#include <pocketsphinx.h>
#include <sphinxbase/ad.h>
#include <sphinxbase/err.h>

using namespace std;

string recognize_from_microphone();

ps_decoder_t *ps;                  // create pocketsphinx decoder structure
cmd_ln_t *config;                  // create configuration structure
ad_rec_t *ad;                      // create audio recording structure - for 
use with ALSA functions

int16 adbuf[4096];                 // buffer array to hold audio data
uint8 utt_started, in_speech;      // flags for tracking active speech - has 
speech started? - is speech currently happening?
int32 k;                           // holds the number of frames in the audio 
buffer
char const *hyp;                   // pointer to "hypothesis" (best guess at the decoded result)


int main(int argc, char *argv[]) {

config = cmd_ln_init(NULL, ps_args(), TRUE,                   // Load the 
configuration structure - ps_args() passes the default values
"-hmm", "/usr/local/share/pocketsphinx/model/en-us/en-us",  // path to the 
standard english language model
"-lm", "custom.lm",                                         // custom language 
model (file must be present)
"-dict", "custom.dic",                                      // custom 
dictionary (file must be present)
"-logfn", "/dev/null",                                      // suppress log 
info from being sent to screen
 NULL);

 ps = ps_init(config);                                                        
 // initialize the pocketsphinx decoder
 ad = ad_open_dev("sysdefault", (int) cmd_ln_float32_r(config, "-samprate")); 
 // open default microphone at default samplerate

 while(1){                                                                   
   string decoded_speech = recognize_from_microphone();          // call the 
   function to capture and decode speech           
   cout << "Decoded Speech: "<< decoded_speech << "\n" <<endl;   // send decoded speech to screen
  }

  ad_close(ad);                                                    // close the microphone
 }

 string recognize_from_microphone(){

    ad_start_rec(ad);                                // start recording
    ps_start_utt(ps);                                // mark the start of the utterance
    utt_started = FALSE;                             // clear the utt_started flag

  while(1) {                                       
      k = ad_read(ad, adbuf, 4096);                // capture the number of frames in the audio buffer
    ps_process_raw(ps, adbuf, k, FALSE, FALSE);  // send the audio buffer to the pocketsphinx decoder

    in_speech = ps_get_in_speech(ps);            // test to see if speech is being detected

    if (in_speech && !utt_started) {             // if speech has started and utt_started flag is false                            
        utt_started = TRUE;                      // then set the flag
    }

    if (!in_speech && utt_started) {             // if speech has ended and the utt_started flag is true 
        ps_end_utt(ps);                          // then mark the end of the utterance
        ad_stop_rec(ad);                         // stop recording
        hyp = ps_get_hyp(ps, NULL );             // query pocketsphinx for "hypothesis" of decoded statement
        return hyp;                              // the function returns the hypothesis
        break;                                   // exit the while loop and return to main
    }
}

}

此外,您可以使用此pocketsphinx_continuous源代码。