main_livedecode.c
来自「CMU大名鼎鼎的SPHINX-3大词汇量连续语音识别系统」· C语言 代码 · 共 183 行
C
183 行
/* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * This work was supported in part by funding from the Defense Advanced * Research Projects Agency and the National Science Foundation of the * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * */ /************************************************* * CMU ARPA Speech Project * * Copyright (c) 2000 Carnegie Mellon University. * ALL RIGHTS RESERVED. ************************************************* * * Aug 6, 2004 * *//** \file main_livedecode.c * \brief live-mode decoder demo. * * Created by Yitao Sun (yitao@cs.cmu.edu). This is a test program written * for the Win32 platform. The program initializes Sphinx3 live-decode API, * then in a press-to-start and press-to-stop fashion, records and decodes a * session of user speech. The threading and synchronization code are Win32- * specific. Ravi Mosur (rkm@cs.cmu.edu) suggested using select() (and no * threads) on the /dev/tty* device to remove Win32 dependency. */#include <sys/stat.h>#include <fcntl.h>#include <live_decode_API.h>#include <live_decode_args.h>#include <ad.h>#include <stdio.h>#define BUFSIZE 4096HANDLE startEvent;HANDLE finishEvent;live_decoder_t decoder;FILE *dump = 0;DWORD WINAPIprocess_thread(LPVOID aParam){ ad_rec_t *in_ad = 0; int16 samples[BUFSIZE]; int32 num_samples; WaitForSingleObject(startEvent, INFINITE); in_ad = ad_open_sps(cmd_ln_int32 ("-samprate")); ad_start_rec(in_ad); while (WaitForSingleObject(finishEvent, 0) == WAIT_TIMEOUT) { num_samples = ad_read(in_ad, samples, BUFSIZE); if (num_samples > 0) { /** dump the recorded audio to disk */ if (fwrite(samples, sizeof(int16), num_samples, dump) < num_samples) { printf("Error writing audio to dump file.\n"); } ld_process_raw(&decoder, samples, num_samples); } } ad_stop_rec(in_ad); ad_close(in_ad); ld_end_utt(&decoder); return 0;}intmain(int argc, char **argv){ HANDLE thread; char buffer[1024]; char *hypstr; /* * Initializing */ if (argc != 2) { printf("Usage: livedecode config_file \n"); return -1; } if (cmd_ln_parse_file(arg_def, argv[1])) { printf("Bad arguments file (%s).\n", argv[1]); return -1; } if (ld_init(&decoder)) { printf("Initialization failed.\n"); return -1; } if (ld_begin_utt(&decoder, 0)) { printf("Cannot start decoding\n"); return -1; } /** initializing a file to dump the recorded audio */ if ((dump = fopen("out.raw", "wb")) == 0) { printf("Cannot open dump file out.raw\n"); return -1; } startEvent = CreateEvent(NULL, TRUE, FALSE, "StartEvent"); finishEvent = CreateEvent(NULL, TRUE, FALSE, "FinishEvent"); thread = CreateThread(NULL, 0, process_thread, NULL, 0, NULL); /* * Wait for some user input, then signal the processing thread to start * recording/decoding */ printf("press ENTER to start recording\n"); fgets(buffer, 1024, stdin); SetEvent(startEvent); /* * Wait for some user input again, then signal the processing thread to end * recording/decoding */ printf("press ENTER to finish recording\n"); fgets(buffer, 1024, stdin); SetEvent(finishEvent); /* * Wait for the working thread to join */ WaitForSingleObject(thread, INFINITE); /* * Print the decoding output */ if (ld_retrieve_hyps(&decoder, NULL, &hypstr, NULL)) { printf("Cannot retrieve hypothesis.\n"); } else { printf("Hypothesis:\n%s\n", hypstr); } ld_finish(&decoder); fclose(dump); return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?