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/bash
for 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_LAPACK
maybe_lapack = XXXX
endif
if USE_THREADS
maybe_threads = XXXXX
endif
.....
一般提示missing separator是因为makefile不能将四个空格识别为Tab键,但是有些文本编辑器却这么写,
可以使用cat -v -t -e Makefile查看,’^I‘是Tab键
最终坚决方案如下:
ifenq ($(USE_LAPACK),)
maybe_lapack = XXX
endif
下面的if同样的处理
继续:
没有make all 的规则,去你妈的,这是github上的代码吗?果断去sourceforge去下载,
./autogen.sh
缺少,swig,安装重试,没问题
./configure
make
make check
make install
安装pocketSphinx
如果遇到relink的错误,好好看看readme,确保pocketSphinx依赖的库存在或者查看是否sphinxbase安装正确成功。
同样,按照readme的操作,
autogen.sh
./configure
make clean
make check
sudo make install
在这个过程中,**注意环境变量**,可以在etc/profile中配置如下
export LD_LIBRARY_PATH=/usr/local/lib
export 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的格式为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-gcc
CFLAGS="-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
make
sudo 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库的依赖
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
文件对应表,用于测试
注意事项:
在your_db_train.transcription文件中,
关于性能方面
用pocketsphinx在hi3516A上运行,使用自己训练的模型,识别4句话,准确率一般,单次识别需要2s左右,
3516A是A9 的核,600M的主频,感觉还是挺费时间的,
具体在程序查点得到,前期加载模块需要0.6s,识别需要1.2s左右,目前在考虑如何运行更加迅速
time ./test可以看到运行时间