本章的主题为通过声音来控制您的电脑。当下的语音识别已经相对比较成熟,比如有的车载系统,或手机都支持语音识别,您可以通过声音来下达指令。比如您告诉导航系统"我要去北京",它会自动帮您设置导航目的地,并开始导航。通过阅读本章内容,读者将了解如何通过声音来控制您的电脑及语音控制的基本原理。

14.1 要解决什么问题

当下的语音识别很火,也相对比较成熟,正确率也极高。而基于语音识别的应用也慢慢的变的非常多。那么我们能不能自己用Python写一个程序,这个程序能够根据您的指令去做一些事情。比如你对着电脑说一声,"打开百度",然后该程序就自动帮你打开浏览器,并登陆到百度的搜索主页。这就是我们本章要解决的问题。

14.2 实现思路

现在我们已经知道我们要解决的问题了,那么接下来就得想想如何实现它了。

首先,一般笔记本电脑都有内置麦克风,台式机可能需要戴个耳机了。我们说的话可以被麦克风录下来,接下来就需要把录下来的这段话进行语音识别,也就是把这段录音转化为文字。那么有了文字就好办了,我们可以检查这段文字是否是我们支持的操作。假如我们现在支持"打开百度",如果您就说了"打开百度",那么将识别到的文字和支持的操作进行对比,发现是支持的,则程序开始自动打开浏览器,并登陆到百度的主页。

我们基于这个思路来实现的一个简单的声控程序。

14.3 相关模块的安装及介绍

本节会将所有用到的模块的安装及功能进行简单的介绍。有的模块很强大,但这里只介绍我们会用到的功能,抛砖引玉。读者可以对感兴趣的模块进行深入学习。

14.3.1 PyAudio模块

安装PyAudio模块的命令如下:

>pip install --user pyaudioCollecting pyaudiohttps://files.pythonhosted.org/packages/72/ad/80dd3ca3a26a2ea74ca7706a8a275712e13b4f884644ae7dc38fb7342bae/PyAudio-0.2.11-cp36-cp36m-win32.whlInstalling collected packages: pyaudioSuccessfully installed pyaudio-0.2.11

PyAudio是一个免费开源软件,是一个跨平台的语音I/O 库。通过PyAudio您能够很容易的用Python去播放和录制音频,可以工作在windows,Mac和Linux操作系统上。我们将用这个库录制音频。

14.3.2 Baidu-aip模块

安装百度AIP模块的命令如下:

>pip install baidu-aipCollecting baidu-aipUsing cached https://files.pythonhosted.org/packages/85/ba/5e94b935b7af791573f1b5bc1b4084311430df8804401da34f27e3708194/baidu-aip-2.2.17.0.tar.gzRequirement already satisfied: requests in c:program files (x86)python3.6.8libsite-packages (from baidu-aip) (2.22.0)Requirement already satisfied: certifi>=2017.4.17 in c:program files (x86)python3.6.8libsite-packages (from requests->baidu-aip) (2019.6.16)Requirement already satisfied: chardet<3.1.0,>=3.0.2 in c:program files (x86)python3.6.8libsite-packages (from requests->baidu-aip) (3.0.4)Requirement already satisfied: idna<2.9,>=2.5 in c:program files (x86)python3.6.8libsite-packages (from requests->baidu-aip) (2.8)Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in c:program files (x86)python3.6.8libsite-packages (from requests->baidu-aip) (1.25.3)Installing collected packages: baidu-aipRunning setup.py install for baidu-aip ... doneSuccessfully installed baidu-aip-2.2.17.0

百度语音识别通过 REST API 的方式给开发者提供一个通用的 HTTP 接口。需要上传完整的录音文件,录音文件时长不超过60s。我们将通过这个API进行解析我们录制的音频文件,将其转化为文字。

百度语音提供2种普通话及英语、粤语、四川话识别模型。

  • 搜索模型: 效果同手机百度搜索的语音输入。适合于短语识别,没有逗号。
  • 输入法模型:效果同百度输入法的语音输入。适合于长句识别,有逗号。

普通话搜索模型同时能识别简单的常用英语语句,效果同手机百度。

读者需要登陆百度AI语音识别界面申请相应的App ID及API Key,如图14-1所示。

图14-1 百度云语音识别App ID及API Key示例

14.3.3 Wave模块

安装wave模块的命令如下:

>pip install Wave

Wave模块提供了一个处理WAV声音格式的便利接口。它不支持压缩和解压缩,但是支持单声道和立体声。由于百度语音AI对上传的音频有特定要求,所以我们将会使用该模块对我们录制的音频进行处理,然后再调用API进行转换。

14.3.4 Webbrowser模块

webbrowser是python的标准库,不需要单独安装。

webbrowser模块提供了high-level的接口让我们可以很方便向用户展示基于Web的文档。大多数情况下,只需要调用open()函数就可以做到。我们这里要使用该模块帮我们打开浏览器,并登陆到百度主页。

14.4 代码实现

到现在,万事俱备只欠东风。让我们开始coding吧。

14.4.1 编写伪码

小时候写作文,老师教我们写提纲,然后再去写文章。而我们写代码也是一样的,我们需要先做概要设计,然后再去做详细设计,最后去编码。道理都是类似的,我们始终要做到"头顶有太阳,心中有地图"这样就不会走弯路甚至迷路。我们这里的伪码就相当于概要设计+详细设计。

import wave, pyaudioimport webbrowserimport os, timedef record_audio():#调用wave进行录音#参照百度AI的要求进行语音的参数设置def convert_audio_to_string_via_ai():#将满足AI解析要求的音频通过API进行解析得到字符串def handle_command():#对得到字符串进行解析,比如字符串包含了"打开百度",则执行相应的操作主函数:recoard_audio() #电脑进行录音convert_audio_to_string_via_ai() #通过API将音频内容转化为文字handle_command() #将得到字符串进行解析,并执行相应的操作

14.4.2 Python代码

程序的运行效果如下图14-2,程序启动后先让"打开百度",然后等待浏览器打开百度后,再告诉其"退出"程序。

图14-2 程序运行效果

这里是完整的代码实现,结合代码和注释,基本可以理解。

# -*- coding: utf-8 -*-#导入需要用到的库import waveimport pyaudioimport webbrowserimport os,time#从aip库中导入AipSpeech接口from aip import AipSpeech #自己申请的APP_ID和KEY APP_ID = '11483452'API_KEY = 'aaKCmDdZDkKUU9McEi1ePmAN'SECRET_KEY = 'hrhoBeoE1PF3C9B4013no2tkSmx9L5Xb'#初始化AipSpeech对象aipSpeech = AipSpeech(APP_ID, API_KEY, SECRET_KEY)CHUNK  = 1024FORMAT = pyaudio.paInt16RATE   = 8000CHANNELS = 1RECORD_SECONDS = 5RECORDED_AUDIO_FILE = "temp_audio.wav"def recoard_audio():"""    通过pyaudio记录一个5秒的音频文件"""    p = pyaudio.PyAudio()    stream = p.open(format=FORMAT,                    channels=CHANNELS,                    rate=RATE,                    input=True,                    frames_per_buffer=CHUNK)    print("* recording will stat")    print("3")    time.sleep(1)    print("2")    time.sleep(1)    print("1")    time.sleep(1)    print("Go")    frames = []    for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):        data = stream.read(CHUNK)        frames.append(data)    print("* done recording")    stream.stop_stream()    stream.close()    p.terminate()    wf = wave.open(RECORDED_AUDIO_FILE, 'wb')    wf.setnchannels(CHANNELS)    wf.setsampwidth(p.get_sample_size(FORMAT))    wf.setframerate(RATE)    wf.writeframes(b''.join(frames))    wf.close()def handle_command(command):"""    根据命令字符串执行对应的操作"""    if command is None:        return    elif '打开百度' == command:        print("正在打开百度")        webbrowser.open_new_tab("baidu.com")    elif '打开邮箱' == command:        print("正在打开邮箱")        os.system(r'"C:Program Files (x86)Microsoft OfficeootOffice16OUTLOOK.EXE"')    else:        #默认处理        print("不知道您想让我做什么")        webbrowser.open("yonggangliu.com")def get_file_content(filePath):"""    获取文件的内容,这里是音频文件,其他文件也通用"""    with open(filePath, 'rb') as fp:        return fp.read()def convert_audio_to_string_via_ai():"""    通过aipSpeech来解析音频文件,得到语音对应的文字内容"""    text = ''    audio_content = get_file_content(RECORDED_AUDIO_FILE)    res = aipSpeech.asr(audio_content, 'wav', RATE, { 'lan': 'zh',})    if res['err_no'] != 0:        print("Please speak again")    elif 'result' in res:        #API返回的字符串是以。结尾的,所以这里去掉结尾的句号        text = res['result'][0][:-1]    else:        pass    return text if __name__ == "__main__":    while True:        recoard_audio()        command_str = convert_audio_to_string_via_ai()        print(command_str)        if command_str in ['退出', '结束']:            print("程序结束")            break        if len(command_str) > 0:            handle_command(command_str)

读者可以在此基础上编写出自己的声控程序。天马行空,任意发挥。

14.4.3 打包为exe安装文件进行发布

我们的程序编写好了,也运行良好,能解决我们的问题。现在如果想把它分享给我们亲爱的其他同事,我们该怎么做呢?最好是将它打包为EXE文件,否则使用的人也需要安装Python,且必须安装所有的依赖库,似乎太麻烦了,没等听您解释完就不想用了。因此,我们需要将Python代码进行打包,生成exe进行方便使用。

这里我们同时也提供了打包为EXE的代码。由于我们使用pyinstaller进行打包,所以需要提前安装。当然安装也很简单,使用pip命令就可以安装。

pip install pyinstaller

安装成功后我们就可以通过下面的代码进行打包了。

接下来,将Python代码转换为exe程序,我们使用的是pyinstaller,具体的转换代码我实现为python代码。只需要执行下面的Python代码,就会调用pyinstaller生成一个单独的exe文件。这种形式的优点是只有一个exe文件,其他所有的依赖的Python环境文件都被打包在该exe文件中。而缺点就是由此导致该文件比较大,而且每次执行都相当于有一个解压到临时目录的过程,所以执行比较慢。

import os, shutilfrom subprocess import Popenif os.path.exists('dist'):    shutil.rmtree("dist")if os.path.exists('build'):    shutil.rmtree("build")if os.path.exists('__pycache__'):    shutil.rmtree("__pycache__")handle = Popen("pyinstaller -F -w --add-data res;res -i res/bit.ico control-pc-via-voice.py")handle.wait()shutil.copyfile("dist/control-pc-via-voice.exe", "./control-pc-via-voice.exe")shutil.rmtree("dist")shutil.rmtree("build")shutil.rmtree("__pycache__")

个人推荐将其打包为目录,而不是单个exe文件。这样的好处就是不需要每次执行都进行解压到临时目录,而是直接在同目录下调用执行,因此比较快。下面就是将Python文件打包为目录的代码,跟上面有区别,其中一个打包参数为-D。下面的脚本生成的目录dist中,会有相应的exe文件,可以直接双击运行。

import os, shutilfrom subprocess import Popenif os.path.exists('dist'):    shutil.rmtree("dist")if os.path.exists('build'):    shutil.rmtree("build")if os.path.exists('__pycache__'):    shutil.rmtree("__pycache__")handle = Popen("pyinstaller -D -w --add-data res;res -i res/bit.ico control-pc-via-voice.py")handle.wait()

而为了更方便,我们这里会介绍如何将该目录打包为安装文件,这样在给别人用的时候,只需要给一个安装文件。用户拿到该安装文件后,安装上之后就可以使用了,且使用感受更好。我们这里介绍一个将目录打包为安装文件的工具程序。该工具程序名为Inno Setup,是一个免费的工具软件,网站主页如下图14-3所示。可以点击Download Inno Setup链接进行下载,详细信息可以登陆网站()进行了解。

图14-3 Inno Setup主页

这里,我们可以按照Inno Setup的引导来创建普通的程序安装文件,创建完成后会生成内容如下所示的iss文件。当然,如果我们提前有该文件的话,可以直接用Inno Setup程序直接打开该文件,执行编译来生成安装文件。

; Script generated by the Inno Setup Script Wizard.; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!#define MyAppName "control-pc-via-voice"#define MyAppVersion "2.2"#define MyAppPublisher "ggang.liu, Inc."#define MyAppExeName "control-pc-via-voice.exe"[Setup]; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)AppId={{F3D8DE4F-EA0D-47E7-AFBC-7FE7A8EAD8D3}AppName={#MyAppName}AppVersion={#MyAppVersion};AppVerName={#MyAppName} {#MyAppVersion}AppPublisher={#MyAppPublisher}DefaultDirName={autopf}{#MyAppName}DisableProgramGroupPage=yes; The [Icons] "quicklaunchicon" entry uses {userappdata} but its [Tasks] entry has a proper IsAdminInstallMode Check.UsedUserAreasWarning=noInfoAfterFile=C:control-pc-via-voiceeleaseREADME.md; Remove the following line to run in administrative install mode (install for all users.)PrivilegesRequired=lowestPrivilegesRequiredOverridesAllowed=dialogOutputDir=C:control-pc-via-voiceeleaseOutputBaseFilename=control-pc-via-voice-setupSetupIconFile=C:control-pc-via-voiceesbt.icoPassword=dotCompression=lzmaSolidCompression=yesWizardStyle=modern[Languages]Name: "english"; MessagesFile: "compiler:Default.isl"[Tasks]Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: uncheckedName: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 6.1; Check: not IsAdminInstallMode[Files]Source: "C:control-pc-via-voicedistcontrol-pc-via-voicecontrol-pc-via-voice.exe"; DestDir: "{app}"; Flags: ignoreversionSource: "C:control-pc-via-voicedistcontrol-pc-via-voice*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; NOTE: Don't use "Flags: ignoreversion" on any shared system files[Icons]Name: "{autoprograms}{#MyAppName}"; Filename: "{app}{#MyAppExeName}"Name: "{autodesktop}{#MyAppName}"; Filename: "{app}{#MyAppExeName}"; Tasks: desktopiconName: "{userappdata}MicrosoftInternet ExplorerQuick Launch{#MyAppName}"; Filename: "{app}{#MyAppExeName}"; Tasks: quicklaunchicon[Run]Filename: "{app}{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

这里会打包生成的安装文件是一个exe文件,我们双击执行安装时会出现类似图14-4所示的安装界面,可以看出是一个很常见的程序安装界面,跟其他程序安装没有什么区别,看起来更专业。

图14-4 服务程序安装界面

到这里,程序的打包安装就介绍完毕,具体选择哪种方式进行打包,可以根据具体情况而定。试着为自己的程序进行打包并安装,让我们的小工具的安装使用足够专业和易用。

14.5 本章小结

在本章的学习中,我们了解到了语音控制系统的基本原理,那就是先录音,然后将声音文件转换为字符串,最后基于字符串执行具体的操作。在这个过程中我们用到了百度的语音AI,当然有能力的读者也可以使用阿里云或其他类似的系统。PyAudio模块也为我们打开了一扇语音I/O的窗户,至少我们知道有这么个模块可以操作音频设备。Wave模块可以处理音频文件。Webbrowser模块可以通过浏览器打开某链接。当然我们这里用的都是最基本的功能,有兴趣的同学可以做进一步深入的学习。


欢迎关注,转发,收藏,谢谢[抠鼻]


Python实用案例编程入门:第一章 Python概述及为什么学Python

Python实用案例编程入门:第二章 字符串

Python实用案例编程入门:第三章 列表和元组

Python实用案例编程入门:第四章 字典和文件

Python实用案例编程入门:第五章 函数和类

Python实用案例编程入门:第七章 调式手段

Python实用案例编程入门:第六章 控制流语句

Python实用案例编程入门:第九章 爬虫下载VOA每日广播英语MP3

Python实用案例编程入门:第十章 用Python处理音频文件

Python实用案例编程入门:第十一章 做一个年会抽奖程序

Python实用案例编程入门:第十二章 测试线预订程序

Python实用案例编程入门:第八章 如何自动连接WIFI

Python实用案例编程入门:第十三章 自动收发电子邮件,远程控制

jquery audio没有声音_Python实用案例编程入门:第十四章 通过声音控制您的计算机相关推荐

  1. python编程求圆的面积案例_Python实用案例编程入门:第七章 调式手段

    本章的主题为调试手段,这是程序开发必不可少的步骤,也是占用时间最多的环节.在程序员的正常开发工作中,调试工作至少占据1/3的时间,而实际编码工作相对占用实际比较少.因此,无论您是初学者,还是编程兴趣爱 ...

  2. VS2013/MFC编程入门之三十四(工具栏:工具栏资源及CToolBar类)

    上一节中讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏. 工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程序会执 ...

  3. VS2010/MFC编程入门之四十四:定时器Timer

    前面一节鸡啄米讲了CTime类和CTimeSpan类的使用,本节继续讲与时间有关的定时器.定时器并不是一个类,主要考虑到,提起时间的话就不能不说定时器,所以就把它放到CTime和CTimeSpan之后 ...

  4. Python核心编程:第十四章

    2019独角兽企业重金招聘Python工程师标准>>> 14.1 可调用的对象 许多python对象都是可调用的,即能通过函数操作符"()"来调用对象. Pyth ...

  5. (转载)VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)...

    上一节中鸡啄米讲了为Ribbon Bar添加控件的方法.本节教程鸡啄米将继续完善前面的实例,讲解一些稍复杂的控件的添加方法,及如何为它们添加消息处理函数. 一.为Ribbon Bar添加更多Ribbo ...

  6. VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)

    上一节中鸡啄米讲了CDC类及其屏幕绘图函数,本节的主要内容是GDI对象之画笔CPen. GDI对象 在MFC中,CGdiObject类是GDI对象的基类,通过查阅MSDN我们可以看到,CGdiObje ...

  7. (转载)VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)

    上一节中鸡啄米讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏. 工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程 ...

  8. 中国式危机公关9加1策略(第十四章 国外危机应对案例參考)

    第十四章 国外危机应对案例參考 案例1:1993年百事可乐"注射器骗局事件" 危机公关背景:1993年6月10日西雅图一家电视台报道说当地一对夫妇在一罐百事可乐里发现了一支注射器. ...

  9. C#编程总结(十四)dynamic

    http://www.cnblogs.com/yank/p/4177619.html C#编程总结(十四)dynamic 介绍 Visual C# 2010 引入了一个新类型 dynamic. 该类型 ...

最新文章

  1. 目标检测 - Tensorflow Object Detection API
  2. tuxedo文件ubbconfig配置说明
  3. verilog的$dumpfile和$dumpvar系统任务详解
  4. c++ 显示三维散点图_Python数据可视化,Matplotlib绘制“散点图”的两种方法!
  5. C# Attribute(中)——Attribute本质论
  6. linux 中级 教程pdf,Linux初中级学习者指导Linux操作系统技术合集.pdf
  7. 4G模组工作笔记001---NB-IOT之一个完整的BC95 UDP从开机到数据发送接收过程
  8. 将cmd添加到鼠标右键,并且在任意目录下可以打开
  9. 基于Matlab系统的HVDC系统
  10. 当下OA系统的使用缺陷以及相关解决方案
  11. Xcode:iOS崩溃日志分析方法
  12. 刷题集--贪吃的九头龙
  13. 笔记本蓝牙显示输入码无效_蓝牙键盘输入码错误无法连接笔记本(win10)
  14. python当前时间减一年_python当前时间减一年_Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年......
  15. vue-ueditor-wrap集成135编辑器
  16. House of apple 一种新的glibc中IO攻击方法
  17. 2020大学生专业薪资排名一览
  18. 机器视觉 边缘检测算子
  19. python画小猪_利用python画小猪佩奇
  20. layui 滚动数据_layui 实现table翻页滚动条位置保持不变的例子

热门文章

  1. 7723java梦游游戏,渠道SDK登录
  2. 第一章踏上python之旅_仙侠旅人传
  3. 广告系统中的Exploitation and Exploration(二)
  4. GBDT迭代决策树的入门教程
  5. Neural Style Transfer 神经风格迁移详解
  6. Wireshark 3.0.0 正式版发布,免费开源的网络数据包分析软件
  7. LeetCode刷题(6)
  8. 服务器系统2022安装wsl2,手把手教你踩坑:老白的Docker for Windows安装初探WSL 2 backend...
  9. canvas 实现图片局部模糊_Canvas 在高清屏下绘制图片变模糊的解决方法
  10. 成绩查询数据结构c语言,学生成绩管理系统(数据结构c语言版源代码)09169.pdf