网络编程
位置:首页>> 网络编程>> Python编程>> 基于Python创建语音识别控制系统

基于Python创建语音识别控制系统

作者:兰斯洛特.  发布时间:2021-08-29 14:02:10 

标签:Python,语音识别

下面附上参考文章,这篇文章是通过识别出来的文字来打开浏览器中的默认网站。python通过调用百度api实现语音识别

题目很简单,利用语音识别识别说出来的文字,根据文字的内容来控制图形移动,例如说向上,识别出文字后,画布上的图形就会向上移动。本文使用的是百度识别API(因为免费),自己做的流程图:

基于Python创建语音识别控制系统

不多说,直接开始程序设计,首先登录百度云,创建应用

基于Python创建语音识别控制系统

注意这里的API Key和Secret Key,要用自己的才能生效

百度语音识别有对应的文档,具体调用方法说的很清晰,如果想学习一下可以查看REST API文档

文档写的很详细,本文只说明用到的方法,语音识别使用方法为组装URL获取token,然后处理本地音频以JSON格式发送到百度语音识别服务器,获得返回结果。

百度语音识别支持pcm、wav等多种格式,百度服务端会将非pcm格式转成pcm格式,因此使用wav、amr格式会有额外的转换耗时。保存为pcm格式可以识别,只是windows自带播放器识别不了pcm格式的,所以改用wav格式,同时要引用wave库,功能为可读、写wav类型的音频文件。采样率使用了pcm采样率16000固定值,编码为16bit位深的单声道。

基于Python创建语音识别控制系统

录音函数中使用了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回调中就实现了对应的功能。

基于Python创建语音识别控制系统

基于Python创建语音识别控制系统

其实代码写的十分麻烦,写在一个文件里会简单些,我画了两个文件的调用关系:

完整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()

文件关系

基于Python创建语音识别控制系统

录制的音频会自动保存在当前文件夹下,就是speech文件

测试结果,运行

基于Python创建语音识别控制系统

点击开始录音

基于Python创建语音识别控制系统

点击开始识别

基于Python创建语音识别控制系统

然后可以看到图形往右移动

基于Python创建语音识别控制系统

经测试,大吼效果更佳 

来源:https://blog.csdn.net/weixin_45973679/article/details/121709190

0
投稿

猜你喜欢

  • 把程序重新写了一遍,日期下拉选择器,可自定义日期范围。使用了一个技巧获取指定月份的天数。演示页面:DateSelector.htm 程序代码
  • 历史:Message Queue的需求由来已久,80年代最早在金融交易中,高盛等公司采用Teknekron公司的产品,当时的Message
  • 最近因为要安装Tensorflow,然后发现tensorflow居然不支持python3.7,于是怒而将其降级到3.6以下是具体命令,mar
  • Python自带一个轻量级的关系型数据库SQLite。这一数据库使用SQL语言。SQLite作为后端数据库,可以搭配Python建网站,或者
  • 前言由于自己并不以Python语言为主,这里只是简单介绍一下Numpy库的使用提示:以下是本篇文章正文内容🧡Numpy库介绍numpy 库处
  • 方法1: X:\oracle\ora81\bin\wrap iname=XXX oname=XXX 方法2:9i在win2000下使用wra
  • 而随着设备硬件配置的不断提升,对中小型应用程序来说,对算法的空间复杂度的要求也宽松了不少。不过,在当今 Web2.0 时代,对应用程序的时间
  • 前些天写一个存储过程,存储过程中使用了事务,后来我把一些代码注释掉来进行调试找错,突然发现一张表被锁住了,原来是创建事务的代码忘记注释掉。本
  • 登录百度AL开发平台在控制台选择语音合成创建应用填写应用信息在应用列表获取(Appid、API Key、Secret Key)6. 安装py
  • 1.装饰器的定义装饰器:给已有函数增加额外的功能的函数,本质上是一个闭包函数特点:    1.不修改已有函数的源代码&n
  • 本文在前面文章基础上介绍tkinter添加图片和文本,在这之前,我们需要安装一个图片库,叫Pillow,这个需要下载exe文件,根据下面图片
  • 1、Xmind用例编写规范1:需求大模块2:大模块中的小模块(需要根据需求来看需要多少层)3:用例等级和用例名称用例等级(转换成Excel文
  • 目的:设计一个应用GUI用于对比两个Excel文件思路1.参数同一个excel文件两个sheet页其中一个ODS(老数据),一个DWH(新数
  • Python是数据分析的强大利器利用Python做数据分析,第一步就是学习如何读取日常工作中产生各种excel报表并存入数据中,方便后续数据
  • Pygame的Event事件模块事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如常用的鼠标点击、键盘敲击
  • 如果你想让你的IIS支持wml,做个wap网站,只需作小小的改变就行了.虽然目前支持wml的虚拟主机极少,但是自己在本机上玩玩也好的.首先在
  • 在SQL Server日常的函数、存储过程和SQL语句中,经常会用到不同数据类型的转换。在SQL Server有两种数据转换类型:一种是显性
  • 1. 换源,sohu的相当好用。 1.1备份CentOS-Base.repo cd /etc/yum.repos.d/ cp CentOS-
  • 前言快520了,咱们来玩玩五子棋陶冶情操。快拿这个和你女朋友去对线。(分了别来找我哇)。多的不说直接进入正题人人对战游戏规则:p1为黑子,p
  • Web标准的web UI——来源、谬误与个人理解序我从2004年末开始接触web标准,2005年5月正式采取完全的web标准方式的网页制作,
手机版 网络编程 asp之家 www.aspxhome.com