解决方案

mplayer+科大讯飞离线语音包

seo靠我 2023-09-24 11:00:34

文章目录

【1】mplayer【2】科大讯飞离线语音包

【1】mplayer

1.将mplayer放到开发板的bin目录下

system(“mplayer 1.avi &”); // &为后台播放视频

播放音乐SEO靠我

system(“madplay -a -10 xxx.mp3”);//-a 音量控制 范围(-175~+18)

暂停播放

system(“killall -STOP madplay &”);

恢复播放

sysSEO靠我tem(“killall -CONT madplay &”);

停止

system(“killall madplay”);

madplay终止

system(“killall -9 madplay”);

思路 SEO靠我:如何保证将电脑的音频或视频传输给开发板,保持数据完整

1.先发送文件大小 2.再发送数据内容 3.检测发送的数据与接收的数据大小是否一致

【2】科大讯飞离线语音包

链接:hSEO靠我ttps://pan.baidu.com/s/1Dgo8HGs3_Bfw05M0dCbS4A?pwd=vxpz

提取码:vxpz

README文件

README for Linux_aitalk

bin: SEO靠我 |-- msc|-- msc.cfg(作用:msc调试、生成msc日志)|-- res|-- asr(资源文件)|-- wav|-- ddhghlj.pcm|-- ddhgdw.pcm|SEO靠我-- call.bnfdoc: |-- readme.txtinclude:调用SDK所需头文件libs: |-- x86|-- libmsc.so(32位动态库) SEO靠我 |-- x64|-- libmsc.so(64位动态库)samples: |-- asr_sample|-- asr_sample.c|-- Makefile|-- 32SEO靠我bit_make.sh|-- 64bit_make.sh |-- asr_record_sample|-- formats.h|-- linuxrec.h|-- linuxrec.c|SEO靠我-- speech_recognizer.h|-- speech_recognizer.c|-- asr_record_sample.c|-- Makefile|-- 32bit_make.sh|--SEO靠我 64bit_make.sh

asr_offline_sample.c

#include <stdlib.h> #include <stdio.h> #include <sSEO靠我tring.h> #include <errno.h> #include <unistd.h>#include "../../include/qisr.h" SEO靠我 #include "../../include/msp_cmn.h" #include "../../include/msp_errors.h"#define SAMPLE_RASEO靠我TE_16K (16000) #define SAMPLE_RATE_8K (8000) #define MAX_GRAMMARID_LEN (32) SEO靠我#define MAX_PARAMS_LEN (1024)const char * ASR_RES_PATH = "fo|res/asr/common.jet"; //离线语法识别资源路径 SEO靠我 const char * GRM_BUILD_PATH = "res/asr/GrmBuilld"; //构建离线语法识别网络生成数据保存路径 const char * GRM_SEO靠我FILE = "call.bnf"; //构建离线识别语法网络所用的语法文件 const char * LEX_NAME = "contact"; //更新离线识别语法的contactSEO靠我槽(语法文件为此示例中使用的call.bnf)typedef struct _UserData {int build_fini; //标识语法构建是否完成int update_fini; //标识更新SEO靠我词典是否完成int errcode; //记录语法构建或更新词典回调错误码char grammar_id[MAX_GRAMMARID_LEN]; //保存语法构建返回的语法ID }UsSEO靠我erData;const char *get_audio_file(void); //选择进行离线语法识别的语音文件 int build_grammar(UserData *udataSEO靠我); //构建离线识别语法网络 int update_lexicon(UserData *udata); //更新离线识别语法词典 int run_asr(UserDaSEO靠我ta *udata); //进行离线语法识别const char* get_audio_file(void) {char key = 0;while(key != 27) //按EscSEO靠我则退出{printf("请选择音频文件:\n");printf("1.打电话给丁伟\n");printf("2.打电话给黄辣椒\n");key = getchar();getchar();switchSEO靠我(key){case 1:printf("\n1.打电话给丁伟\n");return "wav/ddhgdw.pcm";case 2:printf("\n2.打电话给黄辣椒\n");return "wSEO靠我av/ddhghlj.pcm";default:continue;}}exit(0);return NULL; }int build_grm_cb(int ecode, const cSEO靠我har *info, void *udata) {UserData *grm_data = (UserData *)udata;if (NULL != grm_data) {grm_dSEO靠我ata->build_fini = 1;grm_data->errcode = ecode;}if (MSP_SUCCESS == ecode && NULL != info) {printf("构建SEO靠我语法成功! 语法ID:%s\n", info);if (NULL != grm_data)snprintf(grm_data->grammar_id, MAX_GRAMMARID_LEN - 1, iSEO靠我nfo);}elseprintf("构建语法失败!%d\n", ecode);return 0; }int build_grammar(UserData *udata) SEO靠我 {FILE *grm_file = NULL;char *grm_content = NULL;unsigned int grm_cnt_len = 0;char grm_build_params[SEO靠我MAX_PARAMS_LEN] = {NULL};int ret = 0;grm_file = fopen(GRM_FILE, "rb"); if(NULL == grm_file) {printf(SEO靠我"打开\"%s\"文件失败![%s]\n", GRM_FILE, strerror(errno));return -1; }fseek(grm_file, 0, SEEK_END);grm_cnt_lSEO靠我en = ftell(grm_file);fseek(grm_file, 0, SEEK_SET);grm_content = (char *)malloc(grm_cnt_len + 1);if (SEO靠我NULL == grm_content){printf("内存分配失败!\n");fclose(grm_file);grm_file = NULL;return -1;}fread((void*)grSEO靠我m_content, 1, grm_cnt_len, grm_file);grm_content[grm_cnt_len] = \0;fclose(grm_file);grm_file = NULL;SEO靠我snprintf(grm_build_params, MAX_PARAMS_LEN - 1, "engine_type = local, \asr_res_path = %s, sample_rateSEO靠我 = %d, \grm_build_path = %s, ",ASR_RES_PATH,SAMPLE_RATE_16K,GRM_BUILD_PATH);ret = QISRBuildGrammar("SEO靠我bnf", grm_content, grm_cnt_len, grm_build_params, build_grm_cb, udata);free(grm_content);grm_contentSEO靠我 = NULL;return ret; }int update_lex_cb(int ecode, const char *info, void *udata) {UsSEO靠我erData *lex_data = (UserData *)udata;if (NULL != lex_data) {lex_data->update_fini = 1;lex_data->errcSEO靠我ode = ecode;}if (MSP_SUCCESS == ecode)printf("更新词典成功!\n");elseprintf("更新词典失败!%d\n", ecode);return 0;SEO靠我 }int update_lexicon(UserData *udata) {const char *lex_content = "丁伟\n黄辣椒";unsigned SEO靠我int lex_cnt_len = strlen(lex_content);char update_lex_params[MAX_PARAMS_LEN] = {NULL}; snprintf(updaSEO靠我te_lex_params, MAX_PARAMS_LEN - 1, "engine_type = local, text_encoding = UTF-8, \asr_res_path = %s, SEO靠我sample_rate = %d, \grm_build_path = %s, grammar_list = %s, ",ASR_RES_PATH,SAMPLE_RATE_16K,GRM_BUILD_SEO靠我PATH,udata->grammar_id);return QISRUpdateLexicon(LEX_NAME, lex_content, lex_cnt_len, update_lex_paraSEO靠我ms, update_lex_cb, udata); }int run_asr(UserData *udata) {char asr_params[MAX_PARAMSSEO靠我_LEN] = {NULL};const char *rec_rslt = NULL;const char *session_id = NULL;const char *asr_audiof = NUSEO靠我LL;FILE *f_pcm = NULL;char *pcm_data = NULL;long pcm_count = 0;long pcm_size = 0;int last_audio = 0;SEO靠我int aud_stat = MSP_AUDIO_SAMPLE_CONTINUE;int ep_status = MSP_EP_LOOKING_FOR_SPEECH;int rec_status = SEO靠我MSP_REC_STATUS_INCOMPLETE;int rss_status = MSP_REC_STATUS_INCOMPLETE;int errcode = -1;asr_audiof = gSEO靠我et_audio_file();f_pcm = fopen(asr_audiof, "rb");if (NULL == f_pcm) {printf("打开\"%s\"失败![%s]\n", f_pcSEO靠我m, strerror(errno));goto run_error;}fseek(f_pcm, 0, SEEK_END);pcm_size = ftell(f_pcm);fseek(f_pcm, 0SEO靠我, SEEK_SET);pcm_data = (char *)malloc(pcm_size);if (NULL == pcm_data)goto run_error;fread((void *)pcSEO靠我m_data, pcm_size, 1, f_pcm);fclose(f_pcm);f_pcm = NULL;//离线语法识别参数设置snprintf(asr_params, MAX_PARAMS_LSEO靠我EN - 1, "engine_type = local, \asr_res_path = %s, sample_rate = %d, \grm_build_path = %s, local_gramSEO靠我mar = %s, \result_type = xml, result_encoding = UTF-8, ",ASR_RES_PATH,SAMPLE_RATE_16K,GRM_BUILD_PATHSEO靠我,udata->grammar_id);session_id = QISRSessionBegin(NULL, asr_params, &errcode);if (NULL == session_idSEO靠我)goto run_error;printf("开始识别...\n");while (1) {unsigned int len = 6400;if (pcm_size < 12800) {len = SEO靠我pcm_size;last_audio = 1;}aud_stat = MSP_AUDIO_SAMPLE_CONTINUE;if (0 == pcm_count)aud_stat = MSP_AUDISEO靠我O_SAMPLE_FIRST;if (len <= 0)break;printf(">");fflush(stdout);errcode = QISRAudioWrite(session_id, (cSEO靠我onst void *)&pcm_data[pcm_count], len, aud_stat, &ep_status, &rec_status);if (MSP_SUCCESS != errcodeSEO靠我)goto run_error;pcm_count += (long)len;pcm_size -= (long)len;//检测到音频结束if (MSP_EP_AFTER_SPEECH == ep_SEO靠我status)break;usleep(150 * 1000); //模拟人说话时间间隙}//主动点击音频结束QISRAudioWrite(session_id, (const void *)NULLSEO靠我, 0, MSP_AUDIO_SAMPLE_LAST, &ep_status, &rec_status);free(pcm_data);pcm_data = NULL;//获取识别结果while (MSEO靠我SP_REC_STATUS_COMPLETE != rss_status && MSP_SUCCESS == errcode) {rec_rslt = QISRGetResult(session_idSEO靠我, &rss_status, 0, &errcode);usleep(150 * 1000);}printf("\n识别结束:\n");printf("========================SEO靠我=====================================\n");if (NULL != rec_rslt)printf("%s\n", rec_rslt);elseprintf("SEO靠我没有识别结果!\n");printf("=============================================================\n");goto run_exit;SEO靠我run_error:if (NULL != pcm_data) {free(pcm_data);pcm_data = NULL;}if (NULL != f_pcm) {fclose(f_pcm);fSEO靠我_pcm = NULL;} run_exit:QISRSessionEnd(session_id, NULL);return errcode; }int main(inSEO靠我t argc, char* argv[]) {const char *login_config = "appid = a54c3878"; //登录参数UserData asr_datSEO靠我a; int ret = 0 ;char c;ret = MSPLogin(NULL, NULL, login_config); //第一个参数为用户名,第二个参数为密码,传NULL即可,第三个参数是SEO靠我登录参数if (MSP_SUCCESS != ret) {printf("登录失败:%d\n", ret);goto exit;}memset(&asr_data, 0, sizeof(UserDatSEO靠我a));printf("构建离线识别语法网络...\n");ret = build_grammar(&asr_data); //第一次使用某语法进行识别,需要先构建语法网络,获取语法ID,之后使用此语SEO靠我法进行识别,无需再次构建if (MSP_SUCCESS != ret) {printf("构建语法调用失败!\n");goto exit;}while (1 != asr_data.build_finSEO靠我i)usleep(300 * 1000);if (MSP_SUCCESS != asr_data.errcode)goto exit;printf("离线识别语法网络构建完成,开始识别...\n");SEO靠我 ret = run_asr(&asr_data);if (MSP_SUCCESS != ret) {printf("离线语法识别出错: %d \n", ret);goto exit;}printf(SEO靠我"更新离线语法词典...\n");ret = update_lexicon(&asr_data); //当语法词典槽中的词条需要更新时,调用QISRUpdateLexicon接口完成更新if (MSPSEO靠我_SUCCESS != ret) {printf("更新词典调用失败!\n");goto exit;}while (1 != asr_data.update_fini)usleep(300 * 100SEO靠我0);if (MSP_SUCCESS != asr_data.errcode)goto exit;printf("更新离线语法词典完成,开始识别...\n");ret = run_asr(&asr_dSEO靠我ata);if (MSP_SUCCESS != ret) {printf("离线语法识别出错: %d \n", ret);goto exit;}exit:MSPLogout();printf("请按任SEO靠我意键退出...\n");getchar();return 0; }

Makefile

#common makefile headerDIR_INC = ../../include SEO靠我 DIR_BIN = ../../bin DIR_LIB = ../../libsTARGET = asr_offline_sample BIN_TARGET =SEO靠我 $(DIR_BIN)/$(TARGET)CROSS_COMPILE = CFLAGS = -g -Wall -I$(DIR_INC)ifdef LINUX64 LDFSEO靠我LAGS := -L$(DIR_LIB)/x64 else LDFLAGS := -L$(DIR_LIB)/x86 endif LDFLSEO靠我AGS += -lmsc -lrt -ldl -lpthread -lstdc++OBJECTS := $(patsubst %.c,%.o,$(wildcard *.c))$(BIN_TARGET)SEO靠我 : $(OBJECTS)$(CROSS_COMPILE)gcc $(CFLAGS) $^ -o $@ $(LDFLAGS)%.o : %.c$(CROSS_COMPILE)gcc -c $(CFLASEO靠我GS) $< -o $@ clean:@rm -f *.o $(BIN_TARGET).PHONY:clean#common makefile foot

call.bnf

#BNF+IATSEO靠我 1.0 UTF-8; !grammar call; !slot <want>; !slot <dialpre>; !slot <diaSEO靠我lsuf>; !slot <contact>;!start <callstart>; <callstart>:[<want>]<dial>; <wantSEO靠我>:我想|我要|请|帮我|我想要|请帮我; <dial>:<dialpre><contact>[<dialsuf>]; <dialpre>:打电话给!id(10001)SEO靠我|打给!id(10001)|拨打!id(10001)|拨打电话给!id(10001)|呼叫!id(10001)| 打一个电话给!id(10001)|打个电话给!id(10001)|给|SEO靠我拨通!id(10001)| 接通!id(10001)|呼叫!id(10001)|呼叫给!id(10001)|打!id(10001); <dialsuf>:打电话!id(SEO靠我10001)|打个电话!id(10001)|打一个电话!id(10001)| 拨打电话!id(10001)|拨电话!id(10001)|拨个电话!id(10001)|呼个电话!id(1SEO靠我0001)| 的电话!id(10001)|的号码!id(10001)|的手机!id(10001)| 的办公电话!id(10001)|的移动号码!id(10001)|的联SEO靠我通号码!id(10001)| 的电信号码!id(10001)|客服电话!id(10001); <contact>:丁伟;
“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2