如何优雅的用Python玩转语音聊天机器人

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

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

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

【详细攻略】

所需硬件:

树莓派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 哈哈就可以脱离屏幕开始愉快的语音聊天啦

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

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

haogeoyes

时间: 2024-10-26 16:03:28

如何优雅的用Python玩转语音聊天机器人的相关文章

python 实现简单语音聊天机器人

1 # -*- coding:utf-8 -*- 2 import sys 3 import requests 4 import json 5 import mp3play 6 import time 7 8 def talk(info): 9 appkey = "e5ccc9c7c8834ec3b08940e290ff1559" 10 headers = { 11 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) Appl

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

最近和几位本学院的研究生师兄师姐参加研究生电子设计大赛,自己也来折腾下之前没有搞完的语音控制小车.恰巧自己负责的是语音控制这部分,折腾了几天也差不多搞定啦…把自己的折腾套路总结一下,给一起折腾的小伙伴点经验之谈… 一.配置树莓派 我们这次使用的最新的树莓派3,镜像直接是官网下载的Raspbian.这也是让我感觉最有树莓派感觉的一个系统.主要是sudo raspi-config的配置. 1和2最好都是设置一下,然后3看自己爱好吧:4的里面我都是重新设置的,包括时区.语言和字体.字体最好下载(apt

用python写一个微信聊天机器人

# -*- coding: utf-8 -*- """ package.module ~~~~~~~~~~~~~~ 一个微信机器人程序 微信客户端itchat: http://itchat.readthedocs.io/ 机器人聚合API: ## params - info 发给机器人的信息 - dtype json|xml - loc 地点 - userid 1-32位,可以用于上下文关联 http://op.juhe.cn/robot/index?info=%E5%8C%

python—多任务版udp聊天机器人

将多任务(多线程)引入到udp聊天机器人,可以实现同时发送消息和接收消息 1 import socket 2 import threading 3 4 5 def udp_send(udp_socket,ip,port): 6 while True: 7 try: 8 # 获取发送的信息 9 data = input('请输入要发送的信息:') 10 udp_socket.sendto(data.encode('gbk'), (ip,port)) 11 12 except Exception a

程序员带你十天快速入门Python,玩转电脑软件开发(二)

关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到熟悉的效果. 声明:本次教程主要适用于已经习得一门编程语言的程序员.想要学习第二门语言.有梦想,立志做全栈攻城狮的你 如果是小白,也可以学习本教程.不过可能有些困难.如有问题在文章下方进行讨论.或者添加QQ群538742639.群马上就满了,名额不多. 上节课主要讲解了以下内容: 为什么学习Pyth

程序员带你十天快速入门Python,玩转电脑软件开发(三)

声明:本次教程主要适用于已经习得一门编程语言的程序员.想要学习第二门语言.有梦想,立志做全栈攻城狮的你 . 如果是小白,也可以学习本教程.不过可能有些困难.如有问题在文章下方进行讨论.或者添加QQ群538742639.群马上就满了,名额不多. 这是高级程序员快速入门Python语言课程.助你快速学习Python语言.这是第三课. 程序员带你十天快速入门Python,玩转电脑软件开发(一) 程序员带你十天快速入门Python,玩转电脑软件开发(二) 因技术知识连贯性,还没有学习前两课的同学,建议点

程序员带你十天快速入门Python,玩转电脑软件开发(一)

关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到熟悉的效果. 声明:本次教程主要适用于已经习得一门编程语言的程序员.想要学习第二门语言的你.有梦想的你,立志做全栈攻城狮. 如果是小白,也可以学习本教程.不过可能有些困难.如有问题在文章下方进行讨论.或者添加QQ群538742639.群马上就满了,名额不多. 目录: 为什么学习Python? Pyt

使用Python玩转WMI

最近在网上搜索Python和WMI相关资料时,发现大部分文章都千篇一律,并且基本上只说了很基础的使用,并未深入说明如何使用WMI.本文打算更进一步,让我们使用Python玩转WMI. 1 什么是WMI 具体请看微软官网对WMI的介绍.这里简单说明下,WMI的全称是Windows Management Instrumentation,即Windows管理规范.它是Windows操作系统上管理数据和操作的基础设施.我们可以使用WMI脚本或者应用自动化管理任务等. 从Using WMI可以知道WMI支

[零基础学python]玩转字符串(1)

如果对自然语言分类,有很多中分法,比如英语.法语.汉语等,这种分法是最常见的.在语言学里面,也有对语言的分类方法,比如什么什么语系之类的.我这里提出一种分法,这种分法尚未得到广大人民群众和研究者的广泛认同,但是,我相信那句"真理是掌握在少数人的手里",至少在这里可以用来给自己壮壮胆. 我的分法:一种是语言中的两个元素(比如两个字)和在一起,出来一个新的元素(比如新的字):另外一种是两个元素和在一起,知识两个元素并列.比如"好"和"人",两个元素和