主要的流程是这样子的:改造台灯,用双向可控硅做个电子开头来代替机械开关;在树莓派安装gpio的驱动,以控制io口输出高电平或者低电平;在树莓派安装voice command进行语音识别;把voice command改造成支持中文语音识别。
首先是改造台灯,我直接把以前的存货BTA20和MOC3081搭个电子开关,电路图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/f8ef1d40cf29e1069aa105dcb68e17be.png)
用一块小小的万用板把这个电路焊好发现刚好能塞进台灯里面,不影响台灯的外观,然后把两根控制线引出来接到树莓派的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_12
- int 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.git
- cd 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}//'`
- fi
- tmpstr=`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
最后就是启动voicecommand了,运行以下命令:
- <span style="font-size:14px;">voicecommand -f /root/.commands.conf -r "有什么可以为你服务,先生?" -c -b0 -i -t 9.5</span>
至于配置文件的格式表示什么意思,各位官人还是自己去看voicecommand的man文档吧。。。