运行讯飞离线sdk_6.语音板使用科大讯飞离线命令词识别

本文档介绍了如何运行和使用科大讯飞的离线命令词识别SDK,包括编译源码、运行测试程序、实现自定义命令词识别,并提供了相关参考资料和测试源码下载链接。
摘要由CSDN通过智能技术生成

0x00 离线命令词识别简介

语音识别技术 (Auto Speech Recognize,简称ASR) ,就是把人的自然语言音频数据转换成文本数据的技术。理论上在线ASR是可以把所有的语音转换成对应的文本,但是我们这里只是介绍离线ASR的应用,就是只在本地识别个数受限制的语音。 这里的离线ASR识别就是离线的命令词识别,又可以叫语法识别,它是基于语法规则,可以将与语法一致的自然语言音频转换为文本输出的技术。 语法识别的结果值域只在语法文件所列出的规则里,故有很好的匹配率。另外,语法识别结果携带了结果的置信度,应用可以根据置信分数,决定这个结果是否有效。 语法识别多用于要更准确结果且有限说法的语音控制,如在家庭环境中空调、电视、电灯的控制。因为这些设备的只有几个确定的常用固定功能,所以做出离线的识别就非常适合。 这里在使用离线语法识别时,需要先编写一个语法文件,然后通过调用QISRBuildGrammar接口编译本地语法文件,以及获得语法ID,并在会话时,传入语法ID,以使用该语法,在之后的会话中,继续使用此语法进行识别,无需再次构建。
0x01 下载离线命令词识别SDK 大家可以去讯飞开放平台上,登录自己账户后就可以下载对应的离线命令词SDK了,网址如下:

https://www.xfyun.cn/sdk/dispatcher

586348b940f25aa15f8af664a5836bc4.png

下载科大讯飞离线命令词识别SDK

当下载好SDK后,我们就可以将其发送到树莓派板子上,大家可以使用如下的命令进行操作:

scp Linux_aitalk1226_5d5b***.zip corvin@192.168.*.*:~/

这里需要注意的是发送的文件名和树莓派板的IP地址,大家需要根据自己的情况来做相应修改即可,如下图所示:
c5e749807c0fca759324ebf623a024ee.png

将SDK发送到树莓派板子上


0x02 编译离线命令词识别源码

在树莓派上我们首先需要将离线命令词识别的SDK压缩包解压,完整的解压命令如下:

unzip -q Linux_aitalk1226_5d5b9efd.zip -d xf_aitalk/

8ffaf4b3a7418ea2ae76c20fbd3527bc.png

离线唤醒SDK源码组成

接下来就是替换离线命令词识别的动态库了,由于默认的SDK不提供树莓派版本的动态库。这里使用的动态库和第5篇文章中的离线唤醒词识别是一个动态库,如果你已经在上一篇中下载了该动态库,那么这里就不用再下载了。另外,这个动态库其实和后面文章要介绍的离线语音合成功能用的也是一样的。就是说下载这一个动态库,就可以在树莓派上实现:离线唤醒、离线命令词识别、离线语音合成这三个功能了。 同样在这里如果要下载树莓派版本的动态库的话也是要收费的,因为如果大家下载使用的话,会占用我的科大讯飞语音唤醒装机量的。是需要收费的,希望可以理解:

大家可以去ROS小课堂官网进行下载即可:

https://www.corvin.cn/1661.html

当下载好该离线命令词识别库后,就可以将其放到树莓派中来使用了,这里下载后该库是可以永久使用的,没有时间限制:
40d83404dd6e92cfa5a51a65febcbc9c.png

树莓派版本动态库

接下来就可以来修改编译的脚本和makefile文件了,首先来修改一下bash脚本,修改过程如下:
abcecdd126e44859c98d2d5b05dd85a1.png

修改编译脚本

接下来就是修改一下Makefile文件了,因为在make.sh中我们修改了编译时加载库的路径。主要就是修改13行的LDFLAGS,最终修改后的Makefile文件如下:
 1#common makefile header
2
3DIR_INC = ../../include
4DIR_BIN = ../../bin
5DIR_LIB = ../../libs
6
7TARGET    = asr_offline_record_sample
8BIN_TARGET = $(DIR_BIN)/$(TARGET)
9
10CROSS_COMPILE = 
11CFLAGS = -g -Wall -I$(DIR_INC)
12
13LDFLAGS := -L$(DIR_LIB)/
14LDFLAGS += -lmsc -lrt -ldl -lpthread -lasound -lstdc++ -lwiringPi
15
16OBJECTS := $(patsubst %.c,%.o,$(wildcard *.c))
17
18$(BIN_TARGET) : $(OBJECTS)
19    $(CROSS_COMPILE)gcc $(CFLAGS) $^ -o $@ $(LDFLAGS)
20
21%.o : %.c
22    $(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@
23clean:
24    @rm -f *.o $(BIN_TARGET)
25
26.PHONY:clean
27
28#common makefile foot
在修改好make.sh和Makefile文件后,我们就可以来开始编译程序了,编译过程也很简单,我们直接在源码目录下执行make.sh脚本就可以了。

0x03 运行测试程序

当我们执行完make.sh编译脚本后,就可以在bin目录下生成可执行文件asr_offline_record_sample。但是在执行之前,我们需要认识一下这个巴科斯范式格式的语法文件,因为这个语法文件就是我们后面要离线识别的命令词了。如下图所示:
e7a78d148e94e1c40b14d8e2f6439c4a.png

查看语法文件

这里的call.bnf就是使用巴科斯范式实现的语法文件,最终上述语法文件将检测的是[]这样的语音。也就是说规则中的:我想、我要、请、帮我...,这些可以说也可以不说。但是这个规则必须要说,而规则是由[]组成的。这个dialpre是必须要说的,它将检测用户有没有说出来:打电话给、打给、拨打、呼叫....这些语音。后面的就是检测的联系人,这里的联系人只有一个"丁伟"。 最后的这个是可说可不说,这是因为我们平时要给某人打电话的语法就是:“打电话给丁伟”这样的语法,当然还可以换另外一种表达方式,那就是“拨打丁伟的电话”,所以这里是两种语法规则都支持的。 在了解了语法文件后,我们还需要查看下示例源码,因为这里的语法文件中的规则,我们是可以动态的更新的。就是说我们不用重新启动程序,就可以实时的修改检测的语法规则,更新语法规则的API如下:

26b8767c15855aaa8cf85d195cc59ed0.png更新本地语法词典的API

那接下来看一下在asr_offline_record_sample.c源码中是如何更新本次语法词典文件的,调用该API的代码如下:
 1int update_lex_cb(int ecode, const char *info, void *udata) 2{
     
3    UserData *lex_data = (UserData *)udata;
4
5    if (NULL != lex_data) {
6        lex_data->update_fini = 1;
7        le
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值