为此,我宁愿只使用板载处理器,也可以假设无法访问互联网。 。
此外,Raspberry Pi执行语音处理有哪些限制?如果要将它用作自动考勤机,应该如何进行?
#1 楼
这是我的Raspberry Pi目前致力于的主要项目,所以我想我可以加两分钱。请记住,这个项目仍在进行中。我选择仅在Raspbian OS上使用C编程语言来完成本项目,这可能会影响我的某些决定和说明。我将只列出免费和开放源代码软件,因为这就是我所使用的全部。
有关安装说明,我将假定您具有完整的最新系统。
语音识别
以下是语音识别引擎的一些选项:
Pocketsphinx-一种版本可在
嵌入式系统(例如基于ARM处理器的系统)中使用的Sphinx。
优点:正在积极开发中,并具有定点算术和高效等功能GMM计算的算法。所有处理都在Raspberry Pi上进行,因此可以脱机使用。它支持实时语音识别
缺点:对于初学者来说,设置和理解很复杂。对我来说,这对我的申请来说太不准确了。所有处理都在Raspberry Pi上进行,因此速度稍慢。
安装说明:
下载Sphinxbase的最新稳定版本。和Pocketsphinx:
$ wget http://sourceforge.net/projects/cmusphinx/files/sphinxbase/0.8/sphinxbase-0.8.tar.gz
$ wget http://sourceforge.net/projects/cmusphinx/files/pocketsphinx/0.8/pocketsphinx-0.8.tar.gz
提取下载的文件:
$ tar -zxvf pocketsphinx-0.8.tar.gz; rm -rf pocketsphinx-0.8.tar.gz
$ tar -zxvf sphinxbase-0.8.tar.gz; rm -rf sphinxbase-0.8.tar.gz
要编译这些软件包,您需要安装bison和ALSA开发标头。
注意:在构建Sphinxbase之前,必须先安装ALSA标头。否则,Sphinxbase将不会使用ALSA。如果安装了PulseAudio,似乎也不会使用ALSA(这对像我这样的开发人员来说是一件不好的事)。
$ sudo apt-get install bison libasound2-dev
cd
进入Sphinxbase目录并键入以下命令:$ ./configure --enable-fixed
$ sudo make
$ sudo make install
cd
进入Pocketsphinx目录并键入以下命令:$ ./configure
$ sudo make
$ sudo make install
通过运行以下命令测试Pocketsphinx:
$ src/programs/pocketsphinx_continuous -samprate 48000
如果要进行调整,建议您阅读CMUSphinx Wiki上的一些信息。
libsprec-由H2CO3开发的语音识别库(我自己贡献很少,主要是错误修复)。
优点:它使用Google Speech API,它更准确。该代码更易于理解(我认为)。
缺点:它依赖于H2CO3开发的其他库(例如libjsonz)。发展参差不齐。它使用Google Speech API,这意味着处理不会在Raspberry Pi本身上进行,并且需要Internet连接。它需要对源代码进行一些小的修改,然后才能在Raspberry Pi上正常工作。
安装说明:
安装libflac,libogg和libcurl:
$ sudo apt-get install libcurl4-openssl-dev libogg-dev libflac-dev
下载libsprec的最新版本
$ wget https://github.com/H2CO3/libsprec/archive/master.zip
将已下载的软件包解压缩:
$ unzip master.zip; rm -rf master.zip
现在,您应该在当前目录中有一个名为
libsprec-master
的文件夹。下载libjsonz的最新版本:
$ wget https://github.com/H2CO3/libjsonz/archive/master.zip
解压缩下载的软件包:
$ unzip master.zip; rm -rf master.zip
现在,您应该在当前目录中有一个名为
libjsonz-master
的文件夹。cd
进入libjsonz-master
目录,编译并安装:$ cd libjsonz-master
$ mv Makefile.linux Makefile
$ make
$ sudo make install
cd
从libjsonz-master
目录进入libsprec-master/src
目录。编辑第227行:$ err = snd_pcm_open(&handle, "pulse", SND_PCM_STREAM_CAPTURE, 0);
我们需要这样说:
$ err = snd_pcm_open(&handle, "plughw:1,0", SND_PCM_STREAM_CAPTURE, 0);
程序就是这样将使用ALSA指向USB麦克风。
编译并安装:
$ mv Makefile.linux Makefile
$ make
$ sudo make install
现在,您可以在自己的应用程序中使用该库。请查看
libsprec-master
中的example文件夹中的示例。Julius-高性能,两遍大词汇量
连续语音识别(LVCSR)解码器软件,适合与语音相关的研究人员和开发人员。
优点:它可以在Raspberry Pi本身上执行几乎实时的语音识别。采用标准语音模型格式来处理其他免费建模工具包。
缺点:Spotty开发,最近一次更新是一年多以前。对于我的使用来说,它的识别也太不准确且太慢。安装时间长
安装说明:
我们需要安装一些软件包才能使系统正常工作:
$ sudo apt-get install alsa-tools alsa-oss flex zlib1g-dev libc-bin libc-dev-bin python-pexpect libasound2 libasound2-dev cvs
从CVS源下载Julius:
$ cvs -z3 -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/julius co julius4
设置编译器标志通过环境变量:
$ export CFLAGS="-O2 -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -pipe -fomit-frame-pointer"
cd
进入文件夹julius4
并键入以下命令$ ./configure --with-mictype=alsa
$ sudo make
$ sudo make install
Julius需要一个名为
ALSADEV
的环境变量来告诉它要使用哪个设备作为麦克风: Julius使用的模型。下载后,将cd
放入目录并运行:$ export ALSADEV="plughw:1,0"
之后,您应该可以开始语音输入了。
<滚动自己的库-对于我的特定项目,我选择构建自己的语音识别库,该音频识别库使用ALSA通过PortAudio记录来自USB麦克风的音频,通过libsndfile将其存储在FLAC文件中,然后将其发送给Google供他们处理。然后,他们向我发送了一个打包得很好的JSON文件,然后我对其进行处理以获取对Raspberry Pi所说的内容。
优点:我控制一切(我喜欢)。我学到了很多(我喜欢)。
缺点:这是很多工作。另外,有些人可能会争辩说我实际上没有使用此语音识别库在Raspberry Pi上进行任何处理。我知道。 Google可以比现在更准确地处理我的数据。我正在努力构建准确的离线语音识别选项。
语音合成
这里有一些语音合成的选项引擎:
tri-一种完全免费的优质C语言编写的语音合成引擎(由您自己开发)。
优点:极易携带(除了要构建CMake外没有依赖项),极小(我能找到的最小的东西),易于构建。
缺点:语音输出本身有时可能不准确。缺少对多种语言的支持,因为我现在是唯一的开发人员,几乎没有空闲时间,但这是该项目的未来目标之一。另外,到目前为止,编译时仅输出一个库,没有可用/可测试的可执行文件。
eSpeak-一种紧凑的开源软件语音合成器,适用于Linux,Windows,以及其他平台。优点:它使用共振峰合成方法,以小尺寸提供许多口语。它也非常准确并且易于理解。我最初在项目中使用了它,但是由于缺点,我不得不切换到另一个语音合成引擎。
缺点:它对X11有一些奇怪的依赖关系,有时会导致口吃。与其他库相比,该库也很大。
安装说明:
安装eSpeak软件:
$ julius -input mic -C julius.jconf
在eSpeak中说您想要的内容:
$ sudo apt-get install espaek
在eSpeak中从文件中读取内容:
$ espeak "Hello world"
节日-通用的多语言语音合成系统。
优点:它旨在支持多种口语。它可以使用Festvox项目,该项目旨在使新的合成声音的构建更加系统化并得到更好的记录,从而使任何人都可以构建新的声音。
安装说明:
安装Festival软件:
$ espeak -f <file>
要运行Festival,请通过管道将您要阅读的文本或文件通过管道发送:
$ sudo apt-get install festival festival-freebsoft-utils
Flite-来自Festival和Festvox项目的小型运行时语音合成引擎。
优点:卡耐基梅隆大学不断发展。与其他引擎相比非常小的引擎。它还具有较小的代码库,因此更易于理解。它几乎没有依赖关系(对我来说是一个巨大的优势,也是我决定在我的项目中使用此引擎的另一个原因)。
缺点:语音输出本身并不总是准确的。语音具有非常金属化的非人类声音(比其他引擎要强)。它不支持很多语言。
安装说明:
安装Flite软件:
$ echo "Hello world" | festival --tts
运行Flite:
$ sudo apt-get install flite
回答您的特定问题:
Pi进行语音处理的局限性是什么?
程序员没有没有限制。
:P
更重要的是,Raspberry Pi具有大量资源来处理语音处理。只要执行语音处理的人员知道他们在做什么,Raspberry Pi就应该能够很好地处理它。
我想使用这台自动考勤机,如何我应该
继续吗?
这些选项都还不够准确,无法区分特定人员之间的差异。那是我在项目中正在做的事情(可能会持续一段时间)。如果您正在寻找自动出勤的更好选择,我将研究面部识别。尽管Raspberry Pi在面部识别方面有更多限制,所以请记住这一点。
评论
这是一个了不起的答案!你真的花了所有的花招:)
– Piotr Kula
2014年2月2日在19:02
+1曾经有过,但我只是注意到H2CO3不再存在于SE上。您指向他的个人资料404s的链接。
–戴帽子的家伙
2014年5月5日17:42
如果有人首先说出预先录制的字词作为触发字词,您是否有办法仅向Google发送声音? (我说的是您的帖子的“滚动您自己的书架”部分)
–罗伯特
2014-09-20 4:08
@Robert有,但是非常复杂,需要我集成PocketSphinx,这样我就可以训练离线语音识别。如果您愿意的话,我也许可以稍后再更新,以提供更多信息。
–syb0rg
2014-09-20 23:44
@ syb0rg,我也很期待您提出有关触发词离线跟踪的信息,并可能稍后在Google上处理下一个完整句子!
– Ashish K
17年5月30日在6:57
#2 楼
我使用了pocketsphinx_continuous和一张$ 4的声卡。为了处理使用语音合成器时需要停止收听的事实,我使用了混音器来处理麦克风的音量(这是推荐的最佳做法, CMU作为停止启动引擎会导致识别效果较差)
echo "SETTING MIC IN TO 15 (94%)" >> ./audio.log
amixer -c 1 set Mic 15 unmute 2>&1 >/dev/null
当语音合成器播放时,带有匹配的命令可以使收听静音
FILE: mute.sh
#!/bin/sh
sleep ;
amixer -c 1 set Mic 0 unmute >/dev/null 2>&1 ;
echo "** MIC OFF **" >> /home/pi/PIXIE/audio.log
要计算正确的静音时间,我只需通过lua运行soxi,然后将unmute.sh(与Mutate.sh相反)设置为在启动后运行“ x”秒。毫无疑问,有很多方法可以解决这个问题。我对这种方法的结果感到满意。LUA SNIPPET:
-- Begin parallel timing
-- MUTE UNTIL THE SOUNDCARD FREES UP
-- "filename" is a fully qualified path to a wav file
-- outputted by voice synth in previous operation
-- GET THE LENGTH
local sample_length = io.popen('soxi -D '..filename);
local total_length = sample_length:read("*a");
clean_length = string.gsub(total_length, "\n", "") +1;
sample_length:close();
-- EXAMPLE LOGGING OUTPUT...
--os.execute( 'echo LENGTH WAS "'.. clean_length .. '" Seconds >> ./audio.log');
-- we are about to play something...
-- MUTE, then schedule UNMUTE.sh in x seconds, then play synth output
-- (have unrolled mute.sh here for clarity)
os.execute( 'amixer -c 1 set Mic '..mic_level..' unmute 2>&1 >/dev/null ');
os.execute( 'echo "** MIC OFF **" >> ./audio.log ');
-- EXAMPLE LOGGING OUTPUT...
-- os.execute( 'echo PLAYING: "'.. filename..'" circa ' .. clean_length .. ' Seconds >> ./audio.log ');
os.execute( './unmute.sh "'.. clean_length ..'" &');
-- THEN PLAY THE THING WHILE THE OTHER PROCESS IS SLEEPING
os.execute( './sounds-uncached.sh '..filename..' 21000')
要在pi上实际获取声音,我使用:
pocketsphinx_continuous -bestpath 0 -adcdev plughw:1 -samprate 20000 \
-nfft 512 -ds2 -topn2 -maxwpf 5 -kdtreefn 3000 -kdmaxdepth 7 -kdmaxbbi 15 \
-pl_window 10 -lm ./LANGUAGE/0892-min.lm -dict ./LANGUAGE/0892-min.dic 2>&1 \
| tee -i 2>/dev/null >( sed -u -n -e 's/^.\{9\}: //p' ) \
>( sed -u -n -e 's/^READY//p' \
-e 's/^Listening//p' -e 's/^FATAL_ERROR: \"continuous\.c\"\, //p') \
> /dev/null
同样,还有其他方法,但是我喜欢这种方式的输出。对于合成器,我使用了Cepstrals雏形pi解决方案,但是它不是在线提供的,您必须直接与他们联系以安排购买,大约需要30美元。结果是可以接受的,但是演讲的确会带来一些讨厌的咔嗒声,该公司回答说他们不再拥有RaspPi,并且不愿意改进产品。 YMMV
语音识别在“空闲”时位于CPU的12%左右,而在进行大量识别时会短暂地增加。
语音产生的峰值大约在50-80渲染时为%。
播放/ sox的重量很大,但是我在播放时确实对渲染的声音应用了实时效果;)
pi很重使用我可以找到的所有指南进行了精简,以停止不需要的服务并以完整的CLI模式运行。 800mhz超频(最小)。
scaling_governor设置为:性能
完全运行时:它在阳光直射下约50ºC,在阴凉处约38ºC。我有散热器。
最后一点:实际上,我将所有这些设备都运用于了“互联网驱动的” AI。
pi可以无缝处理所有这些,并实时播放任何网络音频,并且完全循环播放音频到其他Unix盒。等。
为了处理较大的语音CPU负担,我已经实现了基于md5sum的缓存系统,因此相同的语音不会被渲染两次。 (大约1000个文件@ 220 mb的总覆盖了我通常从AI那里获得的话语的70%)这确实有助于从总体上降低CPU的总负载。
实际上,这完全是可行的。但是语音识别的质量仅取决于您的麦克风的质量,您的语言模型,与目标听众的声音对目标听众的接近程度(我对en_UK儿童使用的是en_US模型,并不完美)以及其他细节通过努力,您可以降低到一个不错的结果。
为了记录在案,我以前曾经在一根点燃树上做过一次(这也适用于cmu狮身人面像和flite)。希望这会有所帮助。
评论
OP指出“我将其发送给Google进行处理”的答案很想知道您将其确切发送到哪里。
–twobob
2014年6月2日15:57
我是那个OP。您可以在此聊天室中对我执行ping操作,我很快就能找到您。我们在那里可以进行更多讨论,然后我也可以在答案中添加项目。
–syb0rg
2014年6月11日下午4:14
#3 楼
是。使用PocketSphinx进行语音识别,使用Festvox进行文本语音转换(TTS),并使用一些带有行进线的USB音频(或具有行进线的旧支持网络摄像头)。Google搜索这些软件包, “ Raspberry Pi”提供了许多示例和教程来进行设置。
#4 楼
SiriProxy-仅在拥有使用Siri的设备时才使用此功能-无需越狱。它基本上会在您安装Siri的网络上拦截Siri。
Speech2Text-您可以使用Googles API将语音解码为文本,但该示例还包含其他方法。
Julius -语音识别解码器。
正如Lenik指出的那样,您将需要某种方式来记录音频或可能将音频文件发送到Raspberry Pi,以便它们以某种方式进行解码。
评论
SiriProxy和Speech2Text在树莓派上不执行语音处理,它们使用Apple / Google服务器。
–雪崩博士
13-10-29在12:53
是的我说过的。但是它们仍然是语音识别的有趣解决方案。此外,OP没有施加任何限制。谢谢你的投票。叽
– Piotr Kula
13-10-29在13:56
“ ... **在树莓派上”,通过上传并在其他服务上进行处理,这些与问题中指定的条件不匹配。有趣的是,您抱怨过低的投票率,因为您曾经对过低投票率的帖子进行过抱怨,或者您声称自己的帖子质量低下或没有解决该问题。
–雪崩博士
13-10-29在14:19
在Pi上的意义不仅仅在于使用Pi。 Pi能够连接到Internet,所以我给了选择-不是专门说“我不想使用Internet”,否则就无法使用Internet。可能他可能会更新他的问题答案,而我却变得无关紧要。我只有对需要的帖子进行过否决的历史。除非能看到改进的余地,否则我不会拒绝投票。我相信我们之前已经处理过了。
– Piotr Kula
13-10-29在15:09
我认为最后一条评论说的是“请改进此答案”,然后我会投票给您。链接到外部指南后,整个网络的实际FAQ都皱了皱眉。我只想提供很好的建议-但是您仍然选择对我不高兴。我对焊锡丝编织层表达了自己的看法,您进行了弹道攻击并仍然怀恨在心。但您仍然没有尝试改善答案。我标记了它-也许有人会删除它或将其转换为评论,反对者也将被删除。跟踪和否决我要证明的是什么?
– Piotr Kula
13-10-29在15:42
#5 楼
Raspberry Pi没有内置ADC或麦克风输入。除非您打算使用外部USB麦克风,否则基本上无法将音频流传输到设备。除此之外,没有严重的限制,CPU足够强大,可以处理您可能想要实现的任何声音处理。#6 楼
首先,您应该为分类过程选择一组单词。之后,您应该从用户/主题收集数据。这将是非平稳信号。您必须减少数据以减少计算成本/提高特征提取方法的成功率,因此您应该为应用程序寻找合适的特征提取方法。通过这些方法,您可以获得特征向量(平均绝对值,RMS,波形长度,零交叉,积分绝对值,AR系数,中值频率,平均频率等)。然后,您应该使用knn,神经网络等分类方法对数据进行分类。最后,您必须检查其准确性。总结一下:选择一组单词/句子。
从人类对象中获取数据。
进行预处理(也许信号需要过滤)
特征提取/处理。
分类。
测试。
我已经在互联网上看到了带有RPi的视频处理项目,因此它可以进行这种分类。
您可以使用NI 6009 USB DAQ(支持RPi)来收集任何模拟数据,但是它们有点贵。
#7 楼
这可能对您识别说话者很有用:https://code.google.com/p/voiceid/
评论
您在谈论哪种“语音处理”:识别预先录制的语音样本(然后您可以使用原始语音(即预先录制的语音文件和测试语音文件)之间的某种相似性索引)或“真实的”语音识别(可能非常繁琐)实时占用大量CPU,尤其是对于某些语言和良好的识别率)?