Python实时语音识别控制
Python实时语音识别控制
概述
本文中的语音识别功能采用 百度语音识别库 ,首先利用 PyAudio 库录制语音指令,保存为受支持的 wav 音频文件,然后利用 百度语音识别库 提供的方法实现语音识别,最后检测识别结果,利用 PyUserInput 库提供的方法模拟控制web页面滚动。
百度语音识别为开发者提供业界优质且免费的语音服务,通过场景识别优化,为车载导航,智能家居和社交聊天等行业提供语音解决方案,准确率达到90%以上,让您的应用绘“声”绘色。
准备工作
安装百度语音识别SDK
pip install baidu-aip
安装Python音频处理库 PyAudio
python -m pip install pyaudio
安装鼠标控制库 PyUserInput
pip install pyuserinput
PyUserInput 库依赖另外两个库 pywin32 和 pyHook ,需要单独安装。
安装方法可以参考下面这篇文章:Win10 Python3.5安装PyUserInput
令附文中提到的资源下载链接:lfd-pythonlibs
另外文中提到的两个包, 需要根据自己的系统和python版本来选择。
如果系统是64位的,就要选择带 amd64 的。
如果python版本为python3.7的,就要选择带 cp37 的。
比如:pywin32-223-cp37-cp37m-win_amd64.whl
pyHook-1.5.1-cp37-cp37m-win_amd64.whl
申请百度开发者帐号
参考下面链接中的文章注册百度帐号,完成开发者认证,创建应用,获取密钥
百度AI开放平台接入流程
用Pyaudio库录制音频
Pyaudio 是一个非常强大的音频处理库,简单几行代码即可实现音频播放,录制等功能.
百度语音识别API支持的语音格式有: pcm(不压缩)、wav(不压缩,pcm编码)、amr(压缩格式).
推荐 pcm , 采样率: 16000 固定值, 编码: 16bit , 位深: 单声道 .百度服务端会将非pcm格式, 转为pcm格式, 因此使用wav, amr会有额外的转换耗时.
为了实现实时语音识别功能, 这里通过pyaudio录制一段wav格式的音频, 报文成wav音频文件, 供后续识别时调用.
# 用Pyaudio库录制音频
# out_file:输出音频文件名
# rec_time:音频录制时间(秒)
def audio_record(out_file, rec_time):
CHUNK = 1024
FORMAT = pyaudio.paInt16 #16bit编码格式
CHANNELS = 1 #单声道
RATE = 16000 #16000采样频率
p = pyaudio.PyAudio()
# 创建音频流
stream = p.open(format=FORMAT, # 音频流wav格式
channels=CHANNELS, # 单声道
rate=RATE, # 采样率16000
input=True,
frames_per_buffer=CHUNK)
print("Start Recording...")
frames = [] # 录制的音频流
# 录制音频数据
for i in range(0, int(RATE / CHUNK * rec_time)):
data = stream.read(CHUNK)
frames.append(data)
# 录制完成
stream.stop_stream()
stream.close()
p.terminate()
print("Recording Done...")
# 保存音频文件
wf = wave.open(out_file, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
调用百度语音API
# 读取paudio录制好的音频文件, 调用百度语音API, 设置api参数, 完成语音识别
# client:AipSpeech对象
# afile:音频文件
# afmt:音频文件格式(wav)
def aip_get_asrresult(client, afile, afmt):
# 选项参数:
# cuid String 用户唯一标识,用来区分用户,填写机器 MAC 地址或 IMEI 码,长度为60以内
# dev_pid String 语言类型(见下表), 默认1537(普通话 输入法模型)
# 识别结果已经被SDK由JSON字符串转为dict
result = client.asr(get_file_content(afile), afmt, 16000, {"cuid": CUID, "dev_pid": DEV_PID,})
#print(result)
# 如果err_msg字段为"success."表示识别成功, 直接从result字段中提取识别结果, 否则表示识别失败
if result["err_msg"] == "success.":
#print(result["result"])
return result["result"]
else:
#print(result["err_msg"])
return ""
dev_pid 参数列表
dev_pid | 语言 | 模型 | 是否有标点 | 备注 |
---|---|---|---|---|
1536 | 普通话(支持简单的英文识别) | 搜索模型 | 无标点 | 支持自定义词库 |
1537 | 普通话(纯中文识别) | 输入法模型 | 有标点 | 不支持自定义词库 |
1737 | 英语 | 有标点 | 不支持自定义词库 | |
1637 | 粤语 | 有标点 | 不支持自定义词库 | |
1837 | 四川话 | 有标点 | 不支持自定义词库 | |
1936 | 普通话远场 | 远场模型 | 有标点 | 不支持 |
控制(鼠标)页面滚动
# 控制鼠标滚动
def mouse_control(dir_tr):
MOVE_DX = 5 # 每次滚动行数
ms = PyMouse()
horizontal = 0
vertical = 0
if dir_tr.find("上") != -1: # 向上移动
vertical = MOVE_DX
#print("vertical={0}, 向上".format(vertical))
elif dir_tr.find("下") != -1: # 向下移动
vertical = 0 - MOVE_DX
#print("vertical={0}, 向下".format(vertical))
elif dir_tr.find("左") != -1: # 向左移动
horizontal = 0 - MOVE_DX
#print("horizontal={0}, 向左".format(horizontal))
elif dir_tr.find("右") != -1: # 向右移动
horizontal = MOVE_DX
#print("horizontal={0}, 向右".format(horizontal))
#print("horizontal, vertical=[{0},{1}]".format(horizontal, vertical))
# 通过scroll(vertical, horizontal)函数控制页面滚动
# 另外PyMouse还支持模拟move光标,模拟鼠标click,模拟键盘击键等
ms.scroll(vertical, horizontal)
完成实时语音识别控制
while(True):
# 请说出语音指令,例如["向上", "向下", "向左", "向右"]
print("\n\n==================================================")
print("Please tell me the command(limit within 3 seconds):")
#print("Please tell me what you want to identify(limit within 10 seconds):")
audio_record(AUDIO_OUTPUT, 3) # 录制语音指令
print("Identify On Network...")
asr_result = aip_get_asrresult(client, AUDIO_OUTPUT, AUDIO_FORMAT) # 识别语音指令
if len(asr_result) != 0: # 语音识别结果不为空,识别结果为一个list
print("Identify Result:", asr_result[0])
print("Start Control...")
mouse_control(asr_result[0]) # 根据识别结果控制页面滚动
print("Control End...")
if asr_result[0].find("退出") != -1: # 如果是"退出"指令则结束程序
break;
time.sleep(1) # 延时1秒
程序运行截图
语音识别
语音控制
项目内文件截图
Python实时语音识别控制
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权
Python实时语音识别控制的更多相关文章
- Python简单语音识别并响应
起因是一个工作中喜欢说口头禅的同事,昨天老说"你看看你看看 操不操心".说了几次之后我就在他说完"你看看"后面续上,"操不操心".往复多次后 ...
- Python手势识别与控制
代码地址如下:http://www.demodashi.com/demo/12968.html Python手势识别与控制 概述 本文中的手势识别与控制功能主要采用 OpenCV 库实现, OpenC ...
- ROS Learning-029 (提高篇-007 A Mobile Base-05) 控制移动平台 --- (Python编程)控制虚拟机器人的移动(精确的制定目标位置)
ROS 提高篇 之 A Mobile Base-05 - 控制移动平台 - (Python编程)控制虚拟机器人的移动(精确的制定目标位置) 使用 odometry 消息类型 重写 out_and_ba ...
- ROS Learning-028 (提高篇-006 A Mobile Base-04) 控制移动平台 --- (Python编程)控制虚拟机器人的移动(不精确的制定目标位置)
ROS 提高篇 之 A Mobile Base-04 - 控制移动平台 - (Python编程)控制虚拟机器人的移动(不精确的制定目标位置) 我使用的虚拟机软件:VMware Workstation ...
- 孤荷凌寒自学python第三十八天初识python的线程控制
孤荷凌寒自学python第三十八天初识python的线程控制 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.线程 在操作系统中存在着很多的可执行的应用程序,每个应用程序启动后,就可以看 ...
- 什么?小程序实时语音识别你还在痛苦的对接科大讯飞?百度Ai识别?
前言 微信小程序,说不上大火,但是需求还是不少的.各大企业都想插一足 于是前端同学就有事情做了. 需求 我需要录音 我边说话边识别,我要同声传译,我要文字转语音,还要萝莉音 我:??? 正文 一开始, ...
- Python之流程控制——if...else...
Python之流程控制--if...else... 一.流程控制 假如把程序比做走路,那我们到现在为止,一直走的都是直路,还没遇到过分岔口.当遇到分岔口时,你得判断哪条岔路是你要走的路,如果我们想让程 ...
- Python之流程控制——while循环
Python之流程控制--while循环 一.语法 while 条件: 执行代码 while就是当的意思,它指当其后面的条件成立,就执行while下面的代码. 例:写一个从0打印到10的程序 coun ...
- 制作属于自己的翻译软件(基于PyQt5+Python+实时翻译)
目录 制作属于自己的翻译软件(基于PyQt5+Python+实时翻译) 翻译软件上传到github上. 软件截图 主要的思想 界面方面 程序方面 制作属于自己的翻译软件(基于PyQt5+Python+ ...
随机推荐
- Appscan计划扫描与扩展程序
计划扫描:工具-->扫描调度程序 或者参考:http://pic.dhe.ibm.com/infocenter/apsshelp/v8r6m0/topic/com.ibm.help.common ...
- [thinkphp] ajaxReturn案例
javascript: <script> $('.ajax-post').click(function(){ var action_url=$('form').attr('action') ...
- 对DDD中领域服务的理解
CZ 能不能清晰具体区分service和实体的区别 网上有人用DCI来解决 不知道对不对 STST 我复习下DDD中的服务的概念了参与讨论啊CZ 这个我也看过 但是太过于笼统 STST STST 复习 ...
- HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别(转)
HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别 文章来源:http://www.cnblogs.com/beatIteWeNerverGiveU ...
- 0103 最短Hamilton路径【状压DP】
0103 最短Hamilton路径 0x00「基本算法」例题 描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Ham ...
- 51nod 1183 编辑距离【线性dp+类似最长公共子序列】
1183 编辑距离 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个 ...
- 欧拉图和欧拉圈-Play On Words(UVa10129)
欧拉路和欧拉圈,简言之就是,从无向图的一个结点出发,走一条路/圈,每条边恰好经过一次,即一笔画问题 欧拉定理:一个无向图最多只有两个奇结点,那么我们就从一个奇结点出发,到另一个结点为之,一定有一条欧拉 ...
- C++指针和数组的区别(不能混用的情况)
通常情况下,C++中指针和数组是可以混用的,但是,在编写字符数组的全排列的时候,混用却出了问题,因此,今天特地mark一下,以备日后查找 这里整理的,不包括用new开辟的动态数组 1.数组一旦声明,我 ...
- hdu6231
hdu6231 题意 给出一些数字,对于任意长度不小于 \(k\) 的区间,把第 \(k\) 大数加入到一个新的数组 \(B\) 中,求 \(B\) 数组第 \(m\) 大数. 分析 二分答案 \(x ...
- Java异常处理机制及两种异常的区别
java异常处理机制主要依赖于try,catch,finally,throw,throws五个关键字. try 关键字后紧跟一个花括号括起来的代码块,简称try块.同理:下面的也被称为相应的块. ...