基于python实现百度语音识别和图灵对话


Posted in Python onNovember 02, 2020

图例如下

基于python实现百度语音识别和图灵对话

https://github.com/Dongvdong/python_Smartvoice

  • 上电后,只要周围声音超过 2000,开始录音5S
  • 录音上传百度识别,并返回结果文字输出
  • 继续等待,周围声音是否超过2000,没有就等待。
  • 点用电脑API语音交互

代码如下

# -*- coding: utf-8 -*-
# 树莓派
from pyaudio import PyAudio, paInt16
import numpy as np
from datetime import datetime
import wave
import time
import requests#导入requests库
import urllib, urllib.request, pycurl
import base64
import json
import os
import sys
from imp import reload
 
# 调用电脑API生成语音交互
import speech
import win32api
import os
import sys
import time
import win32con
 
 
reload(sys)
 
#sys.setdefaultencoding( "utf-8" )
#一些全局变量
save_count = 0
save_buffer = []
t = 0
sum = 0
time_flag = 0
flag_num = 0
filename = ''
duihua = '1'
def getHtml(url):
  html= requests.get(url)
  # html.encoding = 'utf-8'#防止中文乱码
  
  return html.text
def get_token():
  apiKey = "AxXDYEN27Ks9XHocsGmCEdPm"
  secretKey = "61cd52759f4d704d91c155a22ff7183d"
  auth_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + apiKey + "&client_secret=" + secretKey;
  res = requests.get(auth_url)
  #res.encoding = 'utf-8'#防止中文乱码
  #print (res.text)
  return json.loads(res.text)['access_token']
def dump_res(buf):#输出百度语音识别的结果
  global duihua
  #print ("字符串类型")
  #print (buf)
  a = eval(buf)
  #print (type(a))
  if a['err_msg']=='success.':
    #print (a['result'][0])#终于搞定了,在这里可以输出,返回的语句
    duihua = a['result'][0]
    print ("我:"+duihua)
def use_cloud(token):#进行合成
  fp = wave.open(filename, 'rb')
  nf = fp.getnframes()
  f_len = nf * 2
  audio_data = fp.readframes(nf)
  cuid = "9120612" #产品id
  srv_url = 'http://vop.baidu.com/server_api' + '?cuid=' + cuid + '&token=' + token
  http_header = [
    'Content-Type: audio/pcm; rate=8000',
    'Content-Length: %d' % f_len
  ]
  c = pycurl.Curl()
  c.setopt(pycurl.URL, str(srv_url)) #curl doesn't support unicode
  #c.setopt(c.RETURNTRANSFER, 1)
  c.setopt(c.HTTPHEADER, http_header)  #must be list, not dict
  c.setopt(c.POST, 1)
  c.setopt(c.CONNECTTIMEOUT, 30)
  c.setopt(c.TIMEOUT, 30)
  c.setopt(c.WRITEFUNCTION, dump_res)
  c.setopt(c.POSTFIELDS, audio_data)
  c.setopt(c.POSTFIELDSIZE, f_len)
  c.perform() #pycurl.perform() has no return val
# 将data中的数据保存到名为filename的WAV文件中
def save_wave_file(filename, data):
  wf = wave.open(filename, 'wb')
  wf.setnchannels(1)
  wf.setsampwidth(2)
  wf.setframerate(SAMPLING_RATE)
  wf.writeframes(b"".join(data))
  wf.close()
NUM_SAMPLES = 2000    # pyAudio内部缓存的块的大小
SAMPLING_RATE = 8000  # 取样频率
LEVEL = 1500      # 声音保存的阈值
COUNT_NUM = 20     # NUM_SAMPLES个取样之内出现COUNT_NUM个大于LEVEL的取样则记录声音
SAVE_LENGTH = 8     # 声音记录的最小长度:SAVE_LENGTH * NUM_SAMPLES 个取样
exception_on_overflow=False
# 开启声音输入pyaudio对象
pa = PyAudio()
stream = pa.open(format=paInt16, channels=1, rate=SAMPLING_RATE, input=True,
        frames_per_buffer=NUM_SAMPLES)
token = get_token()#获取token
key = '35ff2856b55e4a7f9eeb86e3437e23fe'
api = 'http://www.tuling123.com/openapi/api?key=' + key + '&info='
while(True):
  # 读入NUM_SAMPLES个取样
  string_audio_data = stream.read(NUM_SAMPLES,False);
  # 将读入的数据转换为数组
  audio_data = np.fromstring(string_audio_data, dtype=np.short)
  # 计算大于LEVEL的取样的个数
  large_sample_count = np.sum( audio_data > LEVEL )
  temp = np.max(audio_data)
  if temp > 2000 and t == 0:
    t = 1#开启录音
    print ("---------主人我在听你说!(5S)----------")
    begin = time.time()
    # print (temp)
  if t:
    #print (np.max(audio_data))
    if np.max(audio_data)<1000:
      sum += 1
      # print (sum)
    end = time.time()
    if end-begin>5:
      time_flag = 1
      # print ("五秒到了,准备结束")
    # 如果个数大于COUNT_NUM,则至少保存SAVE_LENGTH个块
    if large_sample_count > COUNT_NUM:
      save_count = SAVE_LENGTH
    else:
      save_count -= 1
    if save_count < 0:
      save_count = 0
    if save_count > 0:
      # 将要保存的数据存放到save_buffer中
      save_buffer.append(string_audio_data )
    else:
      # 将save_buffer中的数据写入WAV文件,WAV文件的文件名是保存的时刻
      #if time_flag:
      if len(save_buffer) > 0 or time_flag:
        #filename = datetime.now().strftime("%Y-%m-%d_%H_%M_%S") + ".wav"#原本是用时间做名字
        filename = str(flag_num)+".wav"
        flag_num += 1
        save_wave_file(filename, save_buffer)
        save_buffer = []
        t = 0
        sum =0
        time_flag = 0
       # print (filename, "保存成功正在进行语音识别")
        use_cloud(token)
       #  print (duihua)
        info = duihua
        duihua = ""
        
        request = api + str(info)
        response = getHtml(request)
       # print ( "-----1-----")
        dic_json = json.loads(response)
       
        a = dic_json['text']
       
        unicodestring = a
        # 将Unicode转化为普通Python字符串:"encode"
        utf8string = unicodestring.encode("utf-8")
       
        print ("科塔娜:"+str(a))
         
        # 电脑说话
        speech.say(str(a))
         
        url = "http://tsn.baidu.com/text2audio?tex="+dic_json['text']+"&lan=zh&per=0&pit=1&spd=7&cuid=7519663&ctp=1&tok=25.41bf315625c68b3e947c49b90788532d.315360000.1798261651.282335-9120612"
        os.system('mpg123 "%s"'%(url))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现修改IE注册表功能示例
May 10 Python
Python使用ctypes调用C/C++的方法
Jan 29 Python
Python3.5实现的罗马数字转换成整数功能示例
Feb 25 Python
Django中使用session保持用户登陆连接的例子
Aug 06 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
python pillow模块使用方法详解
Aug 30 Python
python爬虫库scrapy简单使用实例详解
Feb 10 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
Mar 23 Python
Python使用plt.boxplot() 参数绘制箱线图
Jun 04 Python
python使用matplotlib:subplot绘制多个子图的示例
Sep 24 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
Nov 13 Python
Python实现灰色关联分析与结果可视化的详细代码
Mar 25 Python
用python进行视频剪辑
Nov 02 #Python
如何通过python实现IOU计算代码实例
Nov 02 #Python
Opencv常见图像格式Data Type及代码实例
Nov 02 #Python
Jupyter安装链接aconda实现过程图解
Nov 02 #Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
Nov 02 #Python
python定时截屏实现
Nov 02 #Python
PyQT5速成教程之Qt Designer介绍与入门
Nov 02 #Python
You might like
推荐文章系统(一)
2006/10/09 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
WordPress开发中的get_post_custom()函数使用解析
2016/01/04 PHP
php str_replace替换指定次数的方法详解
2017/05/05 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
jquery实现从数组移除指定的值
2015/06/24 Javascript
浅析JS原型继承与类的继承
2016/04/07 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
2016/11/03 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
2017/08/08 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
解决echarts数据二次渲染不成功的问题
2020/07/20 Javascript
Python入门篇之文件
2014/10/20 Python
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
Python保存MongoDB上的文件到本地的方法
2016/03/16 Python
python针对excel的操作技巧
2018/03/13 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
python绘制直线的方法
2018/06/30 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
解决pycharm 安装numpy失败的问题
2019/12/05 Python
泰国的头号网上婴儿用品店:Motherhood.co.th
2019/04/09 全球购物
编码实现字符串转整型的函数
2012/06/02 面试题
工商管理本科毕业生求职信范文
2013/10/05 职场文书
营销与策划专业毕业生求职信
2013/11/01 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
2014年前台个人工作总结
2014/11/14 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
如何开发一个渐进式Web应用程序PWA
2021/05/10 Javascript
使用nginx配置访问wgcloud的方法
2021/06/26 Servers