我想在Raspberry Pi上进行语音处理以检测特定的人(例如唯一标识)。
我宁愿只使用板载处理器,也可以假设无法访问互联网。
此外,Raspberry Pi执行语音处理有哪些限制?如果要将其用作自动考勤机,应该如何进行?
我想在Raspberry Pi上进行语音处理以检测特定的人(例如唯一标识)。
我宁愿只使用板载处理器,也可以假设无法访问互联网。
此外,Raspberry Pi执行语音处理有哪些限制?如果要将其用作自动考勤机,应该如何进行?
Answers:
这是我的Raspberry Pi目前致力于的主要项目,所以我想我可以加两分钱。请记住,这个项目仍在进行中。
我选择仅在Raspbian OS上为该项目使用C编程语言,这可能会影响我的某些决策和说明。我将只列出免费和开源软件,因为这就是我所使用的全部。
对于安装说明,我将假定您具有最新的系统。
以下是语音识别引擎的一些选项:
Pocketsphinx-可在嵌入式系统中使用的Sphinx版本(例如,基于ARM处理器)。
优点:正在积极开发中,并结合了定点算术和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上正常工作。
安装说明:
$ 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
的示例。
Julius-高性能,两遍大词汇量连续语音识别( LVCSR)解码器软件,适用于与语音相关的研究人员和开发人员。
优点:它可以在Raspberry Pi本身上执行几乎实时的语音识别。采用标准语音模型格式来处理其他免费建模工具包。
缺点:开发不完善,最近一次更新是一年多以前。对于我的使用来说,它的识别也太不准确且太慢。安装时间长
安装说明:
我们需要安装一些软件包才能使系统正常运行:
$ 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
来告诉它要使用哪个设备作为麦克风:
$ export ALSADEV="plughw:1,0"
下载免费的声学模型供Julius使用。下载后,cd
进入目录并运行:
$ julius -input mic -C julius.jconf
之后,您应该可以开始语音输入了。
开发自己的库 -对于我的特定项目,我选择构建自己的语音识别库,该库通过ALSA通过PortAudio记录来自USB麦克风的音频,通过libsndfile将其存储在FLAC文件中,然后发送给Google供他们处理它。然后,他们向我发送了一个打包得很好的JSON文件,然后我对其进行处理以获取对Raspberry Pi所说的内容。
优点:我控制一切(我喜欢)。我学到了很多(我喜欢)。
缺点:这是很多工作。另外,有些人可能会争辩说我实际上没有使用此语音识别库在Raspberry Pi上进行任何处理。 我知道。Google可以比现在更准确地处理我的数据。我正在构建一个准确的离线语音识别选项。
以下是语音合成引擎的一些选项:
t-完全用C编写的免费,优质语音合成引擎(由您自己开发)。
优点:极易携带(除了要构建CMake外没有依赖项),极小(我能找到的最小的东西),易于构建。
缺点:语音输出本身有时可能不准确。缺少对多种语言的支持,因为我现在是唯一的开发者,几乎没有空闲时间,但这是该项目的未来目标之一。另外,到目前为止,编译时仅输出一个库,没有可用/可测试的可执行文件。
eSpeak-用于Linux,Windows和其他平台的紧凑型开源软件语音合成器。
Festival-通用的多语言语音合成系统。
优点:它旨在支持多种口语。它可以使用Festvox项目,该项目旨在使新的合成声音的构建更加系统化并得到更好的记录,从而使任何人都可以构建新的声音。
缺点:它是用C ++编写的(特别是对我来说是一个缺点)。它还具有更大的代码库,因此对我来说很难理解和移植代码。
安装说明:
安装Festival软件:
$ sudo apt-get install festival festival-freebsoft-utils
要运行Festival,请通过管道将您想要阅读的文本或文件发送给它:
$ echo "Hello world" | festival --tts
弗莱特 -一个小运行时的语音合成,从节和Festvox项目导出引擎。
优点:卡内基梅隆大学不断发展。与其他引擎相比非常小的引擎。它还具有较小的代码库,因此更易于阅读。它几乎没有依赖关系(对我来说是一个强大的专业人士,也是我决定在我的项目中使用此引擎的另一个原因)。
缺点:语音输出本身并不总是准确的。语音具有非常金属化的非人类声音(比其他引擎还多)。它不支持很多语言。
安装说明:
安装Flite软件:
$ sudo apt-get install flite
要运行Flite:
$ flite -t "text that you want flite to say"
回答您的特定问题:
Pi执行语音处理的局限性是什么?
程序员没有限制。 :P
更严重的是,Raspberry Pi具有大量的资源来处理语音处理。只要执行语音处理的人员知道他们在做什么,Raspberry Pi就应该能够很好地处理它。
我要使用此自动考勤机,我应该如何进行?
这些选项都不是准确地告诉具体的人之间的区别还没有。这是我在项目中正在做的事情(可能会持续一段时间)。如果您正在寻找自动出勤的更好选择,我将研究人脸识别。Raspberry Pi在面部识别方面还有更多限制,因此请记住这一点。
我带上了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也起作用)。希望这可以帮助。
是。使用PocketSphinx进行语音识别,使用Festvox进行文本语音转换(TTS)并使用一些带有音频输入的USB音频(或支持音频的旧网络摄像头也带有音频输入)。
Google搜索这些软件包,“ Raspberry Pi”提供了许多示例和教程来进行设置。
正如Lenik指出的那样,您将需要某种方式来记录音频,或者可能将音频文件发送到Raspberry Pi,以便它们以某种方式进行解码。
首先,您应该为分类过程选择一组单词。之后,您应该从用户/主题收集数据。这将是非平稳信号。您必须减少数据以减少计算成本/提高特征提取方法的成功率,因此您应该为应用程序寻找合适的特征提取方法。通过这些方法(平均绝对值,RMS,波形长度,过零,积分绝对值,AR系数,中值频率,平均频率等),您可以获得特征向量。然后,您应该使用knn,神经网络等分类方法对数据进行分类。最后,您必须检查其准确性。总结一下:
我已经在互联网上看到了带有RPi的视频处理项目,因此它可以进行这种分类。
您可以使用NI 6009 USB DAQ(支持RPi)来收集任何模拟数据,但是它们有点贵。
这可能对您识别说话者很有用: