树莓派 百度语音 智能家居小助手

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树莓派 百度语音 智能家居小助手相关的知识,希望对你有一定的参考价值。


大体思路(程序写的有点乱,只是大体框架,还有好多坑留着慢慢填)

树莓派3通过USB声卡录音 ==>> 录音传给百度语音识别 ==>> 返回txt文本 ==>>

IF TXT=操作智能家居的语句 THEN 执行相应动作 

ELSE 将txt文本提交tuling123 ==>> 返回txt ==>> 传给百度语音文字转语音==>> 树莓派播放


import uuid
import base64
import json
import urllib
from urllib import request
import urllib.parse
import sys
import wave
from pyaudio import PyAudio,paInt16
from pypinyin import pinyin, lazy_pinyin
import pypinyin
import os
 
channels = 1
framerate = 8000
NUM_SAMPLES = 2000
sampwidth = 2
TIME=2
apiKey = "SSWhZvvboPy5mbSy8ahOSFjP"  
secretKey = "c9b0195c91d435ca908ffc07dedbc4bd"  
asr_server = ‘http://vop.baidu.com/server_api‘
auth_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=SSWhZvvboPy5mbSy8ahOSFjP&client_secret=c9b0195c91d435ca908ffc07dedbc4bd"

#将数据保存成wav格式文件
def save_wave_file(filename,data):
	wf = wave.open(filename,‘wb‘)
	wf.setnchannels(channels)
	wf.setsampwidth(sampwidth)
	wf.setframerate(framerate)
	wf.writeframes(b"".join(data))
	wf.close()

def get_token():
    res = urllib.request.urlopen(auth_url)  
    json_data = res.read().decode(‘utf-8‘) 
    a = json.loads(json_data)
    token = a[‘access_token‘]     
    return token
    
def baidu_record():
    os.system(‘arecord -D "plughw:1,0" -f S16_LE -d 3 -r 8000 ~/MyProject/temp.wav‘)
    print(‘done..‘)	

#将wav编码成base64格式,上传给百度语音识别,并取得识别的result,

    token = get_token()  
    mac_address=uuid.UUID(int=uuid.getnode()).hex[-12:]

#把wav文件以base64编码,再将需要上传的数据按照百度要求以json格式提交
    speech_file = ‘temp.wav‘
    with open(speech_file, ‘rb‘) as f:
            speech_data = f.read()
    speech_base64=base64.b64encode(speech_data).decode(‘utf-8‘)
    speech_length=len(speech_data)
    data_dict = {‘format‘:‘wav‘, ‘rate‘:8000, ‘channel‘:1, ‘cuid‘:mac_address, ‘token‘:token, ‘lan‘:‘zh‘, ‘speech‘:speech_base64, ‘len‘:speech_length}
    json_data = json.dumps(data_dict).encode(‘utf-8‘)
    json_length = len(json_data)
    request = urllib.request.Request(url=asr_server)
    request.add_header("Content-Type", "application/json")
    request.add_header("Content-Length", json_length)
    fs = urllib.request.urlopen(url=request, data=json_data)
#将百度返回的数据保存,并提取出result
    result_str = fs.read().decode(‘utf-8‘)
    json_resp = json.loads(result_str)

    print(json_resp)
    if json_resp[‘err_msg‘] == ‘success.‘:
        result=json_resp[‘result‘]
#        print(‘函数内 result‘+ result[0])
        return result[0]
    else:return ‘我不知道你在说什么‘

opt_list_open=[‘dakai‘,‘dakan‘,‘daka‘,‘daikai‘,‘daikan‘,‘daika‘,‘danka‘,‘dankai‘]
opt_list_close=[‘guanbi‘,‘guanshang‘,‘guanshan‘,‘guangbi‘]
loc_list_keting=[‘keting‘,‘kanting‘,‘kaiting‘]
obj_list_deng=[‘dadeng‘,‘daden‘,‘dadong‘]
obj_list_chuanglian  =[‘chuanglian‘,‘chuanlian‘,‘chuanglia‘]
    
while True:
    tmp = baidu_record()
    print(‘1========‘+tmp)
    if (tmp == ‘我不知道你在说什么‘):
        print(‘break comnt...‘)
        continue
    print(‘start....‘)
### 唤醒功能开始 ####
    if (‘噼里啪啦‘ in tmp):
        print(‘2....starting....‘)
        url = "http://tsn.baidu.com/text2audio?tex="+ ‘主人,请吩咐‘+"&lan=zh&per=0&pit=1&spd=7&cuid=8466761&ctp=1&tok="+get_token()
        os.system(‘mplayer "%s"‘%(url))
        cmd = baidu_record()
        a=lazy_pinyin(cmd)
        data = a[0:-1]
        print(data)
        if data== [‘da‘, ‘kai‘, ‘ke‘, ‘ting‘, ‘chuang‘, ‘lian‘]:
            print(‘打开客厅窗帘‘)
            url = "http://tsn.baidu.com/text2audio?tex="+‘客厅窗帘已打开‘+"&lan=zh&per=0&pit=1&spd=7&cuid=8466761&ctp=1&tok="+get_token()
            os.system(‘mplayer "%s"‘%(url))
            continue
        if data== [‘da‘, ‘kai‘, ‘chu‘, ‘fang‘, ‘deng‘]:
                print(‘打开厨房灯‘)
                url = "http://tsn.baidu.com/text2audio?tex="+‘厨房灯已打开‘+"&lan=zh&per=0&pit=1&spd=7&cuid=8466761&ctp=1&tok="+get_token()
                os.system(‘mplayer "%s"‘%(url))
                continue
### 开始图灵对话 ####
        key = ‘60db5011ff204107bf777a6ad1dead11‘ #key&api
        api = ‘http://www.tuling123.com/openapi/api?key=‘ + key + ‘&info=‘
        tuling_request = api   + urllib.parse.quote(cmd)
        response = urllib.request.urlopen(tuling_request).read().decode(‘utf-8‘)
        dic_json = json.loads(response)

#百度text转语音
        url = "http://tsn.baidu.com/text2audio?tex="+dic_json[‘text‘]+"&lan=zh&per=0&pit=1&spd=7&cuid=8466761&ctp=1&tok="+get_token()
        os.system(‘mplayer "%s"‘%(url))


#将中文转成拼音
    	
#a=lazy_pinyin(cmd)
#data = a[0:-1]
#print(data)

#拼音模糊匹配

# if opt == ‘dakai‘ or ‘duokan‘ or ‘dakan‘ or ‘daka‘: opt=‘dakai‘
# if opt == ‘guanbi‘ or ‘guabi‘ or ‘guanbin‘ or ‘daka‘: opt=‘guanbi‘

# if loc == ‘keting‘ or ‘ketin‘ or ‘kaitin‘ or ‘kantin‘: loc=‘keting‘
# if loc == ‘woshi‘ or ‘washi‘ or ‘wosi‘ or ‘wasi‘: loc=‘woshi‘

# if obj == ‘deng‘ or ‘dong‘ or ‘den‘ or ‘duo‘:obj=‘deng‘

############################
# opt_list_open=[‘dakai‘,‘dakan‘,‘daka‘,‘daikai‘,‘daikan‘,‘daika‘,‘danka‘,‘dankai‘]
# opt_list_close=[‘guanbi‘,‘guanshang‘,‘guanshan‘,‘guangbi‘]
# loc_list_keting=[‘keting‘,‘kanting‘,‘kaiting‘]
# obj_list_deng=[‘deng‘,‘den‘,‘dong‘]

# if opt in opt_list_open: opt=‘dakai‘
# if opt in opt_list_close: opt=‘guanbi‘
# if loc in loc_list_keting: loc = ‘keting‘
# if obj in obj_list_deng: obj = ‘deng‘


# print(‘=== ====‘,opt+loc+obj)
#####


#判断位置,并用http方式提交给各个节点的nodemcu无线模块数据,最后由nodemcu操作继电器或者红外遥控
# if loc==‘keting‘:
    # url = "http://192.168.1.106:8080/?"+opt+loc+obj
    # urllib.request.urlopen(url)

# if loc==‘woshi‘:
    # url = "http://192.168.1.106:8080/?"+opt+loc+obj
    # urllib.request.urlopen(url)




本文出自 “七月” 博客,请务必保留此出处http://374721.blog.51cto.com/364721/1876878

以上是关于树莓派 百度语音 智能家居小助手的主要内容,如果未能解决你的问题,请参考以下文章

树莓派使用snowboy以及百度语音api实现语音识别助手

用树莓派3B+实现智能语音识别

Windows 10 IoT Serials 4 - 如何在树莓派上使用Cortana语音助手

树莓派怎么调用科大讯飞的语音库实现语音识别

树莓派学习——语音识别和语音朗读

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