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

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

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所示。

927651e836cbdbea57eb8ab2d47fb238.png

图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,程序启动后先让"打开百度",然后等待浏览器打开百度后,再告诉其"退出"程序。

94238c7943e98ec8eda9794bacee8c07.png

图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链接进行下载,详细信息可以登陆网站()进行了解。

3002d9d174ae1c285e5c884f43179688.png

图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所示的安装界面,可以看出是一个很常见的程序安装界面,跟其他程序安装没有什么区别,看起来更专业。

b66544ded530eea2e2360b018c8cb6ff.png

图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实用案例编程入门:第十三章 自动收发电子邮件,远程控制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值