树莓派-语音聊天机器人+语音控制引脚电平高低

Posted Eoman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树莓派-语音聊天机器人+语音控制引脚电平高低相关的知识,希望对你有一定的参考价值。

   

  最近和几位本学院的研究生师兄师姐参加研究生电子设计大赛,自己也来折腾下之前没有搞完的语音控制小车。恰巧自己负责的是语音控制这部分,折腾了几天也差不多搞定啦…把自己的折腾套路总结一下,给一起折腾的小伙伴点经验之谈…

      一、配置树莓派

     我们这次使用的最新的树莓派3,镜像直接是官网下载的Raspbian。这也是让我感觉最有树莓派感觉的一个系统。主要是sudo raspi-config的配置。

1和2最好都是设置一下,然后3看自己爱好吧;4的里面我都是重新设置的,包括时区、语言和字体。字体最好下载(apt-get install ttf-wqy-zenhei)。然后第八的那些串口、引脚的功能最好都打开

配置WiFi:树莓派3是自带WiFi的,所以启动正常的话是可以直接连接的;如果没有,就iwlist scan 扫描一下。

更新源:apt-get update,apt-get upgrade。

  二、语音聊天和语音控制引脚。

引脚的控制方法很多的,python GPIOwiringPiBCM2835 C Library

在这里我使用的是wiringPi(C语言);

安装wiringPi:

 

1 sudo apt-get install git-core
2 git clone git://git.drogon.net/wiringPi
3 cd wiringPi
4 ./build

 

编辑脚本控制引脚电平高低:

首先创建个目录:

1 cd ~
2 mkdir scripts
3 cd scripts

然后编辑脚本light内容:

 1 #!/bin/bash
 2 if [ $# > 1 ]
 3 then
 4 /usr/local/bin/gpio mode 4 out
 5     if [[ "$1" = "on" ]]
 6     then
 7 /usr/local/bin/gpio write 4 on
 8     fi
 9  
10     if [[ "$1" = "off" ]]
11     then
12 /usr/local/bin/gpio write 4 off
13     fi
14 fi

这里的4对应的是树莓派的引脚16(GEN 4),相关文档大家可以自行查阅。

 

赋给脚本权限:

1 chmod u+x light

 

然后就可以检验是否可以通过命令行控制引脚啦…

1 ./light on
2 ./light off

下面就是通过语音来控制。我几乎尝试了可以用的所有的语音识别SDK,科大讯飞、百度语音、Google…事实证明Google是最棒的,但是对于我们墙内玩家是真的头疼…

我最后采用的还是百度的API,因为个人喜欢python,恰好碰到一个百度的python开源程序。

直接上代码:

  1  -*- coding: utf-8 -*-
  2 
  3 import numpy as np
  4 from datetime import datetime
  5 import wave
  6 import time
  7 import urllib, urllib2, pycurl
  8 import base64
  9 import json
 10 import os
 11 import sys
 12 reload(sys)
 13 sys.setdefaultencoding( "utf-8" )
 14 
 15 save_count = 0
 16 save_buffer = []
 17 t = 0
 18 sum = 0
 19 time_flag = 0
 20 flag_num = 0
 21 filename = \'asr.wav\'
 22 duihua = \'1\'
 23 
 24 def gethtml(url):
 25     page = urllib.urlopen(url)
 26     html = page.read()
 27     return html
 28 
 29 def get_token():
 30     apiKey = "Ll0c53MSac6GBOtpg22ZSGAU"
 31     secretKey = "44c8af396038a24e34936227d4a19dc2"
 32     auth_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + apiKey + "&client_secret=" + secretKey;
 33     res = urllib2.urlopen(auth_url)
 34     json_data = res.read()
 35     return json.loads(json_data)[\'access_token\']
 36 
 37 def dump_res(buf):
 38     global duihua
 39     print "字符串类型"
 40     print (buf)
 41     a = eval(buf)
 42     print type(a)
 43     if a[\'err_msg\']==\'success.\':
 44         #print a[\'result\'][0]#终于搞定了,在这里可以输出,返回的语句
 45         duihua = a[\'result\'][0]
 46         print duihua
 47 
 48 def use_cloud(token):
 49     fp = wave.open(filename, \'rb\')
 50     nf = fp.getnframes()
 51     f_len = nf * 2
 52     audio_data = fp.readframes(nf)
 53     cuid = "7519663" #产品id
 54     srv_url = \'http://vop.baidu.com/server_api\' + \'?cuid=\' + cuid + \'&token=\' + token
 55     http_header = [
 56         \'Content-Type: audio/pcm; rate=8000\',
 57         \'Content-Length: %d\' % f_len
 58     ]
 59 
 60     c = pycurl.Curl()
 61     c.setopt(pycurl.URL, str(srv_url)) #curl doesn\'t support unicode
 62     #c.setopt(c.RETURNTRANSFER, 1)
 63     c.setopt(c.HTTPHEADER, http_header)   #must be list, not dict
 64     c.setopt(c.POST, 1)
 65     c.setopt(c.CONNECTTIMEOUT, 30)
 66     c.setopt(c.TIMEOUT, 30)
 67     c.setopt(c.WRITEFUNCTION, dump_res)
 68     c.setopt(c.POSTFIELDS, audio_data)
 69     c.setopt(c.POSTFIELDSIZE, f_len)
 70     c.perform() #pycurl.perform() has no return val
 71 
 72 # 将data中的数据保存到名为filename的WAV文件中
 73 def save_wave_file(filename, data):
 74     wf = wave.open(filename, \'wb\')
 75     wf.setnchannels(1)
 76     wf.setsampwidth(2)
 77     wf.setframerate(SAMPLING_RATE)
 78     wf.writeframes("".join(data))
 79     wf.close()
 80 
 81 token = get_token()
 82 key = \'05ba411481c8cfa61b91124ef7389767\'
 83 api = \'http://www.tuling123.com/openapi/api?key=\' + key + \'&info=\'
 84 
 85 while(True):
 86     os.system(\'arecord -D "plughw:1,0" -f S16_LE -d 5 -r 8000 /home/pi/Desktop/2016-6-25/asr.wav\')
 87     use_cloud(token)
 88     print duihua
 89     info = duihua
 90     duihua = ""
 91     request = api   + info
 92     response = getHtml(request)
 93     dic_json = json.loads(response)
 94 
 95     a = dic_json[\'text\']
 96     print type(a)
 97     unicodestring = a
 98 
 99     # 将Unicode转化为普通Python字符串:"encode"
100     utf8string = unicodestring.encode("utf-8")
101 
102     print type(utf8string)
103     print str(a)
104     url = "http://tsn.baidu.com/text2audio?tex="+dic_json[\'text\']+"&lan=zh&per=0&pit=1&spd=7&cuid=8297904&ctp=1&tok=24.9ae6d50d24d1c222c4019be4c70613e7.2592000.1469358913.282335-8297904"
105     os.system(\'mplayer "%s"\'%(url))

这是网上大神自己给树莓派自己写的Python脚本,然后我自己修改的如下可以实现语音控制引脚开灯和关灯。

 1 # -*- coding: utf-8 -*-
 2 
 3 import numpy as np
 4 from datetime import datetime
 5 import wave
 6 import time
 7 import urllib, urllib2, pycurl
 8 import base64
 9 import json
10 import os
11 import sys
12 reload(sys)
13 sys.setdefaultencoding( "utf-8" )
14 
15 save_count = 0
16 save_buffer = []
17 t = 0
18 sum = 0
19 time_flag = 0
20 flag_num = 0
21 filename = \'asr.wav\'
22 commun = \'1\'
23 answer = \'1\'
24 def getHtml(url):
25     page = urllib.urlopen(url)
26     html = page.read()
27     return html
28 
29 def get_token():
30     apiKey = "Ll0c53MSac6GBOtpg22ZSGAU"
31     secretKey = "44c8af396038a24e34936227d4a19dc2"
32     auth_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + apiKey + "&client_secret=" + secretKey;
33     res = urllib2.urlopen(auth_url)
34     json_data = res.read()
35     return json.loads(json_data)[\'access_token\']
36 
37 def dump_res(buf):
38     global duihua
39     print "字符串类型"
40     print (buf)
41     a = eval(buf)
42     print type(a)
43     if a[\'err_msg\']==\'success.\':
44         commun = a[\'result\'][0]
45         print duihua
46 
47 def use_cloud(token):
48     fp = wave.open(filename, \'rb\')
49     nf = fp.getnframes()
50     f_len = nf * 2
51     audio_data = fp.readframes(nf)
52     cuid = "7519663" #产品id
53     srv_url = \'http://vop.baidu.com/server_api\' + \'?cuid=\' + cuid + \'&token=\' + token
54     http_header = [
55         \'Content-Type: audio/pcm; rate=8000\',
56         \'Content-Length: %d\' % f_len
57     ]
58 
59     c = pycurl.Curl()
60     c.setopt(pycurl.URL, str(srv_url)) #curl doesn\'t support unicode
61     #c.setopt(c.RETURNTRANSFER, 1)
62     c.setopt(c.HTTPHEADER, http_header)   #must be list, not dict
63     c.setopt(c.POST, 1)
64     c.setopt(c.CONNECTTIMEOUT, 30)
65     c.setopt(c.TIMEOUT, 30)
66     c.setopt(c.WRITEFUNCTION, dump_res)
67     c.setopt(c.POSTFIELDS, audio_data)
68     c.setopt(c.POSTFIELDSIZE, f_len)
69     c.perform() #pycurl.perform() has no return val
70 
71 # 将data中的数据保存到名为filename的WAV文件中
72 def save_wave_file(filename, data):
73     wf = wave.open(filename, \'wb\')
74     wf.setnchannels(1)
75     wf.setsampwidth(2)
76     wf.setframerate(SAMPLING_RATE)
77     wf.writeframes("".join(data))
78     wf.close()
79 
83 
84 while(True):
85     os.system(\'arecord -D "plughw:1,0" -f S16_LE -d3 -r 8000 /home/pi/Desktop/2016-6-25/asr.wav\')
86     use_cloud(token)
87     print commun
88     site = commun89     if "" in site: #在返回的文本里寻找“开”
90        answer = \'好的,正在为您开灯,请稍后\'
91        url = "http://tsn.baidu.com/text2audio?tex="+answer+"&lan=zh&per=0&pit=1&spd=7&cuid=8297904&ctp=1&tok=24.9ae6d50d24d1c222c4019be4c70613e7.2592000.1469358913.282335-8297904"
92        os.system(\'mplayer "%s"\'%(url))
93        os.system(\'cd /home/pi/Desktop/scripts&&./light on\')
94     if "" in site:
95        answer = \'好的,正在为您关灯,请稍后\'
96        url = "http://tsn.baidu.com/text2audio?tex="+answer+"&lan=zh&per=0&pit=1&spd=7&cuid=8297904&ctp=1&tok=24.9ae6d50d24d1c222c4019be4c70613e7.2592000.1469358913.282335-8297904"
97        os.system(\'mplayer "%s"\'%(url))
98        os.system(\'cd /home/pi/Desktop/scripts&&./light off

下面给大家一个现场演示视频。

 http://v.youku.com/v_show/id_XMTYyMzIxMDc5Ng==.html

参考文章:

http://www.xiaopeiqing.com/posts/2337.html;(中大一位名为xieshundao博士师兄的贴,非常感谢师兄的帮助和人教诲…)

http://blog.csdn.net/haven200/article/details/50659499;

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

http://www.urlteam.org/2016/05/python%E8%AF%AD%E9%9F%B3%E6%99%BA%E8%83%BD%E5%AF%B9%E8%AF%9D%E8%81%8A%E5%A4%A9%E6%9C%BA%E5%99%A8%E4%BA%BA%EF%BC%8Clinux%E6%A0%91%E8%8E%93%E6%B4%BE%E5%8F%8C%E5%B9%B3%E5%8F%B0%E5%85%BC%E5%AE%B9/;

http://blog.csdn.net/happen23/article/details/45821697;

http://www.modified.systems/archives/tag/voicecommand;

 

23:26:422016-06-27

 

以上是关于树莓派-语音聊天机器人+语音控制引脚电平高低的主要内容,如果未能解决你的问题,请参考以下文章

为啥树莓派有源蜂鸣器高低电平都响

树莓派如何输出高低电平

字符串指令控制继电器组(树莓派)

树莓派 --- 语音控制不同颜色LED灯的亮灭

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

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