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

原创 2014年04月21日 16:54:33

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

    主要的流程是这样子的:改造台灯,用双向可控硅做个电子开头来代替机械开关;在树莓派安装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_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
我的配置可以同时支持中文和英文命令,当命令中含有关键字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文档吧。。。






相关文章推荐

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

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

树莓派系列二(语音识别)

树莓派的基本概念和安装系统在系列文章一中介绍了.这篇准备介绍一下语音识别. 一直想研究一下语音识别,用来做家庭物联网的控制入口,未来也许就是这样,讯飞的叮咚音响可以连接京东的物联平台,苹果的homek...
  • zyaiwmy
  • zyaiwmy
  • 2017年04月11日 09:23
  • 4662

教你如何在树莓派上搭建语音识别服务

最近项目原因需要我完成一个在树莓派上的离线语音识别,忙活了近一周,起初用了开源的PocketSphinx,但是不得不说,识别率低的惊人,甚至可以说有些字词根本没法识别,除非你自己制作声学模型,不然这玩...

使用科大讯飞最新版SDK在树莓派上搭建语音识别服务

本人的SDK是2017年1月30号左右下载的,可以在http://www.xfyun.cn/科大讯飞官网注册,选择相应的Linux SDK下载。 也可以使用我下载好的 https://pan.bai...
  • lhh31
  • lhh31
  • 2017年02月01日 19:33
  • 4455

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

树莓派3 ROS语音包开发之音频采集

树莓派3 ROS语音包开发之音频采集 谈到语音交互,简单步骤你我都能想到,无非就是以下几个步骤: 1、语音采集  2、语音识别  3、语义理解  4、语音合成 之前移植了ROS...
  • AMDS123
  • AMDS123
  • 2017年05月01日 00:23
  • 5987

Hammer.js 实现移动端元素的拖拽库

Hammer.js是一个可以实现移动端元素拖拽的库。其功能还是比较全的,主要针对触屏的6大事件进行监听:【引用内容转自李林峰的园子】 1、 Pan事件:在指定的dom区域内,一个手指放下并...

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

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

Linux+树莓派玩转智能家居第2版中文

  • 2017年11月15日 16:32
  • 79.35MB
  • 下载

树莓派flask机器人智能家居系统

  • 2017年07月20日 11:58
  • 4.26MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:树莓派实现智能家居——支持中文的语音识别台灯
举报原因:
原因补充:

(最多只允许输入30个字)