文章目录

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

【1】mplayer

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

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

播放音乐

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

暂停播放

system(“killall -STOP madplay &”);

恢复播放

system(“killall -CONT madplay &”);

停止

system(“killall madplay”);

madplay终止

system(“killall -9 madplay”);

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

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

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

链接:https://pan.baidu.com/s/1Dgo8HGs3_Bfw05M0dCbS4A?pwd=vxpz
提取码:vxpz
README文件

README for Linux_aitalk


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

asr_offline_sample.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>#include "../../include/qisr.h"
#include "../../include/msp_cmn.h"
#include "../../include/msp_errors.h"#define SAMPLE_RATE_16K     (16000)
#define SAMPLE_RATE_8K      (8000)
#define MAX_GRAMMARID_LEN   (32)
#define MAX_PARAMS_LEN      (1024)const char * ASR_RES_PATH        = "fo|res/asr/common.jet"; //离线语法识别资源路径
const char * GRM_BUILD_PATH      = "res/asr/GrmBuilld"; //构建离线语法识别网络生成数据保存路径
const char * GRM_FILE            = "call.bnf"; //构建离线识别语法网络所用的语法文件
const char * LEX_NAME            = "contact"; //更新离线识别语法的contact槽(语法文件为此示例中使用的call.bnf)typedef struct _UserData {int     build_fini; //标识语法构建是否完成int     update_fini; //标识更新词典是否完成int     errcode; //记录语法构建或更新词典回调错误码char    grammar_id[MAX_GRAMMARID_LEN]; //保存语法构建返回的语法ID
}UserData;const char *get_audio_file(void); //选择进行离线语法识别的语音文件
int build_grammar(UserData *udata); //构建离线识别语法网络
int update_lexicon(UserData *udata); //更新离线识别语法词典
int run_asr(UserData *udata); //进行离线语法识别const char* get_audio_file(void)
{char key = 0;while(key != 27) //按Esc则退出{printf("请选择音频文件:\n");printf("1.打电话给丁伟\n");printf("2.打电话给黄辣椒\n");key = getchar();getchar();switch(key){case '1':printf("\n1.打电话给丁伟\n");return "wav/ddhgdw.pcm";case '2':printf("\n2.打电话给黄辣椒\n");return "wav/ddhghlj.pcm";default:continue;}}exit(0);return NULL;
}int build_grm_cb(int ecode, const char *info, void *udata)
{UserData *grm_data = (UserData *)udata;if (NULL != grm_data) {grm_data->build_fini = 1;grm_data->errcode = ecode;}if (MSP_SUCCESS == ecode && NULL != info) {printf("构建语法成功! 语法ID:%s\n", info);if (NULL != grm_data)snprintf(grm_data->grammar_id, MAX_GRAMMARID_LEN - 1, info);}elseprintf("构建语法失败!%d\n", ecode);return 0;
}int build_grammar(UserData *udata)
{FILE *grm_file                           = NULL;char *grm_content                        = NULL;unsigned int grm_cnt_len                 = 0;char grm_build_params[MAX_PARAMS_LEN]    = {NULL};int ret                                  = 0;grm_file = fopen(GRM_FILE, "rb");  if(NULL == grm_file) {printf("打开\"%s\"文件失败![%s]\n", GRM_FILE, strerror(errno));return -1; }fseek(grm_file, 0, SEEK_END);grm_cnt_len = ftell(grm_file);fseek(grm_file, 0, SEEK_SET);grm_content = (char *)malloc(grm_cnt_len + 1);if (NULL == grm_content){printf("内存分配失败!\n");fclose(grm_file);grm_file = NULL;return -1;}fread((void*)grm_content, 1, grm_cnt_len, grm_file);grm_content[grm_cnt_len] = '\0';fclose(grm_file);grm_file = NULL;snprintf(grm_build_params, MAX_PARAMS_LEN - 1, "engine_type = local, \asr_res_path = %s, sample_rate = %d, \grm_build_path = %s, ",ASR_RES_PATH,SAMPLE_RATE_16K,GRM_BUILD_PATH);ret = QISRBuildGrammar("bnf", grm_content, grm_cnt_len, grm_build_params, build_grm_cb, udata);free(grm_content);grm_content = NULL;return ret;
}int update_lex_cb(int ecode, const char *info, void *udata)
{UserData *lex_data = (UserData *)udata;if (NULL != lex_data) {lex_data->update_fini = 1;lex_data->errcode = ecode;}if (MSP_SUCCESS == ecode)printf("更新词典成功!\n");elseprintf("更新词典失败!%d\n", ecode);return 0;
}int update_lexicon(UserData *udata)
{const char *lex_content                   = "丁伟\n黄辣椒";unsigned int lex_cnt_len                  = strlen(lex_content);char update_lex_params[MAX_PARAMS_LEN]    = {NULL}; snprintf(update_lex_params, MAX_PARAMS_LEN - 1, "engine_type = local, text_encoding = UTF-8, \asr_res_path = %s, sample_rate = %d, \grm_build_path = %s, grammar_list = %s, ",ASR_RES_PATH,SAMPLE_RATE_16K,GRM_BUILD_PATH,udata->grammar_id);return QISRUpdateLexicon(LEX_NAME, lex_content, lex_cnt_len, update_lex_params, update_lex_cb, udata);
}int run_asr(UserData *udata)
{char asr_params[MAX_PARAMS_LEN]    = {NULL};const char *rec_rslt               = NULL;const char *session_id             = NULL;const char *asr_audiof             = NULL;FILE *f_pcm                        = NULL;char *pcm_data                     = NULL;long pcm_count                     = 0;long pcm_size                      = 0;int last_audio                     = 0;int aud_stat                       = MSP_AUDIO_SAMPLE_CONTINUE;int ep_status                      = MSP_EP_LOOKING_FOR_SPEECH;int rec_status                     = MSP_REC_STATUS_INCOMPLETE;int rss_status                     = MSP_REC_STATUS_INCOMPLETE;int errcode                        = -1;asr_audiof = get_audio_file();f_pcm = fopen(asr_audiof, "rb");if (NULL == f_pcm) {printf("打开\"%s\"失败![%s]\n", f_pcm, strerror(errno));goto run_error;}fseek(f_pcm, 0, SEEK_END);pcm_size = ftell(f_pcm);fseek(f_pcm, 0, SEEK_SET);pcm_data = (char *)malloc(pcm_size);if (NULL == pcm_data)goto run_error;fread((void *)pcm_data, pcm_size, 1, f_pcm);fclose(f_pcm);f_pcm = NULL;//离线语法识别参数设置snprintf(asr_params, MAX_PARAMS_LEN - 1, "engine_type = local, \asr_res_path = %s, sample_rate = %d, \grm_build_path = %s, local_grammar = %s, \result_type = xml, result_encoding = UTF-8, ",ASR_RES_PATH,SAMPLE_RATE_16K,GRM_BUILD_PATH,udata->grammar_id);session_id = QISRSessionBegin(NULL, asr_params, &errcode);if (NULL == session_id)goto run_error;printf("开始识别...\n");while (1) {unsigned int len = 6400;if (pcm_size < 12800) {len = pcm_size;last_audio = 1;}aud_stat = MSP_AUDIO_SAMPLE_CONTINUE;if (0 == pcm_count)aud_stat = MSP_AUDIO_SAMPLE_FIRST;if (len <= 0)break;printf(">");fflush(stdout);errcode = QISRAudioWrite(session_id, (const void *)&pcm_data[pcm_count], len, aud_stat, &ep_status, &rec_status);if (MSP_SUCCESS != errcode)goto run_error;pcm_count += (long)len;pcm_size -= (long)len;//检测到音频结束if (MSP_EP_AFTER_SPEECH == ep_status)break;usleep(150 * 1000); //模拟人说话时间间隙}//主动点击音频结束QISRAudioWrite(session_id, (const void *)NULL, 0, MSP_AUDIO_SAMPLE_LAST, &ep_status, &rec_status);free(pcm_data);pcm_data = NULL;//获取识别结果while (MSP_REC_STATUS_COMPLETE != rss_status && MSP_SUCCESS == errcode) {rec_rslt = QISRGetResult(session_id, &rss_status, 0, &errcode);usleep(150 * 1000);}printf("\n识别结束:\n");printf("=============================================================\n");if (NULL != rec_rslt)printf("%s\n", rec_rslt);elseprintf("没有识别结果!\n");printf("=============================================================\n");goto run_exit;run_error:if (NULL != pcm_data) {free(pcm_data);pcm_data = NULL;}if (NULL != f_pcm) {fclose(f_pcm);f_pcm = NULL;}
run_exit:QISRSessionEnd(session_id, NULL);return errcode;
}int main(int argc, char* argv[])
{const char *login_config    = "appid = a54c3878"; //登录参数UserData asr_data; int ret                     = 0 ;char c;ret = MSPLogin(NULL, NULL, login_config); //第一个参数为用户名,第二个参数为密码,传NULL即可,第三个参数是登录参数if (MSP_SUCCESS != ret) {printf("登录失败:%d\n", ret);goto exit;}memset(&asr_data, 0, sizeof(UserData));printf("构建离线识别语法网络...\n");ret = build_grammar(&asr_data);  //第一次使用某语法进行识别,需要先构建语法网络,获取语法ID,之后使用此语法进行识别,无需再次构建if (MSP_SUCCESS != ret) {printf("构建语法调用失败!\n");goto exit;}while (1 != asr_data.build_fini)usleep(300 * 1000);if (MSP_SUCCESS != asr_data.errcode)goto exit;printf("离线识别语法网络构建完成,开始识别...\n"); ret = run_asr(&asr_data);if (MSP_SUCCESS != ret) {printf("离线语法识别出错: %d \n", ret);goto exit;}printf("更新离线语法词典...\n");ret = update_lexicon(&asr_data);  //当语法词典槽中的词条需要更新时,调用QISRUpdateLexicon接口完成更新if (MSP_SUCCESS != ret) {printf("更新词典调用失败!\n");goto exit;}while (1 != asr_data.update_fini)usleep(300 * 1000);if (MSP_SUCCESS != asr_data.errcode)goto exit;printf("更新离线语法词典完成,开始识别...\n");ret = run_asr(&asr_data);if (MSP_SUCCESS != ret) {printf("离线语法识别出错: %d \n", ret);goto exit;}exit:MSPLogout();printf("请按任意键退出...\n");getchar();return 0;
}

Makefile

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


call.bnf

#BNF+IAT 1.0 UTF-8;
!grammar call;
!slot <want>;
!slot <dialpre>;
!slot <dialsuf>;
!slot <contact>;!start <callstart>;
<callstart>:[<want>]<dial>;
<want>:我想|我要|请|帮我|我想要|请帮我;
<dial>:<dialpre><contact>[<dialsuf>];
<dialpre>:打电话给!id(10001)|打给!id(10001)|拨打!id(10001)|拨打电话给!id(10001)|呼叫!id(10001)|
打一个电话给!id(10001)|打个电话给!id(10001)|给|拨通!id(10001)|
接通!id(10001)|呼叫!id(10001)|呼叫给!id(10001)|打!id(10001);
<dialsuf>:打电话!id(10001)|打个电话!id(10001)|打一个电话!id(10001)|
拨打电话!id(10001)|拨电话!id(10001)|拨个电话!id(10001)|呼个电话!id(10001)|
的电话!id(10001)|的号码!id(10001)|的手机!id(10001)|
的办公电话!id(10001)|的移动号码!id(10001)|的联通号码!id(10001)|
的电信号码!id(10001)|客服电话!id(10001);
<contact>:丁伟;

mplayer+科大讯飞离线语音包相关推荐

  1. GEC6818开发板JPG图像显示,科大讯飞离线语音识别包Linux_aitalk_exp1227_1398d7c6运行demo程序,开发板实现录音

    GEC6818开发板JPG图像显示 | 开发板实现录音 一.GEC6818开发板JPG图像显示 1.jpg图片特性 2.如何解压缩jpg图片 1.对jpegsrc.v8c.tar.gz进行arm移植 ...

  2. 科大讯飞离线语音命令词识别的使用说明

        最近因为项目的需求,需要在无网络的情况下实现语音识别的功能,因为之前在线识别一直用的科大的,所以经理就和我说,你花半天时间简单熟悉一下,然后出一个Demo,下午有人过来看:因为之前科大在线SR ...

  3. 科大讯飞输入法android离线语音,讯飞输入法Android5.0.1752 离线语音更轻快的表达...

    在追求时间效率的当下,语音是最佳输入方式,尤其离线语音可在无网络和网络环境不好时依然保持语音输入的便捷.通过手机本地运算,用离线语音包代替云端服务器功能,识别转文字无需等待.讯飞输入法新版离线语音不断 ...

  4. 【语音从零之五】用科大讯飞语音包实现语音打开已安装应用程序

    [更新]有人说不会使用科大讯飞的语音包,这里是传送门,可以参考从零系列的前四篇文章 (一)利用科大讯飞语音包实现Android语音识别Demo (二)科大讯飞语音包Mscdemo的使用 (三)自定义类 ...

  5. python每隔30s检查一次_用Python写一个“离线语音提示器”来提醒我们别忘记了时间...

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 环境: Win7系统,外网未连接,主机接有返听音箱. 准备: 这里明显要用 ...

  6. uni-app实现PDA的离线语音(一)设置TTS

    一.开发背景 最近在开发PDA的语音的需求的时候,因为PDA项目为了实现多端的兼容,我使用的uni-app开发的,开始使用的百度免费的在线语音功能,结果要部署到专网环境,咨询了常用的讯飞语音和百度语音 ...

  7. 使用python语言调用科大讯飞离线语音合成

    科大讯飞属于第三方服务,但是支持的语言里面没有python,所以我们在这种情况下还想使用它的功能的话,可以通过调用C语言的包,来间接的使用. 代码贴上来: def text_to_voice(text ...

  8. ROS-语音控制-会说话的机器人(3)-科大讯飞离线语音合成+图灵机器人

    ROS-语音控制-会说话的机器人(3)-科大讯飞离线语音合成+图灵机器人 参考网址: https://blog.csdn.net/CHENKAIFAN__/article/details/806193 ...

  9. 【从零之三(更)】自定义类中调用讯飞语音包错误解决办法

    原文:http://blog.csdn.net/monkeyduck/article/details/24302655 在科大讯飞语音包的Mscdemo中它的方法都是写在Activity中的,这样其实 ...

  10. 离线语音识别软件_6.语音板使用科大讯飞离线命令词识别

    0x00 离线命令词识别简介 语音识别技术(Auto Speech Recognize,简称ASR),就是把人的自然语言音频数据转换成文本数据的技术.理论上在线ASR是可以把所有的语音转换成对应的文本 ...

最新文章

  1. oracle 取日期 加天,oracle日期,获取年月日等函数、日期函数、时区
  2. JAVA网络IO编程
  3. 算法:五分钟了解一致性hash算法
  4. 划船训练常见错误:含胸驼背肩胛骨活动不足
  5. [ 测试管理 ] 如何描述缺陷报告?
  6. zabbix db partition
  7. 谁控制了我们的浏览器?
  8. HDU 3488 KM
  9. libmysqld_dev linux,解决mysql安装mysqld doesn\'t exist or is not-鸟哥のlinux-ChinaUnix博客
  10. Python -- reload 函数
  11. 递归大总结之台阶问题
  12. JAVA开源商城系统
  13. [转载] 达特茅斯学院 Dartmouth College
  14. 学妹要的20道Redis面试题,在这也分享一下(转载自程序羊羊哥)
  15. python计算勾股定理公式_三角函数、公式、勾股定理、三角形
  16. 利用计算机来对指纹,指纹识别系统(文献综述).doc
  17. Emlog资源吧V2.0模板
  18. CAD转PDF如何设置其为高质量黑白形式?
  19. AXI Quad SPI读写Flash做远程升级
  20. html取服务器时间,客户端获取服务器时间记时

热门文章

  1. php100视频教程(全集)
  2. 贪吃蛇Python版 源码+代码分析
  3. Android编程 移动应用开发 经典习题案例 (附案例 注意点)
  4. Crystal Ball—甲骨文水晶球风险管理软件(概念以及实战——中级案例篇)
  5. Go 语言高性能编程
  6. 《SQL必知必会》笔记
  7. python简明教程_07
  8. 精选32个最新Python实战项目(附源码),拿走就用
  9. python运维书籍推荐_python运维书籍
  10. 小乌龟与git配置使用