基于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中使用正则表达式的方法
Aug 13 Python
使用Python编写一个最基础的代码解释器的要点解析
Jul 12 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
Python三种遍历文件目录的方法实例代码
Jan 19 Python
python实战之实现excel读取、统计、写入的示例讲解
May 02 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
Jun 14 Python
python程序中的线程操作 concurrent模块使用详解
Sep 23 Python
pymysql模块的操作实例
Dec 17 Python
Django 自定义404 500等错误页面的实现
Mar 08 Python
在django中form的label和verbose name的区别说明
May 20 Python
Python 利用flask搭建一个共享服务器的步骤
Dec 05 Python
Django如何创作一个简单的最小程序
May 12 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
PHP 导出Excel示例分享
2014/08/18 PHP
php通过ksort()函数给关联数组按照键排序的方法
2015/03/18 PHP
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
PHP实现简单日历类编写
2020/08/28 PHP
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
十个迅速提升JQuery性能让你的JQuery跑得更快
2012/12/10 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
2013/08/01 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
2016/05/12 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
2017/07/19 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
2019/09/11 Javascript
浅析vue-router实现原理及两种模式
2020/02/11 Javascript
Python面向对象编程基础解析(二)
2017/10/26 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
2018/04/11 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
2019/03/29 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
通过实例了解Python str()和repr()的区别
2020/01/17 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
keras 多gpu并行运行案例
2020/06/10 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
编写类String的构造函数、析构函数和赋值函数
2012/05/29 面试题
营业员个人总结的自我评价
2013/10/25 职场文书
大学毕业感言200字
2014/03/09 职场文书
创业培训计划书
2014/05/03 职场文书
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫