pocketSphinx 嵌入式关键词唤醒

来源:互联网 发布:cf积分刷枪软件 编辑:程序博客网 时间:2024/06/15 09:51

pocketSphinx 在hi3516A上关键词唤醒

(版本为最新在github下载的代码,2017.7)

编译安装sphinxbase

根据README文档,先运行./autogen.sh

问题1:

​ 缺少安装包bison,按照提示,安装bison即可

问题2:

​ 提示cannot find input file:test/unit/test_ad/Makefile.in

​ 去对应文件夹下,有Makefile.am存在,可能是命名的问题,写一个shell脚本复制一下,

#!/bin/bashfor x in test/unit/test_*do cp $x/Makefile.am $x/Makefile.in; done

​ 同样的错误,同样的解决方案,然后再执行,

提示:now type make to compile the packet

执行make

​ 提示makefile :1:*** missing separator, stop

​ 转到对应文件夹下(具体看输出信息):

​ 找到Make file文件

if USE_LAPACKmaybe_lapack = XXXXendif if USE_THREADSmaybe_threads = XXXXXendif .....

​ 一般提示missing separator是因为makefile不能将四个空格识别为Tab键,但是有些文本编辑器却这么写,

可以使用cat -v -t -e Makefile查看,’^I‘是Tab键

​ 最终坚决方案如下:

ifenq ($(USE_LAPACK),)maybe_lapack = XXXendif下面的if同样的处理

继续:

没有make all 的规则,去你妈的,这是github上的代码吗?果断去sourceforge去下载,

./autogen.sh

缺少,swig,安装重试,没问题

./configure

make

make check

make install

安装pocketSphinx

如果遇到relink的错误,好好看看readme,确保pocketSphinx依赖的库存在或者查看是否sphinxbase安装正确成功。

同样,按照readme的操作,

autogen.sh./configuremake cleanmake checksudo make install在这个过程中,**注意环境变量**,可以在etc/profile中配置如下export LD_LIBRARY_PATH=/usr/local/libexport PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

出现debug相关的报错,直接删除debug相关的代码,虽然有点费时间,但是我在相关代码里不会改,无从下手,然后就没有问题了

安装好后,就可以测试是否成功,

pocketsphinx_continuous -inmic yes

在我电脑上测试时候,会出现open device (/dev/dsp)(no such file or dir)的问题,但是我的麦克风在/dev/snd下,他是通过配置文件读出来的,这里我就跳过了,啦啦啦,测试一下语音文件的好了。

pocketsphinx_continuous -infile <file.wav>

可以运行,也会输出对应的结果,(file.wav的格式为16000采样率,16bit单声道pcm的编码格式)(格式不对会提醒报错)这里使用的是默认的英文的模型,在model/en-us/en-us下

也可以自己训练模型,使用自己的模型用一下的参数

pocketsphinx_continuous -hmm (your hmm dir) -lm (your language model) -dict (your dication) -inmic yes/-infile file.wav

到此为止,基本上在本机可以运行pocketsphinx,下一步就是将其移植到arm开发板上

移植pocketsphinx

先用交叉编译链编译sphinxbase

./autogen.sh(用于创建./configue文件)./configure \   (这里需要自定义而不是使用默认的)--prefix=/your/lib/home   (库文件的安装位置,不使用默认目录,是为了避免与pc安装冲突)  \--exec-prefix=/your/bin/home (可执行文件的库位置)--host=x86_64-unknown-linux-gnu  (主机类型,先随便写一个,在检查时候如果不对会提示,查找检查的输出信息,有这个)\--target=arm  (目标平台)CC=arm-hisiv400-linux-gccCFLAGS="-L/opt/hisi-linux/x86-arm/arm-hisiv400-linux/lib" \CPPFLAGS="-I/opt/hisi-linux/x86-arm/arm-hisiv400-linux/include" \--without-python  (因为带上python库跑的时候会有奇奇怪怪的问题,索性屏蔽掉)    //还有其他可以取消依赖的库,具体可以查看./configure --help makesudo make install

问题解决:

configure: error:   Could not link test program to Python. Maybe the main Python library has been  installed in some non-standard library path. If so, pass it to configure,  via the LDFLAGS environment variable.  Example: ./configure LDFLAGS="-L/usr/non-standard-path/python/lib"  ============================================================================   ERROR!   You probably have to install the development version of the Python package   for your distribution.  The exact name of this package varies among them.

解决办法:一般可以通过sudo apt-get install python-dev解决

​ 还有一种办法:sudo apt-get install libatlas-dev

​ 我试了很多类似的pythonXX-dev都不行,只能使用–without-python取消python库的依赖

error: invalid ‘asm’: invalid operand for code ‘w’

这一块我编译后一直不行,

在sudo make XXX时候提示没有权限

在su时候提示这个问题

后来 有这么一个解决方案:

​ 然后再这个环境下 .bashrc里添加 PATH=arm-lunx-gcc-path:$PATH

​ sudo -s (进入的是root:(yourpc name)#这是超级用户,但是有颜色)

​ 然后执行,就没问题了,鬼畜

​ (详细可以查看man sudo)

“sphinx_fe.o : In function dectect sphinx mfc ….” 没有定义_ISO99_sscanf_

遇到这个问题是因为我交叉编译链是arm-hisiv300-linux,v300的是基于uclibc的库,这个库和v400以来的glibc库相比比较精简,所以会少这些东西,换成v400的交叉编译链就好了

同样的步骤,交叉编译pocketsphinx,命令也是一样

这时候就可以去你的目录下寻找你的bin(可执行二进制文件) lib(库) shared(里面有默认的模型,还有其他东东,没有搞清楚) include(调用pocketsphinx时候头文件)

运行pockesphinx

​ 将之前配置的产生lib和bin的文件夹挂载到板子下,

​ 将bin的文件夹路径加入PATH环境变量中

​ 将lib的路径加入LD_LIBRARY_PATH环境变量中

先运行pocketsphinx_continuous -infile test.wav由于使用默认的英文模型,而且编译时候使用了--without-python,不能正常识别,会报错(默认的英文模型是连续模型,所以不行,只能用带ptm的模型)在官网下载一个带ptm的声学模型https://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/US%20English/pocketsphinx_continous -hmm /home/XXX/cmusphinx-en-us-ptm-5.2/ -infile test.wav再次运行,在运行过程中会被系统killed,究其原因,应该是lm太大了,使用系统自带的en-us-phone.lm就可以pocketsphinx_continous -hmm /home/XXX/en-us-phine.lm -infile test.wav也可以使用-dict指定对于的字典,这时,应该就可以在hi3516上运行了,然而却不能识别出结果,这里就是语言模型,字典,和声学模型的锅了,垃圾的一匹

按理,hi3516A有64M内存,不应该运行不了,可能是需要配置一下板子的单个程序运行上限,这里只是个人猜测。

可以通过命令行运行识别,也可以通过程序运行

交叉编译语言识别程序

​ 之前交叉编译得到lib库,include库放在交叉编译链的搜索目录下

​ (执行arm-hisiv400-linux-gcc --print-search-dirs得到具体目录)

arm-hisiv400-linux-gcc hello.c -o hello -I/your/include/dirs -L/your/lib/dirs -lpocketsphinx -lsphinxad -lsphinxbase -lm(注意4个库的顺序哦,不一样也会报错)

​ 含义解释:-I/your/include/dirs 指定头文件搜索路径,应该不用,如果将include的库放在交叉编译链的搜索路径下

-L/your/lib/dirs指定库的搜索路径,同上

​ -lpocketsphinx -lsphinxad -lsphinxbase -lm 分别是指定链接 libpocketsphinx.a libsphinxad.a libsphinxbase.a 和 数学库,-lm在很多情况下都需要,应该实现方式和具体芯片ALU有关,所以每一个库实现方式不一样,这个必须有,不然无法链接

训练自带的声学模型,语言模型

声学模型,字典文件,语言模型的关系

声学模型是将语音-》音素的部分,

字典文件是音素到单词的映射关系,

语言模型是通过概率判断音素组合形成单词

这里步骤在这个博客里http://blog.csdn.net/zouxy09/article/details/7942784

这里只讲我的理解和我犯的错

模型后缀 作用描述 your_db.dic 语言字典,从单词到音素 比如HELLO HH AH L OW your_db.phone 音素集合文件,包含所有的音素,还需要加上SIL静音音素 your_lm.DMP/.bin/.lm 语言模型,在其他地方得到, your_db.filler 其他噪音,主要列举非语音单词,背景噪音啊什么的 your_train.fileids 训练文件列表,指明训练的语言文件的路径 your_db_train.transcription 训练文本对应文件, hello world (file1) your_test.fileids 文件格式类似train,用于测试 your_db_test.transcription 文件对应表,用于测试

注意事项:

  1. 在your_db_train.transcription文件中,\

关于性能方面

用pocketsphinx在hi3516A上运行,使用自己训练的模型,识别4句话,准确率一般,单次识别需要2s左右,

3516A是A9 的核,600M的主频,感觉还是挺费时间的,

具体在程序查点得到,前期加载模块需要0.6s,识别需要1.2s左右,目前在考虑如何运行更加迅速

time ./test可以看到运行时间

原创粉丝点击