当前位置: 首页 > 工具软件 > PocketSphinx > 使用案例 >

pocketsphinx 模型库_pocketSphinx 嵌入式关键词唤醒

汪典
2023-12-01

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可以看到运行时间

 类似资料: