python语音识别指南终极版(有这一篇足矣)
【导读】亚马逊的Alexa的巨大成功已经证明:在不远的将来,实现一定程度上的语音支持将成为日常科技的基本要求。整合了语音识别的Python程序提供了其他技术无法比拟的交互性和可访问性。最重要的是,在Python程序中实现语音识别非常简单。阅读本指南,你就将会了解。你将学到:
•语音识别的工作原理;
•PyPI支持哪些软件包;
•如何安装和使用SpeechRecognition软件包——一个功能全面且易于使用的Python语音识别库。
语音识别源于20世纪50年代早期在贝尔实验室所做的研究。早期语音识别系统仅能识别单个讲话者以及只有约十几个单词的词汇量。现代语音识别系统已经取得了很大进步,可以识别多个讲话者,并且拥有识别多种语言的庞大词汇表。
语音识别的首要部分当然是语音。通过麦克风,语音便从物理声音被转换为电信号,然后通过模数转换器转换为数据。一旦被数字化,就可适用若干种模型,将音频转录为文本。
许多现代语音识别系统会在HMM识别之前使用神经网络,通过特征变换和降维的技术来简化语音信号。也可以使用语音活动检测器(VAD)将音频信号减少到可能仅包含语音的部分。
幸运的是,对于Python使用者而言,一些语音识别服务可通过API在线使用,且其中大部分也提供了PythonSDK。
选择Python语音识别包
PyPI中有一些现成的语音识别软件包。其中包括:
•apiai
•google-cloud-speech
•pocketsphinx
•SpeechRcognition
•watson-developer-cloud
•wit
一些软件包(如wit和apiai)提供了一些超出基本语音识别的内置功能,如识别讲话者意图的自然语言处理功能。其他软件包,如谷歌云语音,则专注于语音向文本的转换。
识别语音需要输入音频,而在SpeechRecognition中检索音频输入是非常简单的,它无需构建访问麦克风和从头开始处理音频文件的脚本,只需几分钟即可自动完成检索并运行。
SpeechRecognition库可满足几种主流语音API,因此灵活性极高。其中GoogleWebSpeechAPI支持硬编码到SpeechRecognition库中的默认API密钥,无需注册就可使用。SpeechRecognition以其灵活性和易用性成为编写Python程序的最佳选择。
安装SpeechRecognation
SpeechRecognition兼容Python2.6,2.7和3.3+,但若在Python2中使用还需要一些额外的安装步骤。本教程中所有开发版本默认Python3.3+。
读者可使用pip命令从终端安装SpeechRecognition:
$pipinstallSpeechRecognition
安装完成后请打开解释器窗口并输入以下内容来验证安装:
>>>importspeech_recognitionassr >>>sr.__version__ '3.8.1'
注:不要关闭此会话,在后几个步骤中你将要使用它。
若处理现有的音频文件,只需直接调用SpeechRecognition,注意具体的用例的一些依赖关系。同时注意,安装PyAudio包来获取麦克风输入。
识别器类
SpeechRecognition的核心就是识别器类。
RecognizerAPI主要目是识别语音,每个API都有多种设置和功能来识别音频源的语音,分别是:
- recognize_bing():MicrosoftBingSpeech
- recognize_google():GoogleWebSpeechAPI
- recognize_google_cloud():GoogleCloudSpeech-requiresinstallationofthegoogle-cloud-speechpackage
- recognize_houndify():HoundifybySoundHound
- recognize_ibm():IBMSpeechtoText
- recognize_sphinx():CMUSphinx-requiresinstallingPocketSphinx
- recognize_wit():Wit.ai
以上七个中只有recognition_sphinx()可与CMUSphinx引擎脱机工作,其他六个都需要连接互联网。
SpeechRecognition附带GoogleWebSpeechAPI的默认API密钥,可直接使用它。其他六个API都需要使用API密钥或用户名/密码组合进行身份验证,因此本文使用了WebSpeechAPI。
现在开始着手实践,在解释器会话中调用recognise_google()函数。
>>>r.recognize_google()
屏幕会出现:
Traceback(mostrecentcalllast):
File"",line1,in
TypeError:recognize_google()missing1requiredpositionalargument:'audio_data'
相信你已经猜到了结果,怎么可能从空文件中识别出数据呢?
这7个recognize_*()识别器类都需要输入audio_data参数,且每种识别器的audio_data都必须是SpeechRecognition的AudioData类的实例。
AudioData实例的创建有两种路径:音频文件或由麦克风录制的音频,先从比较容易上手的音频文件开始。
音频文件的使用
首先需要下载音频文件(https://github.com/realpython/python-speech-recognition/tree/master/audio_files),保存到Python解释器会话所在的目录中。
AudioFile类可以通过音频文件的路径进行初始化,并提供用于读取和处理文件内容的上下文管理器界面。
支持文件类型
SpeechRecognition目前支持的文件类型有:
- WAV:必须是PCM/LPCM格式
- AIFF
- AIFF-C
- FLAC:必须是初始FLAC格式;OGG-FLAC格式不可用
若是使用Linux系统下的x-86,macOS或者是Windows系统,需要支持FLAC文件。若在其它系统下运行,需要安装FLAC编码器并确保可以访问flac命令。
在解释器会话框键入以下命令来处理“harvard.wav”文件的内容:
>>>harvard=sr.AudioFile('harvard.wav') >>>withharvardassource: ...audio=r.record(source) ...
通过上下文管理器打开文件并读取文件内容,并将数据存储在AudioFile实例中,然后通过record()将整个文件中的数据记录到AudioData实例中,可通过检查音频类型来确认:
>>>type(audio)
现在可以调用recognition_google()来尝试识别音频中的语音。
>>>r.recognize_google(audio) 'thestalesmellofoldbeerlingersittakesheat tobringouttheodoracolddiprestoreshealthand zestasaltpickletastefinewithhamtacosal Pastorearemyfavoriteazestfulfoodisthehot crossbun'
以上就完成了第一个音频文件的录制。
若只想捕捉文件中部分演讲内容该怎么办?record()命令中有一个duration关键字参数,可使得该命令在指定的秒数后停止记录。
例如,以下内容仅获取文件前四秒内的语音:
>>>withharvardassource: ...audio=r.record(source,duration=4) ... >>>r.recognize_google(audio) 'thestalesmellofoldbeerlingers'
在with块中调用record()命令时,文件流会向前移动。这意味着若先录制四秒钟,再录制四秒钟,则第一个四秒后将返回第二个四秒钟的音频。
>>>withharvardassource: ...audio1=r.record(source,duration=4) ...audio2=r.record(source,duration=4) ... >>>r.recognize_google(audio1) 'thestalesmellofoldbeerlingers' >>>r.recognize_google(audio2) 'ittakesheattobringouttheodoracolddip'
除了指定记录持续时间之外,还可以使用offset参数为record()命令指定起点,其值表示在开始记录的时间。如:仅获取文件中的第二个短语,可设置4秒的偏移量并记录3秒的持续时间。
>>>withharvardassource: ...audio=r.record(source,offset=4,duration=3) ... >>>recognizer.recognize_google(audio) 'ittakesheattobringouttheodor'
在事先知道文件中语音结构的情况下,offset和duration关键字参数对于分割音频文件非常有用。但使用不准确会导致转录不佳。
>>>withharvardassource: ...audio=r.record(source,offset=4.7,duration=2.8) ... >>>recognizer.recognize_google(audio) 'MesquitetobringouttheodorAiko'
本程序从第4.7秒开始记录,从而使得词组“ittakesheattobringouttheodor”,中的“itt”没有被记录下来,此时API只得到“akesheat”这个输入,而与之匹配的是“Mesquite”这个结果。
同样的,在获取录音结尾词组“acolddiprestoreshealthandzest”时API仅仅捕获了“aco”,从而被错误匹配为“Aiko”。
噪音也是影响翻译准确度的一大元凶。上面的例子中由于音频文件干净从而运行良好,但在现实中,除非事先对音频文件进行处理,否则不可能得到无噪声音频。
噪声在现实世界中确实存在,所有录音都有一定程度的噪声,而未经处理的噪音可能会破坏语音识别应用程序的准确性。
要了解噪声如何影响语音识别,请下载“jackhammer.wav”(https://github.com/realpython/python-speech-recognition/tree/master/audio_files)文件,并确保将其保存到解释器会话的工作目录中。文件中短语“thestalesmellofoldbeerlingers”在是很大钻墙声的背景音中被念出来。
尝试转录此文件时会发生什么?
>>>jackhammer=sr.AudioFile('jackhammer.wav') >>>withjackhammerassource: ...audio=r.record(source) ... >>>r.recognize_google(audio) 'thesnailsmellofoldgearvendors'
>>>withjackhammerassource: ...r.adjust_for_ambient_noise(source) ...audio=r.record(source) ... >>>r.recognize_google(audio) 'stillsmellofoldbeervendors'
因为使用adjust_for_ambient_noise()命令时,默认将文件流的第一秒识别为音频的噪声级别,因此在使用record()获取数据前,文件的第一秒已经被消耗了。
>>>withjackhammerassource: ...r.adjust_for_ambient_noise(source,duration=0.5) ...audio=r.record(source) ... >>>r.recognize_google(audio) 'thesnailsmelllikeoldBeerMongers'
现在我们就得到了这句话的“the”,但现在出现了一些新的问题——有时因为信号太吵,无法消除噪音的影响。
>>>r.recognize_google(audio,show_all=True) {'alternative':[ {'transcript':'thesnailsmelllikeoldBeerMongers'}, {'transcript':'thestillsmellofoldbeervendors'}, {'transcript':'thesnailsmelllikeoldbeervendors'}, {'transcript':'thestalesmellofoldbeervendors'}, {'transcript':'thesnailsmelllikeoldbeermongers'}, {'transcript':'destihlsmellofoldbeervendors'}, {'transcript':'thestillsmelllikeoldbeervendors'}, {'transcript':'bastillesmellofoldbeervendors'}, {'transcript':'thestillsmelllikeoldbeermongers'}, {'transcript':'thestillsmellofoldbeervenders'}, {'transcript':'thestillsmellingoldbeervendors'}, {'transcript':'mustysmellofoldbeervendors'}, {'transcript':'thestillsmellofoldbeervendor'} ],'final':True}
可以看到,recognition_google()返回了一个关键字为'alternative'的列表,指的是所有可能的响应列表。此响应列表结构会因API而异且主要用于对结果进行调试。
麦克风的使用
若要使用SpeechRecognizer访问麦克风则必须安装PyAudio软件包,请关闭当前的解释器窗口,进行以下操作:
安装PyAudio的过程会因操作系统而异。
DebianLinux
如果使用的是基于Debian的Linux(如Ubuntu),则可使用apt安装PyAudio:
$sudoapt-getinstallpython-pyaudiopython3-pyaudio
安装完成后可能仍需要启用pipinstallpyaudio,尤其是在虚拟情况下运行。
macOS
macOS用户则首先需要使用Homebrew来安装PortAudio,然后调用pip命令来安装PyAudio。
$brewinstallportaudio $pipinstallpyaudio
Windows
Windows用户可直接调用pip来安装PyAudio。
$pipinstallpyaudio
安装测试
安装了PyAudio后可从控制台进行安装测试。
$python-mspeech_recognition
请确保默认麦克风打开并取消静音,若安装正常则应该看到如下所示的内容:
Amomentofsilence,please...
Setminimumenergythresholdto600.4452854381937
Saysomething!
请对着麦克风讲话并观察SpeechRecognition如何转录你的讲话。
Microphone类
请打开另一个解释器会话,并创建识一个别器类的例子。
>>>importspeech_recognitionassr >>>r=sr.Recognizer()
此时将使用默认系统麦克风,而不是使用音频文件作为信号源。读者可通过创建一个Microphone类的实例来访问它。
>>>mic=sr.Microphone()
若系统没有默认麦克风(如在RaspberryPi上)或想要使用非默认麦克风,则需要通过提供设备索引来指定要使用的麦克风。读者可通过调用Microphone类的list_microphone_names()函数来获取麦克风名称列表。
>>>sr.Microphone.list_microphone_names() ['HDAIntelPCH:ALC272Analog(hw:0,0)', 'HDAIntelPCH:HDMI0(hw:0,3)', 'sysdefault', 'front', 'surround40', 'surround51', 'surround71', 'hdmi', 'pulse', 'dmix', 'default']
注意:你的输出可能与上例不同。
list_microphone_names()返回列表中麦克风设备名称的索引。在上面的输出中,如果要使用名为“front”的麦克风,该麦克风在列表中索引为3,则可以创建如下所示的麦克风实例:
>>>#Thisisjustanexample;donotrun >>>mic=sr.Microphone(device_index=3)
但大多数情况下需要使用系统默认麦克风。
准备好麦克风实例后,读者可以捕获一些输入。
就像AudioFile类一样,Microphone是一个上下文管理器。可以使用with块中Recognizer类的listen()方法捕获麦克风的输入。该方法将音频源作为第一个参数,并自动记录来自源的输入,直到检测到静音时自动停止
>>>withmicassource: ...audio=r.listen(source) ...
执行with块后请尝试在麦克风中说出“hello”。请等待解释器再次显示提示,一旦出现“>>>”提示返回就可以识别语音。
>>>r.recognize_google(audio) 'hello'
如果没有提示再次返回,可能是因为麦克风收到太多的环境噪音,请使用Ctrl+C中断这个过程,从而让解释器再次显示提示。
要处理环境噪声,可调用Recognizer类的adjust_for_ambient_noise()函数,其操作与处理噪音音频文件时一样。由于麦克风输入声音的可预测性不如音频文件,因此任何时间听麦克风输入时都可以使用此过程进行处理。
>>>withmicassource: ...r.adjust_for_ambient_noise(source) ...audio=r.listen(source) ...
运行上面的代码后稍等片刻,尝试在麦克风中说“hello”。同样,必须等待解释器提示返回后再尝试识别语音。
SpeechRecognition资料建议duration参数不少于0.5秒。某些情况下,你可能会发现,持续时间超过默认的一秒会产生更好的结果。您所需要的最小值取决于麦克风所处的周围环境,不过,这些信息在开发过程中通常是未知的。根据我的经验,一秒钟的默认持续时间对于大多数应用程序已经足够。
尝试将前面的代码示例输入到解释器中,并在麦克风中输入一些无法理解的噪音。你应该得到这样的结果:
Traceback(mostrecentcalllast):
File"",line1,in
File"/home/david/real_python/speech_recognition_primer/venv/lib/python3.5/site-packages/speech_recognition/__init__.py",line858,inrecognize_google
ifnotisinstance(actual_result,dict)orlen(actual_result.get("alternative",[]))==0:raiseUnknownValueError()
speech_recognition.UnknownValueError
无法被API匹配成文字的音频会引发UnknownValueError异常,因此要频繁使用try和except块来解决此类问题。API会尽全力去把任何声音转成文字,如短咕噜声可能会被识别为“How”,咳嗽声、鼓掌声以及舌头咔哒声都可能会被转成文字从而引起异常。
到此这篇关于python语音识别指南终极版(有这一篇足矣)的文章就介绍到这了,更多相关python语音识别内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。