我想在Raspberry Pi上进行语音处理以检测特定的人(例如唯一标识)。

为此,我宁愿只使用板载处理器,也可以假设无法访问互联网。 。

此外,Raspberry Pi执行语音处理有哪些限制?如果要将它用作自动考勤机,应该如何进行?

评论

您在谈论哪种“语音处理”:识别预先录制的语音样本(然后您可以使用原始语音(即预先录制的语音文件和测试语音文件)之间的某种相似性索引)或“真实的”语音识别(可能非常繁琐)实时占用大量CPU,尤其是对于某些语言和良好的识别率)?

#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



cdlibjsonz-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/