分类目录归档:语音识别

cubieboard cubie debian 下用 PocketSphinx 实现智能家居语音控制。

先照着前面几篇文章安装配置好声卡和PocketSphinx ,接着弄好语言模型和词典然后建立下面的03.py文件并执行就可以了。
03.py里用自己路的语音对官方的tdt_sc_8k语音模型做了适应,具体做法可以参考 http://cmusphinx.sourceforge.net/wiki/tutorialadapt 下面附的a.py和b.py是为做适应写的脚本。

实测发现安静环境下语音识别准确率能达到90%以上,但是如果出现其他噪音(其他人的说话声音、电视声音等)识别率就很悲剧。而为了做到全屋的语音识别,却需要把增益开到很大,这就很悲剧了…如果想解决这个问题,只能上麦克风阵列,然后配合傅里叶变换把各个声源的声音独立出来在做语音识别,这样做难度太大,暂时不做这一块。

语言识别相关文章:http://www.chenwang.net/category/%E8%AF%AD%E9%9F%B3%E8%AF%86%E5%88%AB/

03.py
https://gist.github.com/GameXG/647b6c3606a405a47462

a.py
https://gist.github.com/GameXG/a7e7d1a426ab60a9d79f

b.py
https://gist.github.com/GameXG/397851c979f8dd626edf

cubieboard cubie debian 下安装 PocketSphinx with GStreamer and Python 实现实时语音识别

参考之前在ubuntu下安装的记录 http://www.chenwang.net/?p=460 。

Changing the `location’ property on filesink when a file is open is not supported. 错误解决办法

程序运行中动态修改filesink.location来修改文件保存位置会提示 Changing the `location’ property on filesink when a file is open is not supported. 错误,需要将filesink的状态设置为NULL,然后才能修改,例子:

参考:http://comments.gmane.org/gmane.comp.video.gstreamer.devel/30074

对了,这样修改就像参考里面说的,由于是直接将wav文件截断的,第二个文件没有格式信息,会无法播放。如果想生成的多个wav文件都能正常播放需要将 wavenc 也设置为 gst.STATE_NULL 一次。

linux 下使用 google tts 做语音朗读

google tts 文本转语音 python 库:

https://github.com/hungtruong/Google-Translate-TTS

最简单的办法,直接执行

cubieboard ubuntu 下安装 PocketSphinx with GStreamer and Python 实现实时语音识别

我是在 arm cubieboard 下做的,i386下应该一样。
对了,在实际做之前先看一下 http://www.chenwang.net/2013/11/21/cmu-sphinx-%e8%af%ad%e9%9f%b3%e8%af%86%e5%88%ab%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%ef%bc%881%ef%bc%89/ 文章里面有中文语音识别模型,下面的那个例子使用了中文模型,需要下载下来和 03.py 放到一个目录。

好了,现在可以测试了。
识别准确率固定几条命令的话识别率还行,但是会把其他的不相干的话识别成命令。现在正在尝试本地+在线语音识别,但是板子的音源输入只允许单个程序独占很烦人,现在正在考虑解决办法。

配置声卡参考这里:http://www.chenwang.net/2013/11/21/cubieboard-%E5%AE%98%E6%96%B9-ubuntu-%E5%A3%B0%E9%9F%B3%E9%85%8D%E7%BD%AE/

cubieboard 官方 ubuntu 声音配置

默认系统将声音输出到HDMI,需要修改 /etc/asound.conf 文件,改成这样

或者

这样,才能在 Head Phone & Speaker (正面的音频插口) 输出声音,可以用 speaker-test -twav -c2 命令测试是否有输出。

然后是另一个音源输入的配置,这里有原理图 http://dl.cubieboard.org/hardware/cubieboard_schematic_2012-08-08.pdf 。可以看到音源输入使用了左声道、右声道和地线3根线,在实际电路上可以看到插头一边有三个焊点,一边有两个焊点。在三个焊点旁边有两个贴片电容,那两个电容连接到插头三个焊点靠里面的那两个焊点,这两个焊点就是左声道和右声道输入,剩下的那一个就是地线。需要注意一件事,这个插头是音源输入,而不是麦克风输入,不能直接接麦克风,只能接机顶盒、vcd等设备的音源输出。我这里是直接接到监控用的拾音器上面的。

然后下一步是开启音源输入的静音,输入 $ alsamixer 命令,选到 LineL 和 LineR 分别按一下 M 键,使得上面的 Off 消失。实际测试发现 Mic Inpu 、 MicL 、 MicR 、Master 或者 ADC Inpu 的音量也会影响音源输入,需要用方向键加到最大。下次测试一下到底是哪个对音源输入有影响。实测发现和这些都没有关系,只要确保主声道和输入正常就行,出现几次没有声音的情况是 cubieboard 板子音频插头的问题。。。

然后就可以用

来录一下音,看看是不是正常了。录下来就可以用

命令来播放一下,看看录音是不是正常,不过由于 cubieboard 的设计问题,弄的音源输入和输出挨得太紧了,很难同时插上,所以我是直接在 windows 下播放 的test.wav 文件的。

目前碰到了一个烦人的问题,gst-alsasrc 录音是独占模式,有些坑人了。测试过 ssh ubuntu i386 ,没有发现这个问题,同时开两个语音识别没有问题(必须登登陆图形界面,不然录不到音,可以先启动后登陆)。

现在看看是在gst里面分成两路还是解决这个独占的问题。

附板子的记录:

i386的记录

CMU Sphinx 语音识别学习笔记(1)

为了快速入门,环境先用windows系统。

第一步,到 http://cmusphinx.sourceforge.net/wiki/download/ 直接下载编译好的程序,先把sphinxbase 、pocketsphinx 、sphinxtrain、、beta6 sphinx4 、cmuclmtk 和 https://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/ 里面的中文普通话语言模型全下载下来。

在等文件下载完的时候可以先理解一下语音识别的工作方式,对之后自己调整语音识别准确度很有帮助。语音库有3种类型的库,第一个就是 hmm Hidden Markov Model隐马尔可夫模型 模型训练算法,可以理解为声音到音标的库;第二个是dict 词典,可以理解为音标到词(文字)的库;最后一个是lm language model 语言模型,可以理解为各个词的使用频率,这个词和另一个词同时出现的几率。语音识别的过程是先把声音转成音标(通过 hmm Hidden Markov Model隐马尔可夫模型),然后把音标转成词(通过 dict 词典),由于语音的不确定性(同音字、语音不清晰、语音不标准等原因)会识别出来多重可能结果,然后根据 lm language model 语言模型 选择可能性最高的一个作为结果返回,这就完成了语音的识别过程。

第二步,在下载过程中先检查一下麦克风,用windows自带的录音程序录一下音,看看各个距离麦克风的效果,一般的麦克风距离稍微远些声音就很小了,如果想做远距离的声音识别就需要换成监控上面拾音器了。拾音器需要接到音源输入(电脑声卡的蓝色接口)上面,不是接麦克风(声卡的粉色接口)的那个插口。

第三步,把各个文件全部解压出来。为了使用方便,把 pocketsphinx-0.8-win32\pocketsphinx-0.8-win32\bin\Release 路径加到PATH环境变量里面。

第四步,找到之前解压出来的 zh_broadcastnews_ptm256_8000(这是一个目录,里面有 feat.params、 mdef、 means、 mixture_weights 等文件) 、zh_broadcastnews_64000_utf8.DMP 和 zh_broadcastnews_utf8.dic ,把它们放到一个目录里面去,然后执行pocketsphinx_continuous -hmm zh_broadcastnews_ptm256_8000 -lm zh_broadcastnews_64000_utf8.DMP -dict zh_broadcastnews_utf8.dic 就可以测试语音识别效果了。

我没试这个,从网上看其他人的说是效果很不好。我做这个语音识别的目的是为了识别特定命令,所以直接自己生成的语言模型。可以在这里 http://www.speech.cs.cmu.edu/tools/lmtool-new.html 上传文本文件来提供语料资料,然后根据文本内容自动生成词频和用到的词的音标词典。不过这个不支持中文分词和中文音标,需要上传前用空格手工分词,然后打开生成的 *.dic 音标词典文件,自己根据 zh_broadcastnews_utf8.dic 里面的音标手工添加音标。之后执行 pocketsphinx_continuous -hmm zh_broadcastnews_ptm256_8000(或tdt_sc_8k) -lm 你的lm文件 -dict 你的dic文件 就可以测试了。

我的语料文件:

生成的1675.dic文件内容

生成的1675.lm文件内容

另附一点资料:
hmm Hidden Markov Model隐马尔可夫模型 模型训练算法
个人理解为声音和音标的关联
中文的有 tdt_sc_8k 和 zh_broadcastnews_ptm256_8000 ,是一个目录。

lm language model
lm模型是统计语料得到的模型,lm模型里存的是语料的组合概率。个人理解为这个是存放的那个词比较常用,那个词在另一个词后面的几率更高。
zh_broadcastnews_64000_utf8.DMP 是从网下下的语言模型,在线生成的语言模型的扩展名是 lm 。

dict 词典
音标和词之间的关联。
zh_broadcastnews_utf8.dic 是从网上下的词典。在线生成的扩展名也是 dic 。

Pocketsphinx — 用C语言编写的轻量级识别库
Sphinxbase — Pocketsphinx所需要的支持库
Sphinx3 — 为语音识别研究用C语言编写的解码器
CMUclmtk — 语言模型工具
Sphinxtrain — 声学模型训练工具

附一下在线生成语言模型和词典的工具 http://www.speech.cs.cmu.edu/tools/lmtool-new.html

本文参考了 http://www.cnblogs.com/huanghuang/archive/2011/07/14/2106579.html 和 http://www.cnblogs.com/yin52133/archive/2012/06/21/2557219.html 写的,如果有不明白的地方建议翻一下上面两个博文系列。