基于python实现百度语音识别和图灵对话
作者:小蜗牛叽咕往前 发布时间:2022-08-23 23:44:54
标签: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))
来源:https://www.cnblogs.com/kekeoutlook/p/9386174.html
0
投稿
猜你喜欢
- 反射是在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象
- 本节讲述单选框/下拉菜单/添加文件,综合css,html和JavaScript实现的,具体详情如下所示:单选框:实现的功能是:(类似平时的性
- ul: unordered lists ol: ordered lists li: Listsol 有序列表:<ol>
- 一、函数概述简单来说 函数 就是自己定义的一段 小程序 方便自己调取使用def 用来定义函数的关键字 也就是这个函数的名字函数运行到retu
- 1. 官方代码FUSE_MODULESTORCH.AO.QUANTIZATION.FUSE_MODULES的源代码2. fuse_modul
- 创建表书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-
- 前言随着人工智能研究的不断兴起,Python的应用也在不断上升,由于Python语言的简洁性、易读性以及可扩展性,特别是在开源工具和深度学习
- LyScript 可实现自定义汇编指令的替换功能,用户可以自行编写一段汇编指令,将程序 * 定的通用函数进行功能改写与转向操作,此功能原理是简
- 下面是IN条件运算符的SQL语句:SELECT column1, SUM(column2) FROM&nbs
- 1 前言在 Java 和 js 中,lambda箭头函数是十分常见的操作,这种表达方式在使用时非常的简便。在python的语法中也有应用场景
- 方式1:在pygame中使用pygame.event.get()方法捕获键盘事件,使用这个方式捕获的键盘事件必须要是按下再弹起才算一次。示例
- 问题当浏览SQL Server 2008的新特性时,我们看到了透明数据加密。这看起来很有趣。您能为我们解释一下并介绍下执行它的细节吗?专家解
- 请问如何从ASP连接到Oracle Server?可用下面的代码进行连接: <%@ Lan
- 最近有点审美疲劳,以往看起来觉得漂亮的界面现在觉得很一般,以前觉得看来还行的界面现在觉得很丑了。想来是时候休息一下了。唯美觉得上次做的OA登
- 最简单的方法:取整后判断是否和原值相等!javascript的取整函数是:parseIntif(parseInt(value)==value
- 我用 python 写了一些脚本,有一些是爬虫脚本,比如爬取知乎特定话题的热门问题,有一些是定期的统计分析脚本,输出统计结果到文档中。之前我
- 本文实例讲述了Python使用wget实现下载网络文件功能。分享给大家供大家参考,具体如下:wget是一个从网络上自动下载文件的自由工具。它
- 本文实例讲述了Python实现将照片变成卡通图片的方法。分享给大家供大家参考,具体如下:之前的文章介绍了使用Photoshop将照片变成卡通
- 为了安全起见,最好还是给打开的文件对象指定一个名字,这样在完成操作之后可以迅速关闭文件,防止一些无用的文件对象占用内存。举个例子,对文本文件
- 如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式。python script.py 0