python实现简单对话机器人_如何优雅的用Python玩转语音聊天机器人

一名极客运维人员,走在脑洞大开的路上....

Python聊天机器人:可以感应人是否存在,识别语音,通过图灵API语音回答

-------------------------上图镇楼----------------------------

wKiom1c1r5rCTTQvAAcDqM-e2II445.jpg

【详细攻略】

所需硬件:

树莓派B+

人体红外线感应模块

申请API:

百度语音api

图灵api

语音聊天机器人实现原理:当有人来到跟前时--》触发聊天功能,开始以每2s检测录制语音--》通过百度语音api合成文字--》传递给图灵api返回回答信息--》通过百度语音合成播放

【人体感应识别部分Python代码renti.py】

#/usr/bin/python

#coding:utf-8

import RPi.GPIO as GPIO

import time

import os

import signal

import atexit

GPIO.setmode(GPIO.BCM)

GPIO_PIR = 14

GPIO.setup(GPIO_PIR,GPIO.IN) # Echo

jing = 0

dong = 0

sum = 0

sum1 = 0

oldren = 0

sleep = 0

def ganying():

i = 0

ok = 0

error = 0

while i < 10:

if GPIO.input(GPIO_PIR) == 1 :

ok = ok + 1

if GPIO.input(GPIO_PIR) == 0 :

error = error + 1

time.sleep(0.01)

i = i + 1

ren = ok/(error+1)

return ren

GPIO_PIR = 14

为 红外线检测模块与树莓派的针脚,脚本函数返回0表示无人,>0 为有人

【Python语音识别聊天部分robot.py】

#/usr/bin/python

# -*- coding:utf-8 -*-

import sys

reload(sys)

sys.setdefaultencoding( "utf-8" )

import urllib

import urllib2

import json

import uuid

import base64

import os

import time

from renti import *

#获取百度token

appid=7647466

apikey="百度API"

secretkey="百度API"

baidu_url="https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + apikey + "&client_secret=" + secretkey;

y_post=urllib2.urlopen(baidu_url)

y_read=y_post.read()

y_token=json.loads(y_read)['access_token']

#print y_read

#print y_token

#------------------function-------------

def luyin():

os.system('arecord -D plughw:1,0 -c 1 -d 2 1.wav -r 8000 -f S16_LE 2>/dev/null')

def fanyi():

#http://vop.baidu.com/server_api?lan=zh&cuid=***&token=***

#---------------语音识别部分

mac_address="haogeoyes"

with open("1.wav",'rb') as f:

s_file = f.read()

speech_base64=base64.b64encode(s_file).decode('utf-8')

speech_length=len(s_file)

data_dict = {'format':'wav', 'rate':8000, 'channel':1, 'cuid':mac_address, 'token':y_token, 'lan':'zh', 'speech':speech_base64, 'len':speech_length}

json_data = json.dumps(data_dict).encode('utf-8')

json_length = len(json_data)

asr_server = 'http://vop.baidu.com/server_api'

request = urllib2.Request(url=asr_server)

request.add_header("Content-Type", "application/json")

request.add_header("Content-Length", json_length)

fs = urllib2.urlopen(url=request, data=json_data)

result_str = fs.read().decode('utf-8')

json_resp = json.loads(result_str)

if json_resp.has_key('result'):

out_txt=json_resp['result'][0]

else:

out_txt="Null"

return out_txt

def tuling(b):

f=urllib.urlopen("http://www.tuling123.com/openapi/api?key="此处为图灵API"&info=%s" % b)

f=json.loads(f.read())['text']

return f

def hecheng(text,y_token):

#text="你好我是机器人牛牛很高兴能够认识你"

geturl="http://tsn.baidu.com/text2audio?tex="+text+"&lan=zh&per=1&pit=9&spd=6&cuid=CCyo6UGf16ggKZGwGpQYL9Gx&ctp=1&tok="+y_token

return os.system('omxplayer "%s" > /dev/null 2>&1 '%(geturl))

#return os.system('omxplayer "%s" > /dev/null 2>&1 '%(geturl))

def nowtime():

return time.strftime('%Y-%m-%d %H:%M:%S ')

#---------------main-----------------

num=0 #num用来判断是第一次说话,还是在对话过程中

first=1 #判断是不是第一说话 当1000次没有人动认为是第一次

while True:

if ganying()!=0:

run=open('run.log','a')

if first==0:

hecheng("你好,我是牛牛机器人,你可以和我聊天,不过说话的时候你必须靠近话筒近一点,",y_token)

hecheng("说点什么吧,2秒钟内说完哦.",y_token)

first=1 #为1一段时间就不执行

num=0 #从新计数

#print ganying()

run.write(nowtime()+"说点神马吧..........."+'\n')

print nowtime()+"说点神马吧.........."

luyin() #开始录音

out=fanyi().encode("utf-8") #翻译文字

run.write(nowtime()+"我说:"+out+'\n')

print nowtime()+"我说:"+out

if out == "Null":

text="没有听清楚你说什么"

os.system('omxplayer "shenme.wav" > /dev/null 2>&1 ')

else:

text=tuling(out)

hecheng(text,y_token)

print nowtime()+"牛牛:"+text

run.write(nowtime()+"牛牛:"+text+'\n')

run.close()

else:

#print ganying() #调试查看是否为0有人没人

#print num

num=num+1 #num长时间增大说明没有人在旁边

if num > 1000:

first=0 #0表示第一次说话

万事俱备 运行nohup python robot.py 哈哈就可以脱离屏幕开始愉快的语音聊天啦

下面看看聊天的日志记录吧

wKiom1c1tOHiHxHOAADNVqmFycY579.png

wKioL1c1tj3BNn_kAACFmSTYPS8234.png

后续更新。。。。。。Python如何用语音优雅的控制小车

haogeoyes

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值