基于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+Wordpress制作小说站
Apr 14 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
Oct 16 Python
python正则中最短匹配实现代码
Jan 16 Python
Python os.access()用法实例
Feb 18 Python
深入了解Python枚举类型的相关知识
Jul 09 Python
Python 元组操作总结
Sep 18 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
使用python求解二次规划的问题
Feb 29 Python
python爬虫用scrapy获取影片的实例分析
Nov 23 Python
python3爬虫中多线程的优势总结
Nov 24 Python
Python手拉手教你爬取贝壳房源数据的实战教程
May 21 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中curl使用指南
2015/02/05 PHP
php 判断IP为有效IP地址的方法
2018/01/28 PHP
Asp.net下利用Jquery Ajax实现用户注册检测(验证用户名是否存)
2010/09/12 Javascript
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
各情景下元素宽高的获取实现代码
2011/09/13 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
2016/06/02 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
微信小程序 ecshop地址三级联动实现实例代码
2017/02/28 Javascript
jquery实现简单实用的轮播器
2017/05/23 jQuery
vue 函数调用加括号与不加括号的区别
2020/10/29 Javascript
[05:31]DOTA2英雄梦之声_第04期_光之守卫
2014/06/23 DOTA
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
2015/05/05 Python
Python实用日期时间处理方法汇总
2015/05/09 Python
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
2018/02/26 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
python创建n行m列数组示例
2019/12/02 Python
python中68个内置函数的总结与介绍
2020/02/24 Python
Python 字符串池化的前提
2020/07/03 Python
Levi’s西班牙官方网站:李维斯,著名的牛仔裤品牌
2020/08/20 全球购物
外贸公司实习自我鉴定
2013/09/24 职场文书
公司出纳岗位职责
2013/12/07 职场文书
报社实习生自荐信
2014/01/24 职场文书
《美丽的黄昏》教学反思
2014/02/28 职场文书
学生请假条
2014/04/11 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
大学生个人简历自我评价
2015/03/11 职场文书
初中重阳节活动总结
2015/05/05 职场文书
安全生产奖惩制度
2015/08/06 职场文书
解决Pytorch半精度浮点型网络训练的问题
2021/05/24 Python
十大最强电系宝可梦,阿尔宙斯电系之一,第七被称为雷神
2022/03/18 日漫
Pandas 数据编码的十种方法
2022/04/20 Python