树莓派实现智能家居——支持中文的语音识别台灯

来源:互联网 发布:civilization 5 mac 编辑:程序博客网 时间:2024/04/29 21:53

    最近重新折腾我的树莓派,发现这货还能做语音识别,于是想做个什么东西出来,最后还是对宿舍那个一直让我有点不爽的台灯动手了。因为台灯夹在比较高的地方,每次都要站起来才能够得到开头,这让我有点不爽,要是可以语音控制它开关那多好,于是我就拿它开刀了。

    主要的流程是这样子的:改造台灯,用双向可控硅做个电子开头来代替机械开关;在树莓派安装gpio的驱动,以控制io口输出高电平或者低电平;在树莓派安装voice command进行语音识别;把voice command改造成支持中文语音识别。

    首先是改造台灯,我直接把以前的存货BTA20和MOC3081搭个电子开关,电路图如下:


    用一块小小的万用板把这个电路焊好发现刚好能塞进台灯里面,不影响台灯的外观,然后把两根控制线引出来接到树莓派的gnd和一个io口上(我接的是gpio1)。

    硬件弄好之后开始搞软件了。树莓派的gpio驱动网上好像有三个,一个支持python的和两个支持c语言的,各位官人可以根据自己的喜好自行安装,我装的是BCM2835 C Library,教程在这里:http://blog.csdn.net/xukai871105/article/details/12684617

    装好驱动之后我就把那个blink.c改装成开关灯的程序,代码如下:

#include <bcm2835.h>// Blinks on RPi Plug P1 pin 11 (which is GPIO pin 17)//#define PIN RPI_GPIO_P1_11#define PIN RPI_GPIO_P1_12int main(int argc, char **argv){    // If you call this, it will not actually access the GPIO    // Use for testing//    bcm2835_set_debug(1);    if(argc<2)        return 1;    if (!bcm2835_init())        return 1;    // Set the pin to be an output    bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);    if(!strcmp(argv[1],"on")){                                                                                    // Turn it on                                                                                             bcm2835_gpio_write(PIN, HIGH);                                                                        }else if(!strcmp(argv[1],"off")){                                                                                                                                                                                       // turn it off                                                                                            bcm2835_gpio_write(PIN, LOW);                                                                         }                                                                                                         bcm2835_close();                                                                                          return 0;                                                                                             }   

然后运行:gcc -o light light.c -l bcm2835 进行编译。

编译后了之后可以通过sudo ./light on和sudo ./light off来开灯或者关灯。

到此就可以主用树莓派来控制台灯的开灯和关灯了,下面开始弄语音识别部分。

我是按照外国人写的一个教程做的:

http://computers.tutsplus.com/articles/how-to-control-a-lamp-with-voice-commands-and-a-raspberry-pi--mac-60825

其实过程不复杂,如果树莓派已经安装了git的话,直接下面命令就可以了:

git clone git://github.com/StevenHickson/PiAUISuite.gitcd PiAUISuite/Install/./InstallAUISuite.sh

在安装过程中只需要对 dependencies 和voicecommand两个工具回复y其他n就可以了。

    安装好voicecommand之后,提示音和识别的命令都是英文的。由于这个软件是基于谷歌的语音识别api,而谷歌语音识别api是可以支持中文的,所以我觉得改成中文的难度不大。

     阅读完voicecommand的man文档,发现没有选择语言的选项。看来作者是没有打算支持其他语言。于是我从安装脚本开始找线索,看到安装脚本首先查看安装脚本/PiAUISuite/Install/InstallAUISuite.sh
发现下面三句话:

sudo cp ../VoiceCommand/google /usr/bin/                                  sudo cp ../VoiceCommand/tts /usr/bin/                                     sudo cp ../VoiceCommand/speech-recog.sh /usr/bin/    

于是打开那三个文件,发现都是脚本。其中tts是文本转语音,speech-recog.sh是语音转文本
于是打开那两个文本,把里面的lang变量的值改成zh-cn,发现还是无法识别中文,最后发现在voicecommand调用了这
些脚本的时候传入了lang参数,于是把tts里面的一句lang="$2"注释掉,就可以发中文提示音了。
同理,把speech-recog.sh里的一句lang="$var"注释掉就可以识别中文了。

对于tts,当语音命令不能被识别的时候,会有一句英文的提示,这句提示用中文的tts来发音太难听了
为了让tts根据文本是中文还是英文来选择合适的lang,我在tts里加入如下语句:

string=$@#lang="en"lang="zh-cn"if [ "$1" == "-l" ] ; then    #lang="$2"    string=`echo "$string" | sed -r 's/^.{6}//'`fitmpstr=`echo "$string" | sed -n '/^[a-zA-Z,.?! \s]*$/'p`if [ -n "$tmpstr" ] ; then    lang="en"fi

其中后面那个if跟tmpstr是我加进去的,是当输入文本全部都是英文字符时把lang改回en  

到目前为止对voice command的中文化改造工程已经完工了,下面是配置voicecommand

运行sudo voicecommand -s编辑配置文件,我的配置文件如下:

~on==tts I am turning on the light for you;/home/pi/gpio_pi/blink/light on~开==tts 正在为您开灯,请稍候!;/home/pi/gpio_pi/blink/light on~off==/home/pi/gpio_pi/blink/light off~关==tts 正在为您关灯,请稍候;/home/pi/gpio_pi/blink/light off
我的配置可以同时支持中文和英文命令,当命令中含有关键字on或者“开”的时候就开灯,并且在开灯之前还有语音回应,同理命令中有off或者“关”就关灯。

最后就是启动voicecommand了,运行以下命令:

voicecommand -f /root/.commands.conf -r "有什么可以为你服务,先生?" -c -b0 -i -t 9.5
    我没有跟教程那样子开启v参数和k参数,所以只要当声音的音量大到一个阈值它就会用语音回应你“有什么可以为你服务,先生?”,当然这句话可以在r参数里改,f参数指定配置文件,c参数表示开启连续模式,程序会不断检测mic的输入,b参数如果不设的话好像录音会有问题,i参数是忽略没有在配置文件里配置的命令,t参数是设置声音的门限值,这个值越大,就需要越大的声音才能触发系统开始听取命令,一般如果开启k和v参数的话都是设在1左右,但是我没有开启那两个参数,所以每当系统监听到有大一点的声音就会问“有什么可以。。。”,非常烦,所以我把门限提高了很多,这样子我要发命令之前可以打个响指,或者大叫一声(虽然这样子有点像神经病。。。),等系统讲完提示音后再用正常的音量下命令就可以了,实测非常不错,哈哈哈

    至于配置文件的格式表示什么意思,各位官人还是自己去看voicecommand的man文档吧。。。






3 0