Last active
December 14, 2015 01:38
-
-
Save jalcine/5007330 to your computer and use it in GitHub Desktop.
Snippet from pocketsphinx/src/programs/continuous.c that handles continuous recognition from microphone (be it from Pulse, ALSA, or Jack).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Main utterance processing loop: | |
* for (;;) { | |
* wait for start of next utterance; | |
* decode utterance until silence of at least 1 sec observed; | |
* print utterance result; | |
* } | |
*/ | |
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 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); | |
/* Exit if the first word spoken was GOODBYE */ | |
if (hyp) { | |
sscanf(hyp, "%s", word); | |
if (strcmp(word, "goodbye") == 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); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
An error occurred during the repair. | |
Please write on a paper the following URL: | |
http://paste.ubuntu.com/5700414/ | |
In case you still experience boot problem, indicate this URL to: | |
boot.repair@gmail.com | |
You can now reboot your computer. | |
Please do not forget to make your BIOS boot on sda1/EFI/kubuntu/grubx64.efi file! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment