Python 语音识别

Python 语音识别

你是否思考过 Google助手亚马逊Alexa 是如何识别你说的话的?你一定在想背后有一些复杂的智能技术在运作。除了巨大的市场命中率外,在庞大的技术增长的识别系统市场上,大多数手机设备都具备语音识别功能,通过一些内置应用程序或第三方应用程序实现。但并不一定需要一些复杂的智能技术。实际上,大多数这样的语音识别系统都是通过Python包和库构建和部署的。到一定程度上,Python已经证明了它是可预见未来的重要组成部分。原因非常明显。要在Python中实现语音识别,您需要一定程度的互动性和可访问性与技术相匹配。

值得考虑的是可访问性的概念,因为识别允许 年长者、身体残疾者视障人士 与机器互动,并通过最先进的服务和产品迅速解决问题,而不是选择随意的GUI应用程序。

在本文中,您将学习如何在Python中创建一个语音识别系统。为了简化理解的过程,本文旨在教给您如何以更少的努力和更多的热情来构建系统。但在进入项目之前,让我们谈谈作为开发人员需要了解的一些更重要的方面。

概述-工作原理

在深入项目的细节和复杂的角落之前,您将构建并了解有关语音识别工作原理的概述。虽然您无需任何先决条件即可开始,但了解Python编程语言的基本原理是很好的。

语音识别起源于1950年贝尔实验室的研究,当时仅限于单个讲话者,并且词汇库有限。自从古代同类产品出现以来,现代语音识别应用程序取得了长足的发展。

谈到语音的组成部分,第一个组成部分是 语音 。它必须从声音转换为可以通过麦克风传输和转录为数字数据的信号。这是通过模拟到数字转换器完成的。一旦数据形式被数字化,多个训练有素的模型可以轻松地将音频转写为文本。

Python 语音识别

现代的语音识别器依赖于不太知名的隐马尔可夫模型(HMM)的概念。该方法基于对语音信号的假设,当语音信号持续一小段时间(比如五毫秒)并且可能被称为静态过程时,即一个基于不随时间变化的统计数据的过程。

在一个典型的HMM中,语音的默认信号分段大约是十毫秒,并被分为不同的片段。每个片段的功率谱帮助信号绘制一个函数,并产生一个频率,后者稍后映射到名为倒谱系数的实数向量上。与某些精确系统可能具有维度接近32或更高的维度相比,映射向量的维度相对较小,至少是十。HMM生成的最终输出以向量序列的形式呈现。

向量组在通过使用语音的基本单位音素的帮助下将语音解码为文本时发挥着重要作用。音素的计算取决于训练,因为存在说话者间的差异,即使对于同一说话者,话语有时也是不同的。因此,为了应对这个问题,考虑了一种特殊的算法,确定产生音素序列的最相关的单词。

刚刚学到的整个过程在计算方面相当昂贵。现代语音识别系统中使用神经网络来转换特征和维度,从而减少对HMM的需求。此外,还使用语音活动检测器(VAD)来减少可能包含一些语音的音频信号的一部分。主要用于识别不必要的语音部分,并阻止这些部分被考虑进来。

语音识别套件

有一些语音识别的套件存在于PyPI的链中。其中一些套件包括:

  1. Assembly
  2. Apia
  3. SpeechRecognition
  4. Wit
  5. Watson-developer-cloud

以上提到的套件,比如apiai和wit,提供了自然语言处理等功能。它们内置的功能有助于识别说话者的意图,并超越了通用的语音识别。其他套件主要关注将语音转为文本。

只有一个套件在以上提供的套件中脱颖而出,那就是SpeechRecognition。

识别语音需要以音频的形式提供一些输入,SpeechRecognition套件可以轻松地检索这些类型的输入。它不需要使用困难的脚本来访问麦克风,然后从头开始处理音频。这个套件的另一个优点是它可以节省您的时间,在几分钟内执行指令。

SpeechRecognition库的行为类似于各种专为语音而建的API的封装。它非常灵活和敏捷。其中一个API是支持硬编码默认语音识别的Google Web Speech API。

SpeechRecognition库非常容易使用,并且可以作为Python项目导入。需要注意的是,该库可能没有包含所有当前可用的API。因此,您需要确定您需要构建语音识别器所需的确切包。

理论上,您可能已经了解了一些语音识别器的优点和缺点,以及语音识别器的工作概述,接下来让我们使用以下安装过程将SpeechRecognition包安装到本地环境中。

SpeechRecognition安装

SpeechRecognition包与各种版本的Python语言兼容,如 2.6、2.73.3 +。如果您的Python版本较旧,可能还需要进行其他一些安装。假设您在本地系统上有Python 3.3+版本,您可以通过终端使用 pip 进行安装。

  $ pip install SpeechRecognition

安装后,您必须使用下面给出的代码验证安装是否正确解释。

 >>> import speech_recognition as sr
>>> sr._version_'3.8.1'

SpeechRecognition在处理音频文件时可能表现出色。但是,它也可能需要一些依赖项。因此,为了简化这个过程,在捕获麦克风输入时,方便使用 PyAudio 软件包。

Recognizer类

只有在有 Recognizer类 存在的情况下,SpeechRecognition才能发挥其魔力。 Recognizer 的主要目的是识别语音,并读取不同语音的变体,然后驱动功能并验证来自音频源的语音。

要创建一个Recognizer,需要创建其实例。因此,请在Python解释器中输入以下代码。

  >>> r=sr.Recognizer()

有多种方法可以创建可以识别来自音频源的语音的Recognizer实例,具有API支持。下面列出了其中一些方法。

recognize_bing(): Microsoft Bing Speech

recognize_google(): Google Web Speech API

recognize_google_cloud(): Google Cloud Speech - requires 
installation of the google-cloud-speech package

recognize_houndify(): Houndify by SoundHound

recognize_ibm(): IBM Speech to Text

recognize_sphinx(): CMU Sphinx - requires installing PocketSphinx

recognize_wit(): Wit.ai

从这些软件包中,软件包 recognize_sphinx() 是为了离线工作,如果与 CMU Sphinx 引擎 一起使用。其余的软件包需要互联网连接才能工作。

注意:SpeechRecognition 中提供的默认密钥非常重要,请谨慎使用。默认密钥主要用于测试和安全目的,Google 可能会撤销它。因此,SpeechRecognition 有一个 API 接口,可以将这些默认密钥谨慎使用。

each_recognize_*( ) 方法可能会抛出一个名为 speech_recognition.RequestError 的异常。这可能是由于API无法访问,因为安装文件损坏。对于上面显示的其余方法,如果达到了他们的配额限制,或者服务器或网络连接有问题,可能会生成 RequestError 。可能会出现类似于以下内容的问题。

 Traceback (most recent call last):
  File "", line 1, in 
TypeError: recognize_google() missing 1 required positional argument: 'audio_data'

与音频文件一起使用

在使用Python中的SpeechRecognition包之前,您首先需要下载一个音频文件。SpeechRecognition通过将音频文件保存到当前正在运行的Python解释器的相同目录中,使得与音频文件一起工作变得容易。它使用AudioFile类来实现这一点。该类需要初始化并设置音频文件路径,以便上下文管理器提供一个良好的接口来读取文件和其内容。

支持的文件类型

SpeechRecognition支持的文件格式类型如下所示:

  1. WAV :格式必须为PCM/LPCM
  2. AIFF
  3. AIFF-C
  4. FLAC :格式必须为原生FLAC

如果您使用基于x-86的Windows、Linux或macOS,那么使用FLAC文件会更容易。除了这些操作系统,您可能需要安装一个FLAC编码器,这样您就可以访问命令行工具。

使用record()捕获数据

record()函数用于使用文件中的Python解释器捕获数据。例如,文件的名称为 harvard.wav ,对于编码这个方法的Python解释器代码如下所示。

  >>> hardvard = sr.AudioFile('harvard.wav')
 >>> with harvard as source:
         Audio = r.record(source)

该代码将打开上下文管理器以读取文件的内容,并将数据存储在名为 AudioFile 的实例 source 中。然后, record() 方法会记录文件中的真实数据。要确认数据是否已记录,可以使用以下代码进行检查。

  >>> type(audio)

或者,您也可以调用recognize_google()来识别音频。这可能取决于您的互联网速度、音频的捕获方式以及结果显示的秒数。

  >>> r.recognize_google(audio)

这段代码将转录文件中的所有数据,并将识别出的音频以文本格式写入。

捕获持续时间和分段偏移

考虑到您只想捕获文件中的特定片段的语音。方法can do that可通过识别持续时间关键字,后面跟着停止语音的参数来实现。例如,您可能需要从”harvard.wav”文件中捕获前5秒的语音;您可以使用下面给出的方法来实现。

  >>> with harvard as source:
          Audio = r.record(source, duration=5)
 >> >r.recognize_google(audio)

当在代码块中使用时,record()方法总是打算在文件流中前进。这通常意味着如果您第一次录制四秒钟的音频,录制将再次发生四秒钟,并返回第一个四秒钟的音频。以下代码片段可以说明这种现象。

  >>> with harvard as source:
...     audio1 = r.record(source, duration=4)
...     audio2 = r.record(source, duration=4)
...
>>> r.recognize_google(audio1)
'the stale smell of old beer lingers'

>>> r.recognize_google(audio2)
'it takes heat to bring out the odor a cold dip.'

您可以注意到audio2包含了音频的第三个阶段的一部分。有些情况下您可能需要指定持续时间,并且停止录制时可能会损害音频的透明度。另外,在指定record()方法时,您甚至可以使用偏移关键字参数来设置特定的起始点。起始点表示录制开始前的秒数。因此,要捕捉音频文件的第二个短语,您可以选择使用下面的方法,设置为5秒或3秒,具体取决于您的需求。

  >>> with harvard as source:
...     audio = r.record(source, offset=4, duration=3)
...
>>> r.recognize_google(audio)

重要性的持续时间和偏移关键字对于包含音频的文件的分割非常重要。如果您已经知道音频帧,可以迅速获得较差的转录结果。要可视化此效果,请使用以下代码并尝试使用python解释器操作。

>>> with harvard as source:
...     audio = r.record(source, offset=4.7, duration=2.8)
...
>>> r.recognize_google(audio)

以上的代码片段说明了录制从4.7秒开始,将错过开头的短语。同样地,当录制结束时,捕获的短语将与开头的短语不匹配。

导致不准确转录的短语被遗漏的另一个原因是噪音。上述代码可能有效,因为它是干净的音频,但在现实世界中没有噪音的地方。

噪音对语音识别的影响

没有地方是没有噪音的。所有的语音识别技术都已经被开发出来处理和去除语音中的不需要的噪音,这样可以提高捕获音频帧的能力。噪音会破坏应用程序的准确性。为了了解噪音对语音识别的影响,您需要下载一个名为” jackhammer.wav “的文件,并确保将其保存在解释器的工作目录中。假设该文件中大声说了短语” JavaTpoint是最好的Java培训站点 “,您需要在后台将其转录。为了做到这一点,考虑以下方法。

>>> jackhammer = sr.AudioFile('jackhammer.wav')
>>> with jackhammer as source:
...     audio = r.record(source)
...
>>> r.recognize_google(audio)

要处理噪音,在上述步骤之后尝试的另一种方法是使用 Recognizer类的adjust_for_ambient_noise()方法。

>>> with jackhammer as source:
...     r.adjust_for_ambient_noise(source)
...     audio = r.record(source)
...
>>> r.recognize_google(audio)

上面的代码片段缺少初始输出,输出时没有打印第一个单词。因此,当record()方法捕获音频时,音频文件的前一部分被消耗,而后面的数据被捕获。adjust_for_ambient_noise()方法读取音频文件的前一秒钟,声音识别器校准音频的噪声水平。

如果你想使用adjust_for_ambient_noise()来调整时间范围,你可以在代码片段中使用duration关键字,将其赋值为以秒为单位的数值。如果你不指定任何值,将以1作为默认值,但建议将值降低到0.5。以下代码片段展示了相同的技术。

>>> with jackhammer as source:
...     r.adjust_for_ambient_noise(source, duration=0.5)
...     audio = r.record(source)
...
>>> r.recognize_google(audio)

以上代码片段将返回之前错过的整个音频文件。然而,有些情况下噪音的处理或去除效果可能非常困难,因为信号可能太嘈杂以至于无法处理。

因此,为了解决这个问题,您可能需要采用其他技术对音频进行预处理。您可以使用音频编辑软件或者像 SciPy 这样的Python包来预处理音频文件并过滤噪音。

此外,在处理嘈杂的文件时,使用实际的API响应是很有帮助的,因为大多数API返回的是包含多个转录的JSON字符串。同样, recognize_google() 方法很可能返回类似的转录文件,除非强制要求返回完整的响应。可以通过使用某些参数和关键字(例如show_all)来实际实现这种方法,该方法返回recognize_google()方法的完整响应。

  >>> r.recognize_google(audio, show_all=True)
{'alternative': [
  {'transcript': 'javatpoint best is the programming site'}, 
  {'transcript': 'the javatpoint site is best programming'}, 
  {'transcript': 'javatpoint programming is the best site'},
  {'transcript': 'the programming is javatpoint best site'}, 
  {'transcript': 'best is the programming site javatpoint'}, 
], 'final': True}

在上述代码片段中, recognize_google() 方法返回一个包含alternative键的字典,该键指向上述显示的各种转录。虽然由于API之间的差异可能会导致响应结构具有不同的形式,但这主要用于调试。

到目前为止,您可能已经学会了Python语音识别及其包的基础知识。学习的下一阶段涉及通过从麦克风接收输入来转录音频文件,从而使项目更加交互性。

与麦克风输入一起工作

您可以使用SpeechRecognizer包访问麦克风,方法是安装一个名为 PyAudio 的包。为此,请保存当前更改并关闭解释器。继续安装 PyAudio ,过程与之前使用SpeechRecognizer的过程类似。

$ pip install pyaudio

安装完成后,为了测试它是否与您正在使用的语音识别器版本兼容,请输入以下命令。

$ python -m speech_recognizer

完成这一步骤后,您需要确保您的默认麦克风已打开并取消静音。如果您在安装和测试过程中没有遇到任何问题,您应该在终端上看到类似以下的内容。

A moment of silence, please?
Set minimum energy threshold to 600.4452854381937
Say something!

尝试用麦克风录入语音并测试SpeechRecognizer包如何转录你说的话。

麦克风类

麦克风类用于创建一个实例,以便系统能够识别来自源的音频文件。要使用这个类,你需要在另一个解释器会话中导入它,并创建一个识别器类,如下所示。

>>> import speech_recognizer as sr
>>> r.=sr.Recognizer()

您需要使用系统上的默认麦克风,而不是使用来自源的音频文件。您可以使用以下方法来实现。

>>> mic = sr.Microphone()

如果您无法识别系统的默认麦克风,可能需要指定其中一个设备索引。可以使用麦克风类中的 list_microphone_names() 方法获取所有可用麦克风名称的列表。

>>> sr.Microphone.list_microphone_names()
['HDA Intel PCH: ALC272 Analog (hw:0,0)',
 'HDA Intel PCH: HDMI 0 (hw:0,3)',
 'sysdefault',
 'front',
 'surround40',
 'surround51',
 'surround71',
 'hdmi',
 'pulse',
 'dmix', 
 'default']

上述代码中定义的设备索引被称为 索引 ,它包含系统上可用麦克风名称的列表。例如,在上面给出的输出中,名为”front”的麦克风位于列表中的索引3处。可以使用以下方法来实现这一点。

 >>> mic = sr.Microphone(device_index=3)

上面的代码只是一个示例,因此建议不要在解释器中运行。对于大多数项目,应该使用默认的系统麦克风。

使用listen()方法捕获麦克风输入

在这里你将学到的另一种方法是使用listen()方法来捕获从麦克风输入的内容。由于你已经创建了麦克风实例,现在是时候捕获一些输入了。就像大多数AudioFile类一样,麦克风也被视为上下文管理器。它通过接受第一个参数作为块来捕获来自源的输入,并记录直到麦克风检测到静音为止。为了更好地理解,让我们看看如何使用给定的代码来应用它。

  >>> with mic as source:
...     audio = r.listen(source)
...

一旦使用上述代码块执行,您应该尝试将一些内容说进麦克风并等待一段时间。解释器可能会提示在一段时间后显示结果。一旦你看到”>>>”作为返回提示,就可以确保 Recognizer 可以识别你说的话。

如果 Recognizer 未能返回提示,可能会有一些环境噪音干扰。您可以通过按下 Ctrl+C 来停止干扰。

为了调整您的语音中的噪音,您可能需要使用 Recognizer 类的 adjust_for_ambient_noise() 方法。由于麦克风输入与音频文件相比是不可预测的,因此在听取麦克风输入时始终执行这些操作是一个好主意。为了获得精确和无噪音的输出,您可以尝试使用 listen() 方法,如下所示。

  >>> with mic as source:
...     r.adjust_for_ambient_noise(source)
...     audio = r.listen(source)
...

在运行上述代码时,请等待几秒钟,使adjust_for_ambient Noise()方法执行其任务。编译和运行代码之后,尝试向麦克风说一些话,并等待解释器识别语音。如果它能够识别并返回提示,则表示它工作正常。

您还可以使用duration关键字,并尝试再次使用它来获取要识别的特定语音帧。与此同时,SpeechRecognizer文档建议使用duration关键字,如果duration关键字的持续时间为0.5或更短。您可能还会发现,在某些情况下并未使用duration关键字,因此将其作为生成更好结果的默认值之一。此外,值得注意的是最小值可能取决于麦克风环境的输入。因此,一秒的持续时间被认为最适合此类任务。

不能识别的语音

通过使用麦克风在解释器中创建了一些难以理解的噪音,有可能会收到如下错误。

  Traceback (most recent call last):
  File "", line 1, in 
  File 

"/home/david/real_python/speech_recognition_primer/venv/lib/pyth
on3.5/site-packages/speech_recognition/__init__.py", line 858, in recognize_google
if not isinstance(actual_result, dict) or 
len(actual_result.get("alternative", [])) == 0: raise 
UnknownValueError()
speech_recognition.UnknownValueError

这个错误是因为通过麦克风捕获的语音输入无法被识别,因此API代码库还不足以转录这些短暂的咕哝声或声音。也有可能是解释器通过识别当前输入而显示出与通过麦克风捕获的内容完全不同的东西。因此,像鼓掌、点击或其他杆类活动可能会引发异常或没有正确的输出。

总结

在这个关于Python语音识别的长教程中,你学会了从头开始创建计划的工作方式。你从概念知识到实践经验都涵盖了,可以创建一个实时且简单的Python语音识别器,它可以听到你的语音并在控制台上以文本格式显示出来。你还学会了一些处理使用SpeechRecognizer包时常见问题的关键方法,并学会了如何纠正这些问题。由于Python是广泛使用的编程和脚本语言,它的环境库和框架显示了它能够用几行简单易读的代码处理关键问题的能力,所以它覆盖了大多数语音识别应用。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程