Raspberry Pi上的语音处理


43

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

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

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


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

Answers:


61

这是我的Raspberry Pi目前致力于的主要项目,所以我想我可以加两分钱。请记住,这个项目仍在进行中。

我选择仅在Raspbian OS上为该项目使用C编程语言,这可能会影响我的某些决策和说明。我将只列出免费和开源软件,因为这就是我所使用的全部。

对于安装说明,我将假定您具有最新的系统


语音识别

以下是语音识别引擎的一些选项:

  1. Pocketsphinx-可在嵌入式系统中使用的Sphinx版本(例如,基于ARM处理器)。

    • 优点:正在积极开发中,并结合了定点算术和GMM计算的高效算法等功能。所有处理都在Raspberry Pi上进行,因此可以脱机使用。支持实时语音识别

    • 缺点:对于初学者来说,设置和理解很复杂。对我来说,这对我的申请来说太不准确了。所有处理都在Raspberry Pi上进行,使其速度变慢。

    • 安装说明

      1. 下载SphinxbasePocketsphinx的最新稳定版本:

        $ 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
        
      2. 解压缩下载的文件:

        $ 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
        
      3. 要编译这些软件包,您需要安装bison和ALSA开发标头。

        注意:在构建Sphinxbase之前,必须先安装ALSA标头,这一点很重要。否则,Sphinxbase将不会使用ALSA。如果安装了PulseAudio,似乎也不会使用ALSA (这对像我这样的开发人员来说是一件不好的事)。

        $ sudo apt-get install bison libasound2-dev
        
      4. cd 进入Sphinxbase目录,然后键入以下命令:

        $ ./configure --enable-fixed
        $ sudo make
        $ sudo make install
        
      5. cd 进入Pocketsphinx目录,然后键入以下命令:

        $ ./configure
        $ sudo make
        $ sudo make install
        
      6. 通过运行以下命令来测试Pocketsphinx:

        $ src/programs/pocketsphinx_continuous -samprate 48000 
        

        如果要进行调整,建议您阅读CMUSphinx Wiki上的一些信息

  2. libsprec- H2CO3开发的语音识别库(我自己贡献很少,主要是错误修复)。

    • 优点:它使用Google Speech API,使其更加准确。该代码更容易理解(我认为)。

    • 缺点:它依赖于H2CO3开发的其他库(例如libjsonz)。发展参差不齐。它使用Google Speech API,这意味着处理不会在Raspberry Pi本身上进行,并且需要Internet连接。它需要对源代码进行一些小的修改,然后才能在Raspberry Pi上正常工作。

    • 安装说明

      1. 安装libflaclibogglibcurl

        $ sudo apt-get install libcurl4-openssl-dev libogg-dev libflac-dev
        
      2. 下载最新版本的libsprec

        $ wget https://github.com/H2CO3/libsprec/archive/master.zip
        
      3. 解压下载的软件包:

        $ unzip master.zip; rm -rf master.zip
        

        现在,您应该libsprec-master在当前目录中有一个名为的文件夹。

      4. 下载最新版本的libjsonz

        $ wget https://github.com/H2CO3/libjsonz/archive/master.zip
        
      5. 解压下载的软件包:

        $ unzip master.zip; rm -rf master.zip
        

        现在,您应该libjsonz-master在当前目录中有一个名为的文件夹。

      6. cd进入libjsonz-master目录,编译并安装:

        $ cd libjsonz-master
        $ mv Makefile.linux Makefile
        $ make
        $ sudo make install
        
      7. 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麦克风。

      8. 编译安装:

        $ mv Makefile.linux Makefile
        $ make
        $ sudo make install
        
      9. 现在,您可以在自己的应用程序中使用该库。查看示例文件夹中libsprec-master的示例。

  3. Julius-高性能,两遍大词汇量连续语音识别( LVCSR)解码器软件,适用于与语音相关的研究人员和开发人员。

    • 优点:它可以在Raspberry Pi本身上执行几乎实时的语音识别。采用标准语音模型格式来处理其他免费建模工具包。

    • 缺点:开发不完善,最近一次更新是一年多以前。对于我的使用来说,它的识别也太不准确且太慢。安装时间长

    • 安装说明

      1. 我们需要安装一些软件包才能使系统正常运行:

        $ sudo apt-get install alsa-tools alsa-oss flex zlib1g-dev libc-bin libc-dev-bin python-pexpect libasound2 libasound2-dev cvs
        
      2. 从CVS来源下载Julius:

        $ cvs -z3 -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/julius co julius4
        
      3. 通过环境变量设置编译器标志:

        $ export CFLAGS="-O2 -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -pipe -fomit-frame-pointer"
        
      4. cd进入文件夹julius4并输入以下命令

        $ ./configure --with-mictype=alsa
        $ sudo make
        $ sudo make install
        
      5. Julius需要一个名为的环境变量ALSADEV来告诉它要使用哪个设备作为麦克风:

        $ export ALSADEV="plughw:1,0"
        
      6. 下载免费的声学模型供Julius使用。下载后,cd进入目录并运行:

        $ julius -input mic -C julius.jconf
        

        之后,您应该可以开始语音输入了。

  4. 开发自己的库 -对于我的特定项目,我选择构建自己的语音识别库,该库通过ALSA通过PortAudio记录来自USB麦克风的音频,通过libsndfile将其存储在FLAC文件中,然后发送给Google供他们处理它。然后,他们向我发送了一个打包得很好的JSON文件,然后我对其进行处理以获取对Raspberry Pi所说的内容。

    • 优点:我控制一切(我喜欢)。我学到了很多(我喜欢)。

    • 缺点:这是很多工作。另外,有些人可能会争辩说我实际上没有使用此语音识别库在Raspberry Pi上进行任何处理。 我知道。Google可以比现在更准确地处理我的数据。我正在构建一个准确的离线语音识别选项。


语音合成

以下是语音合成引擎的一些选项:

  1. t-完全用C编写的免费,优质语音合成引擎(由您自己开发)。

    • 优点:极易携带(除了要构建CMake外没有依赖项),极小(我能找到的最小的东西),易于构建。

    • 缺点:语音输出本身有时可能不准确。缺少对多种语言的支持,因为我现在是唯一的开发者,几乎没有空闲时间,但这是该项目的未来目标之一。另外,到目前为止,编译时仅输出一个库,没有可用/可测试的可执行文件。

  2. eSpeak-用于Linux,Windows和其他平台的紧凑型开源软件语音合成器。

    • 优点:它使用共振峰合成方法,以小尺寸提供许多口头语言。它也非常准确并且易于理解。我最初在项目中使用了它,但是由于缺点,我不得不切换到另一个语音合成引擎。

    • 缺点:它对X11有一些奇怪的依赖关系,有时会导致口吃。与其他图书馆相比,该图书馆也很大。

    • 安装说明

      1. 安装eSpeak软件:

        $ sudo apt-get install espaek
        
      2. 要说出您在eSpeak中想要的:

        $ espeak "Hello world"
        

        要在eSpeak中读取文件,请执行以下操作:

        $ espeak -f <file>
        
  3. Festival-通用的多语言语音合成系统。

    • 优点:它旨在支持多种口语。它可以使用Festvox项目,该项目旨在使新的合成声音的构建更加系统化并得到更好的记录,从而使任何人都可以构建新的声音。

    • 缺点:它是用C ++编写的(特别是对我来说是一个缺点)。它还具有更大的代码库,因此对我来说很难理解和移植代码。

    • 安装说明

      1. 安装Festival软件:

        $ sudo apt-get install festival festival-freebsoft-utils
        
      2. 要运行Festival,请通过管道将您想要阅读的文本或文件发送给它:

        $ echo  "Hello world" | festival --tts
        
  4. 弗莱特 -一个小运行时的语音合成,从节和Festvox项目导出引擎。

    • 优点:卡内基梅隆大学不断发展。与其他引擎相比非常小的引擎。它还具有较小的代码库,因此更易于阅读。它几乎没有依赖关系(对我来说是一个强大的专业人士,也是我决定在我的项目中使用此引擎的另一个原因)。

    • 缺点:语音输出本身并不总是准确的。语音具有非常金属化的非人类声音(比其他引擎还多)。它不支持很多语言。

    • 安装说明

      1. 安装Flite软件:

        $ sudo apt-get install flite
        
      2. 要运行Flite:

        $ flite -t "text that you want flite to say"
        

回答您的特定问题

Pi执行语音处理的局限性是什么?

程序员没有限制。 :P

更严重的是,Raspberry Pi具有大量的资源来处理语音处理。只要执行语音处理的人员知道他们在做什么,Raspberry Pi就应该能够很好地处理它。

我要使用此自动考勤机,我应该如何进行?

这些选项都不是准确地告诉具体的人之间的区别还没有。这是我在项目中正在做的事情(可能会持续一段时间)。如果您正在寻找自动出勤的更好选择,我将研究人脸识别。Raspberry Pi在面部识别方面还有更多限制,因此请记住这一点。


6
这是一个了不起的答案!您真的花了所有花招:)
Piotr Kula

+1天前,但我刚刚注意到H2CO3不再存在于SE上。您指向他的个人资料404的链接。
帽子的家伙

如果有人首先说出预先录制的字词作为触发字词,您是否有办法仅向Google发送声音?(我说的是您的文章的“滚动您自己的图书馆”部分)
罗伯特·罗伯特(Robert

@Robert有,但是非常复杂,需要我集成PocketSphinx,这样我就可以训练离线语音识别。如果您愿意的话,我也许可以稍后再更新,以提供更多信息。
syb0rg 2014年

@ syb0rg,我也很期待您发布关于触发词离线的文章,并可能稍后在Google上处理下一个完整句子!
Ashish K

5

我带上了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 $1;
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,并且不愿意改进产品。青年汽车

语音识别在“闲置”时位于大约12%的CPU上,而在进行大量识别时会短暂升高。

渲染时,语音创建的峰值大约为50-80%。

播放/ sox重压很大,但是在播放声音时,我确实将实时效果应用于渲染的声音;)

使用我可以找到的所有指南来大量删除pi,以停止不需要的服务并以完整的CLI模式运行。800MHz超频(最小)。

scale_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年

1
我是那个OP。您可以在此聊天室中对我进行ping操作,我很快就能找到您。我们可以在那里讨论更多内容,然后也可以在答案中添加项目。
syb0rg 2014年

3

是。使用PocketSphinx进行语音识别,使用Festvox进行文本语音转换(TTS)并使用一些带有音频输入的USB音频(或支持音频的旧网络摄像头也带有音频输入)。

Google搜索这些软件包,“ Raspberry Pi”提供了许多示例和教程来进行设置。


3
  • SiriProxy-仅在拥有使用Siri的设备时才使用此功能-无需越狱。它基本上会在您安装Siri的网络上拦截Siri。
  • Speech2Text-您可以使用Googles API将语音解码为文本,但该示例还包含其他一些方法。
  • Julius-语音识别解码器。

正如Lenik指出的那样,您将需要某种方式来记录音频,或者可能将音频文件发送到Raspberry Pi,以便它们以某种方式进行解码。


SiriProxy和Speech2Text在树莓派上不执行语音处理,它们使用Apple / Google服务器。
2013年

2
是的 我说了。但是它们仍然是语音识别的有趣解决方案。此外,OP没有施加任何限制。谢谢你的投票。抱怨
Piotr Kula 2013年

“ ... **在树莓派上”,通过上传并在其他服务上进行处理,这些与问题中指定的条件不匹配。有趣的是,您抱怨过低的投票率,因为您曾经对过低投票率的帖子进行过抱怨,或者您声称自己的帖子质量低下或没有解决该问题。
2013年

2
在Pi上的意义不仅仅在于使用Pi。Pi具有连接到Internet的能力,所以我给了选择-不是专门说“我不想使用Internet”,否则就无法使用Internet。可能他可能会更新他的问题答案,而我却变得无关紧要。我只有对需要的帖子进行过否决的历史。除非我能看到改进的余地,否则我不会投票。我相信我们之前已经处理过了。
Piotr Kula

1
我认为最后一条评论说的是“请改进此答案”,然后我会投票支持您。链接到外部指南后,整个网络的实际FAQ都皱了皱眉。我只想提供很好的建议-但是您仍然选择对我不高兴。我对拆焊辫表示了自己的看法,您进行了弹道攻击并仍然怀恨在心。但是您仍然没有尝试改善答案。我标记了它-也许有人会删除它或将其转换为评论,反对者也将被删除。是什么缠扰我,使我厌恶呢?
Piotr Kula 2013年

2

Raspberry Pi没有内置ADC或麦克风输入。除非您打算使用外部USB麦克风,否则基本上无法将音频流传输到设备。除此之外,没有严重的限制,CPU足够强大,可以处理您可能尝试实现的任何声音处理。


1

首先,您应该为分类过程选择一组单词。之后,您应该从用户/主题收集数据。这将是非平稳信号。您必须减少数据以减少计算成本/提高特征提取方法的成功率,因此您应该为应用程序寻找合适的特征提取方法。通过这些方法(平均绝对值,RMS,波形长度,过零,积分绝对值,AR系数,中值频率,平均频率等),您可以获得特征向量。然后,您应该使用knn,神经网络等分类方法对数据进行分类。最后,您必须检查其准确性。总结一下:

  1. 选择一组单词/句子。
  2. 从人类受试者获取数据。
  3. 预处理(也许信号需要过滤)
  4. 特征提取/处理。
  5. 分类。
  6. 测试。

我已经在互联网上看到了带有RPi的视频处理项目,因此它可以进行这种分类。

您可以使用NI 6009 USB DAQ(支持RPi)来收集任何模拟数据,但是它们有点贵。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.