| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include <windows.h> |
| | #include <mmsystem.h> |
| | #include <pocketsphinx.h> |
| | #include <signal.h> |
| |
|
| | static int global_done = 0; |
| | static void |
| | catch_sig(int signum) |
| | { |
| | (void)signum; |
| | global_done = 1; |
| | } |
| |
|
| | #define CHECK(expr) \ |
| | do { \ |
| | int err; \ |
| | if ((err = expr) != 0) \ |
| | { \ |
| | char errbuf[MAXERRORLENGTH]; \ |
| | waveInGetErrorText(err, errbuf, sizeof(errbuf)); \ |
| | E_FATAL("error %08x: %s\n", err, errbuf); \ |
| | } \ |
| | } while (0) |
| |
|
| | int main(int argc, char *argv[]) |
| | { |
| | ps_decoder_t *decoder; |
| | ps_config_t *config; |
| | ps_endpointer_t *ep; |
| | size_t frame_size; |
| | HWAVEIN wavein; |
| | WAVEFORMATEX wavefmt; |
| | HANDLE event; |
| | |
| | #define NBUF 100 |
| | WAVEHDR hdrs[NBUF]; |
| | int i; |
| |
|
| | (void)argc; (void)argv; |
| | |
| | config = ps_config_init(NULL); |
| | ps_default_search_args(config); |
| | if ((decoder = ps_init(config)) == NULL) |
| | E_FATAL("PocketSphinx decoder init failed\n"); |
| | if ((ep = ps_endpointer_init(0, 0.0, 0, |
| | ps_config_int(config, "samprate"), |
| | 0)) == NULL) |
| | E_FATAL("PocketSphinx endpointer init failed\n"); |
| | |
| | frame_size = ps_endpointer_frame_size(ep); |
| | |
| | wavefmt.wFormatTag = WAVE_FORMAT_PCM; |
| | wavefmt.nChannels = 1; |
| | wavefmt.nSamplesPerSec = ps_endpointer_sample_rate(ep); |
| | wavefmt.wBitsPerSample = 16; |
| | wavefmt.nBlockAlign = 2; |
| | wavefmt.nAvgBytesPerSec = wavefmt.nSamplesPerSec * wavefmt.nBlockAlign; |
| | wavefmt.cbSize = 0; |
| | |
| | event = CreateEvent(NULL, TRUE, FALSE, "buffer_ready"); |
| | |
| | CHECK(waveInOpen(&wavein, WAVE_MAPPER, &wavefmt, |
| | (DWORD_PTR)event, 0, CALLBACK_EVENT)); |
| | |
| | memset(hdrs, 0, sizeof(hdrs)); |
| | for (i = 0; i < NBUF; ++i) { |
| | hdrs[i].lpData = malloc(frame_size * 2); |
| | hdrs[i].dwBufferLength = (DWORD)frame_size * 2; |
| | CHECK(waveInPrepareHeader(wavein, &hdrs[i], sizeof(hdrs[i]))); |
| | CHECK(waveInAddBuffer(wavein, &hdrs[i], sizeof(hdrs[i]))); |
| | } |
| | |
| | CHECK(waveInStart(wavein)); |
| | i = 0; |
| | if (signal(SIGINT, catch_sig) == SIG_ERR) |
| | E_FATAL_SYSTEM("Failed to set SIGINT handler"); |
| | while (!global_done) { |
| | const int16 *speech; |
| | WaitForSingleObject(event, INFINITE); |
| | |
| | while (hdrs[i].dwFlags & WHDR_DONE) { |
| | int prev_in_speech = ps_endpointer_in_speech(ep); |
| | int16 *frame = (int16 *)hdrs[i].lpData; |
| | |
| | speech = ps_endpointer_process(ep, frame); |
| | CHECK(waveInUnprepareHeader(wavein, &hdrs[i], sizeof(hdrs[i]))); |
| | CHECK(waveInPrepareHeader(wavein, &hdrs[i], sizeof(hdrs[i]))); |
| | CHECK(waveInAddBuffer(wavein, &hdrs[i], sizeof(hdrs[i]))); |
| | if (++i == NBUF) |
| | i = 0; |
| | if (speech != NULL) { |
| | const char *hyp; |
| | if (!prev_in_speech) { |
| | fprintf(stderr, "Speech start at %.2f\n", |
| | ps_endpointer_speech_start(ep)); |
| | fflush(stderr); |
| | ps_start_utt(decoder); |
| | } |
| | if (ps_process_raw(decoder, speech, frame_size, FALSE, FALSE) < 0) |
| | E_FATAL("ps_process_raw() failed\n"); |
| | if ((hyp = ps_get_hyp(decoder, NULL)) != NULL) { |
| | fprintf(stderr, "PARTIAL RESULT: %s\n", hyp); |
| | fflush(stderr); |
| | } |
| | if (!ps_endpointer_in_speech(ep)) { |
| | fprintf(stderr, "Speech end at %.2f\n", |
| | ps_endpointer_speech_end(ep)); |
| | fflush(stderr); |
| | ps_end_utt(decoder); |
| | if ((hyp = ps_get_hyp(decoder, NULL)) != NULL) { |
| | printf("%s\n", hyp); |
| | fflush(stdout); |
| | } |
| | } |
| | } |
| | } |
| | |
| | ResetEvent(event); |
| | } |
| | |
| | CHECK(waveInStop(wavein)); |
| | CHECK(waveInReset(wavein)); |
| | for (i = 0; i < NBUF; ++i) { |
| | if (hdrs[i].dwFlags & WHDR_PREPARED) |
| | CHECK(waveInUnprepareHeader(wavein, &hdrs[i], |
| | sizeof(hdrs[i]))); |
| | free(hdrs[i].lpData); |
| | } |
| | CloseHandle(event); |
| | ps_endpointer_free(ep); |
| | ps_free(decoder); |
| | ps_config_free(config); |
| |
|
| | return 0; |
| | } |
| |
|