运⾏讯飞离线sdk_6.语⾳板使⽤科⼤讯飞离线命令词识别
0x00 离线命令词识别简介
语⾳识别技术 (Auto Speech Recognize,简称ASR) ,就是把⼈的⾃然语⾔⾳频数据转换成⽂本数据的技术。理论上在线ASR是可以把所有的语⾳转换成对应的⽂本,但是我们这⾥只是介绍离线ASR的应⽤,就是只在本地识别个数受限制的语⾳。 这⾥的离线ASR识别就是离线的命令词识别,⼜可以叫语法识别,它是基于语法规则,可以将与语法⼀致的⾃然语⾔⾳频转换为⽂本输出的技术。 语法识别的结果值域只在语法⽂件所列出的规则⾥,故有很好的匹配率。另外,语法识别结果携带了结果的置信度,应⽤可以根据置信分数,决定这个结果是否有效。 语法识别多⽤于要更准确结果且有限说法的语⾳控制,如在家庭环境中空调、电视、电灯的控制。因为这些设备的只有⼏个确定的常⽤固定功能,所以做出离线的识别就⾮常适合。 这⾥在使⽤离线语法识别时,需要先编写⼀个语法⽂件,然后通过调⽤QISRBuildGrammar接⼝编译本地语法⽂件,以及获得语法ID,并在会话时,传⼊语法ID,以使⽤该语法,在之后的会话中,继续使⽤此语法进⾏识别,⽆需再次构建。
0x01 下载离线命令词识别SDK ⼤家可以去讯飞开放平台上,登录⾃⼰账户后就可以下载对应的离线命令词SDK了,⽹址如下:
www.xfyun/sdk/dispatcher
下载科⼤讯飞离线命令词识别SDK
当下载好SDK后,我们就可以将其发送到树莓派板⼦上,⼤家可以使⽤如下的命令进⾏操作:
scp Linux_aitalk1226_5d5b***.zip corvin@192.168.*.*:~/
这⾥需要注意的是发送的⽂件名和树莓派板的IP地址,⼤家需要根据⾃⼰的情况来做相应修改即可,如下图所⽰:
将SDK发送到树莓派板⼦上
0x02 编译离线命令词识别源码
在树莓派上我们⾸先需要将离线命令词识别的SDK压缩包解压,完整的解压命令如下:
unzip -q Linux_aitalk1226_5d5b9efd.zip -d xf_aitalk/
离线唤醒SDK源码组成
接下来就是替换离线命令词识别的动态库了,由于默认的SDK不提供树莓派版本的动态库。这⾥使⽤
的动态库和第5篇⽂章中的离线唤醒词识别是⼀个动态库,如果你已经在上⼀篇中下载了该动态库,那么这⾥就不⽤再下载了。另外,这个动态库其实和后⾯⽂章要介绍的离线语⾳合成功能⽤的也是⼀样的。就是说下载这⼀个动态库,就可以在树莓派上实现:离线唤醒、离线命令词识别、离线语⾳合成这三个功能了。 同样在这⾥如果要下载树莓派版本的动态库的话也是要收费的,因为如果⼤家下载使⽤的话,会占⽤我的科⼤讯飞语⾳唤醒装机量的。是需要收费的,希望可以理解:
⼤家可以去ROS⼩课堂官⽹进⾏下载即可:
vin/1661.html
当下载好该离线命令词识别库后,就可以将其放到树莓派中来使⽤了,这⾥下载后该库是可以永久使⽤的,没有时间限制:
树莓派版本动态库
接下来就可以来修改编译的脚本和makefile⽂件了,⾸先来修改⼀下bash脚本,修改过程如下:
修改编译脚本
接下来就是修改⼀下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
sdk28#common makefile foot
在修改好make.sh和Makefile⽂件后,我们就可以来开始编译程序了,编译过程也很简单,我们直接在源码⽬录下执⾏make.sh脚本就可以
了。
0x03 运⾏测试程序
当我们执⾏完make.sh编译脚本后,就可以在bin⽬录下⽣成可执⾏⽂件asr_offline_record_sample。但是在执⾏之前,我们需要认识⼀下这个巴科斯范式格式的语法⽂件,因为这个语法⽂件就是我们后⾯要离线识别的命令词了。如下图所⽰:
查看语法⽂件
这⾥的call.bnf就是使⽤巴科斯范式实现的语法⽂件,最终上述语法⽂件将检测的是[]这样的语⾳。也就是说规则中的:我想、我要、请、帮我...,这些可以说也可以不说。但是这个规则必须要说,⽽规则是由[]组成的。这个dialpre是必须要说的,它将检测⽤户有没有说出来:打电话给、打给、拨打、呼叫....这些语⾳。后⾯的就是检测的联系⼈,这⾥的联系⼈只有⼀个"丁伟"。 最后的这个是可说可不说,这是因为我们平时要给某⼈打电话的语法就是:“打电话给丁伟”这样的语法,当然还可以换另外⼀种表达⽅式,那就是“拨打丁伟的电话”,所以这⾥是两种语法规则都⽀持的。 在了解了语法⽂件后,我们还需要查看下⽰例源码,因为这⾥的语法⽂件中的规则,我们是可以动态的更新的。就是说我们不⽤重新启动程序,就可以实时的修改检测的语法规则,更新语法规则的API如下:
更新本地语法词典的API
那接下来看⼀下在asr_offline_record_sample.c源码中是如何更新本次语法词典⽂件的,调⽤该API的代码如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。