用Python怎么实现对语音识别及控制
Admin 2022-06-23 群英技术资�
下面附上参考文章,这篇文章是通过识别出来的文字来打开浏览器中的默认网站。python通过调用百度api实现语音识别
题目很简单,利用语音识别识别说出来的文字,根据文字的内容来控制图形移动,例如说向上,识别出文字后,画布上的图形就会向上移动。本文使用的是百度识别API(因为免费),自己做的流程图�
不多说,直接开始程序设计,首先登录百度云,创建应用
注意这里的API Key和Secret Key,要用自己的才能生效
百度语音识别有对应的文档,具体调用方法说的很清晰,如果想学习一下可以查看REST API文档
文档写的很详细,本文只说明用到的方法,语音识别使用方法为组装URL获取token,然后处理本地音频以JSON格式发送到百度语音识别服务器,获得返回结果�
百度语音识别支持pcm、wav等多种格式,百度服务端会将非pcm格式转成pcm格式,因此使用wav、amr格式会有额外的转换耗时。保存为pcm格式可以识别,只是windows自带播放器识别不了pcm格式的,所以改用wav格式,同时要引用wave库,功能为可读、写wav类型的音频文件。采样率使用了pcm采样�16000固定值,编码�16bit位深的单声道�
录音函数中使用了PyAudio库,是Python下的一个音频处理模块,用于将音频流输送到计算机声卡上。在当前文件夹打开一个新的音频进行录音并存放录音数据。本地录音:
def save_wave_file(filepath, data): wf = wave.open(filepath, 'wb') wf.setnchannels(channels) wf.setsampwidth(sampwidth) wf.setframerate(framerate) wf.writeframes(b''.join(data)) wf.close() # 录音 def my_record(): pa = PyAudio() # 打开一个新的音频stream stream = pa.open(format=paInt16, channels=channels, rate=framerate, input=True, frames_per_buffer=num_samples) my_buf = [] # 存放录音数据 t = time.time() print('正在录音...') while time.time() < t + 5: # 设置录音时间(秒� # 循环read,每次read 2000frames string_audio_data = stream.read(num_samples) my_buf.append(string_audio_data) print('录音结束.') save_wave_file(FILEPATH, my_buf) stream.close()
然后是获取token,根据创建应用得到的APIKey和SecreKey(这里要使用自己的)来组装URL获取token。在语音识别函数中调用获取的token和已经录制好的音频数据,按照要求的格式来写进JSON参数进行上传音频�
百度语音要求对本地语音二进制数据进行base64编码,使用base64库来进行编码。创建识别请求使用的是POST方式来进行提交,在识别函数中写入百度语音提供的短语音识别请求地址。识别结果会立刻返回,采用JSON格式进行封装,识别结果放� JSON � “result� 字段中,统一采用 utf-8 方式编码�
# 组装url获取token base_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s" APIKey = "*****************" SecretKey = "********************" HOST = base_url % (APIKey, SecretKey) def getToken(host): res = requests.post(host) r = res.json()['access_token'] return r # 传入语音二进制数据,token # dev_pid为百度语音识别提供的几种语言选择,默�1537为有标点普通话 def speech2text(speech_data, token, dev_pid=1537): FORMAT = 'wav' RATE = '16000' CHANNEL = 1 CUID = '*******' SPEECH = base64.b64encode(speech_data).decode('utf-8') data = { 'format': FORMAT, 'rate': RATE, 'channel': CHANNEL, 'cuid': CUID, 'len': len(speech_data), 'speech': SPEECH, 'token': token, 'dev_pid': dev_pid } url = 'https://vop.baidu.com/server_api' # 短语音识别请求地址 headers = {'Content-Type': 'application/json'} print('正在识别...') r = requests.post(url, json=data, headers=headers) Result = r.json() if 'result' in Result: return Result['result'][0] else: return Result
最后我们编写控制移动函数,首先我们要知道如何来把控制图形移动来呈现出来。本项目中我们使用的是tkinter模块,Tkinter是一个python模块,是一个调用Tcl/Tk的接口,它是一个跨平台的脚本图形界面接口。是一个比较流行的python图形编程接口。最大的特点是跨平台,缺点是性能不太好,执行速度慀�
我们利用tkinter中的canvas来设置一个画布,并创建一个事件ID�1的矩形,把矩形放在画布中显示。在画布中添加Button按钮,回调中写入对应的函数,点击触发录制音频和语音识别。为了使代码更加简洁,我们把移动函数放在语音识别函数中调用,返回识别结果后对结果做出判断,最后使图形进行移动�
def move(result): print(result) if "向上" in result: canvas.move(1, 0, -30) # 移动的是 ID�1的事物【move�2,0,-5)则移动ID�2的事物】,使得横坐标加0,纵坐标�30 elif "向下" in result: canvas.move(1, 0, 30) elif "向左" in result: canvas.move(1, -30, 0) elif "向右" in result: canvas.move(1, 30, 0) tk = Tk() tk.title("语音识别控制图形移动") Button(tk, text="开始录�", command=AI.my_record).pack() Button(tk, text="开始识�", command=speech2text).pack() canvas = Canvas(tk, width=500, height=500) # 设置画布 canvas.pack() # 显示画布 r = canvas.create_rectangle(180, 180, 220, 220, fill="red") # 事件ID�1 mainloop()
个人习惯,我把语音识别和图形控制写在了两个文件里,这就导致main.py文件中没有办法使用AI.py文件函数中的返回值,因为我们使用的tkinter模块是不断循坏的,通过mainloop()才能结束循环,这样不断循坏就调用不了返回值,使用的方法是在main.py中重新构建一样函数来调用AI.py文件中的函数,并声明全局变量,把AI.py文件中的返回值放在main.py文件的全局变量中,这样就得到了返回值,再将函数写到Button回调中就实现了对应的功能�
其实代码写的十分麻烦,写在一个文件里会简单些,我画了两个文件的调用关系:
完整demo如下
AI.py
import wave # 可读、写wav类型的音频文件� import requests # 基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库。在本项目中用于传递headers和POST请求 import time import base64 # 百度语音要求对本地语音二进制数据进行base64编码 from pyaudio import PyAudio, paInt16 # 音频处理模块,用于将音频流输送到计算机声卡上 framerate = 16000 # 采样� num_samples = 2000 # 采样� channels = 1 # 声道 sampwidth = 2 # 采样宽度2bytes FILEPATH = 'speech.wav' # 组装url获取token base_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s" APIKey = "8bv3inF5roWBtEXYpZViCs39" SecretKey = "HLXYiLGCpeOD6ddF1m6BvwcDZVOYtwwD" HOST = base_url % (APIKey, SecretKey) def getToken(host): res = requests.post(host) r = res.json()['access_token'] return r def save_wave_file(filepath, data): wf = wave.open(filepath, 'wb') wf.setnchannels(channels) wf.setsampwidth(sampwidth) wf.setframerate(framerate) wf.writeframes(b''.join(data)) wf.close() # 录音 def my_record(): pa = PyAudio() # 打开一个新的音频stream stream = pa.open(format=paInt16, channels=channels, rate=framerate, input=True, frames_per_buffer=num_samples) my_buf = [] # 存放录音数据 t = time.time() print('正在录音...') while time.time() < t + 5: # 设置录音时间(秒� # 循环read,每次read 2000frames string_audio_data = stream.read(num_samples) my_buf.append(string_audio_data) print('录音结束.') save_wave_file(FILEPATH, my_buf) stream.close() def get_audio(file): with open(file, 'rb') as f: data = f.read() return data # 传入语音二进制数据,token # dev_pid为百度语音识别提供的几种语言选择,默�1537为有标点普通话 def speech2text(speech_data, token, dev_pid=1537): FORMAT = 'wav' RATE = '16000' CHANNEL = 1 CUID = '*******' SPEECH = base64.b64encode(speech_data).decode('utf-8') data = { 'format': FORMAT, 'rate': RATE, 'channel': CHANNEL, 'cuid': CUID, 'len': len(speech_data), 'speech': SPEECH, 'token': token, 'dev_pid': dev_pid } url = 'https://vop.baidu.com/server_api' # 短语音识别请求地址 headers = {'Content-Type': 'application/json'} print('正在识别...') r = requests.post(url, json=data, headers=headers) Result = r.json() if 'result' in Result: return Result['result'][0] else: return Result
main.py
import AI from tkinter import * # 导入tkinter模块的所有内� token = None speech = None result = None def getToken(): temptoken = AI.getToken(AI.HOST) return temptoken def speech2text(): global token if token is None: token = getToken() speech = AI.get_audio(AI.FILEPATH) result = AI.speech2text(speech, token, dev_pid=1537) print(result) move(result) def move(result): print(result) if "向上" in result: canvas.move(1, 0, -30) # 移动的是 ID�1的事物【move�2,0,-5)则移动ID�2的事物】,使得横坐标加0,纵坐标�30 elif "向下" in result: canvas.move(1, 0, 30) elif "向左" in result: canvas.move(1, -30, 0) elif "向右" in result: canvas.move(1, 30, 0) tk = Tk() tk.title("语音识别控制图形移动") Button(tk, text="开始录�", command=AI.my_record).pack() Button(tk, text="开始识�", command=speech2text).pack() canvas = Canvas(tk, width=500, height=500) # 设置画布 canvas.pack() # 显示画布 r = canvas.create_rectangle(180, 180, 220, 220, fill="red") # 事件ID�1 mainloop()
文件关系
录制的音频会自动保存在当前文件夹下,就是speech文件
测试结果,运�
点击开始录�
点击开始识�
然后可以看到图形往右移�
经测试,大吼效果更佳
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:[email protected]进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容�
猜你喜欢
对于python中多个列表,我们可以选择将有用的列表合并使用。python中extend()方法可以在列表的尾部追加一个列表。使用这种方法可以直接在原有列表后加上了需要合并的新列表,扩增的原有的列表,已达到合并列表的需求�
@用做函数的修饰符,可以在模块或者类的定义层内对函数进行修饰,下面这篇文章主要给大家介绍了关于python中 @ 的含义以及基本使用的相关资料,需要的朋友可以参考下
今天我们来总结一下python装饰器的原理、作用和使用,之前我们以及有详细的了解过python装饰器了,因此这篇文章就带大家简单的回顾一下python装饰器的知识,有需要的朋友可以参考�
新手学习python,对于编写函数的规范以及注意事项是需要掌握,因此下面给大家介绍一些关于python编写函数的注意事项,对于新手来说具有一定的参考价值,需要的朋友可以了解一下,下面我们就一起来看看�
匿名函数就是不需要显式的指定函数名,这篇文章给大家介绍的就是关于python匿名函数的内容,下文会详细介绍python匿名函数的定义、语法、使用场景、使用形式等等,对大家学习和理解python匿名函数有一定的帮助,感兴趣的朋友可以了解了解�
推荐内容
联系我们
24小时售后Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所� 茂名市群英网络有限公�
增值电信经营许可证 : B1.B2-20140078