0x00 离线命令词识别简介
语音识别技术 (Auto Speech Recognize,简称ASR) ,就是把人的自然语言音频数据转换成文本数据的技术。理论上在线ASR是可以把所有的语音转换成对应的文本,但是我们这里只是介绍离线ASR的应用,就是只在本地识别个数受限制的语音。 这里的离线ASR识别就是离线的命令词识别,又可以叫语法识别,它是基于语法规则,可以将与语法一致的自然语言音频转换为文本输出的技术。 语法识别的结果值域只在语法文件所列出的规则里,故有很好的匹配率。另外,语法识别结果携带了结果的置信度,应用可以根据置信分数,决定这个结果是否有效。 语法识别多用于要更准确结果且有限说法的语音控制,如在家庭环境中空调、电视、电灯的控制。因为这些设备的只有几个确定的常用固定功能,所以做出离线的识别就非常适合。 这里在使用离线语法识别时,需要先编写一个语法文件,然后通过调用QISRBuildGrammar接口编译本地语法文件,以及获得语法ID,并在会话时,传入语法ID,以使用该语法,在之后的会话中,继续使用此语法进行识别,无需再次构建。0x01 下载离线命令词识别SDK 大家可以去讯飞开放平台上,登录自己账户后就可以下载对应的离线命令词SDK了,网址如下:
https://www.xfyun.cn/sdk/dispatcher
![586348b940f25aa15f8af664a5836bc4.png](https://i-blog.csdnimg.cn/blog_migrate/d94ebfe3c8ff5488829ca19ea858dee0.jpeg)
下载科大讯飞离线命令词识别SDK
scp Linux_aitalk1226_5d5b***.zip corvin@192.168.*.*:~/
这里需要注意的是发送的文件名和树莓派板的IP地址,大家需要根据自己的情况来做相应修改即可,如下图所示:![c5e749807c0fca759324ebf623a024ee.png](https://i-blog.csdnimg.cn/blog_migrate/1200535e17a13fe959fdb42a42181039.png)
将SDK发送到树莓派板子上
0x02 编译离线命令词识别源码
在树莓派上我们首先需要将离线命令词识别的SDK压缩包解压,完整的解压命令如下:unzip -q Linux_aitalk1226_5d5b9efd.zip -d xf_aitalk/
![8ffaf4b3a7418ea2ae76c20fbd3527bc.png](https://i-blog.csdnimg.cn/blog_migrate/609e3af86b0fecdbb0a72c8ef2cfa2df.jpeg)
离线唤醒SDK源码组成
大家可以去ROS小课堂官网进行下载即可:
https://www.corvin.cn/1661.html
当下载好该离线命令词识别库后,就可以将其放到树莓派中来使用了,这里下载后该库是可以永久使用的,没有时间限制:![40d83404dd6e92cfa5a51a65febcbc9c.png](https://i-blog.csdnimg.cn/blog_migrate/1e2eb058603579da5e1227b3cfad9026.jpeg)
树莓派版本动态库
![abcecdd126e44859c98d2d5b05dd85a1.png](https://i-blog.csdnimg.cn/blog_migrate/16924d30e7d3fe4f767c578764fed67d.jpeg)
修改编译脚本
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](https://i-blog.csdnimg.cn/blog_migrate/1d5253fd40d1beee0decc37106f3a82b.jpeg)
查看语法文件
更新本地语法词典的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