Artificial Intelligence With Python 简明教程

AI with Python – Speech Recognition

在本章中,我们将学习使用 Python 中的 AI 进行语音识别。

语音是成人人类交流最基本的手段。语音处理的基本目标是提供人与机器之间的交互。

语音处理系统主要有三个任务 −

  1. First ,语音识别,它允许机器理解我们所说的单词、短语和句子。

  2. Second ,自然语言处理,它允许机器理解我们所说的内容,以及

  3. Third ,语音合成,它允许机器说话。

本章重点介绍 speech recognition ,即理解人类说出的单词的过程。请记住,语音信号是借助麦克风捕获的,然后系统必须理解它。

Building a Speech Recognizer

语音识别或自动语音识别 (ASR) 是机器人技术等人工智能项目的关注中心。没有 ASR,就无法想象认知机器人与人类之间的互动。然而,构建语音识别器并非易事。

Difficulties in developing a speech recognition system

开发一个高质量的语音识别系统是一个艰巨的任务。语音识别技术的困难性可以沿着以下讨论的多个层面进行概括。

  1. Size of the vocabulary ——词汇量大小影响 ASR 的开发难度。考虑以下词汇量大小以加深理解。

  2. Channel characteristics ——信道质量也是一个重要方面。例如,人类语音包含全频段的高带宽,而电话语音包含限频段的低带宽。请注意,后者更困难。

  3. Speaking mode ——ASR 的开发难度还取决于说话方式,即语音是否为孤立词模式、连接词模式还是持续语音模式。请注意,连续语音更难识别。

  4. Speaking style ——朗读的语音可能是正式风格,也可能是即兴的会话日常风格。后者更难识别。

  5. Speaker dependency ——语音可以是说话者相关、说话者适应性或说话者无关的。说话者无关是最难构建的。

  6. Type of noise ——噪声是开发 ASR 时需要考虑的另一个因素。信噪比可能在不同范围内,具体取决于观察到的背景噪声较少或较多的声学环境。

  7. Microphone characteristics ——麦克风质量可能是好的、一般的或低于一般的。此外,嘴与麦克风之间的距离也会有所不同。识别系统也应考虑这些因素。

尽管有这些困难,研究人员在语音理解语音信号、说话者和识别口音等各个方面的开展了大量工作。

若要构建语音识别器,您需要遵循以下步骤。

Visualizing Audio Signals - Reading from a File and Working on it

这是构建语音识别系统的第一步,因为它可以理解音频信号的结构。可以用来处理音频信号的一些常见步骤如下——

Recording

当您需要从文件读取音频信号时,首先使用麦克风录制它。

Sampling

使用麦克风录制时,信号将以数字化形式存储。但要处理它,机器需要它们采用离散数字形式。因此,我们应该以特定频率对信号进行采样,并将信号转换为离散数字形式。选择较高的采样频率意味着当人类听到信号时,他们会感觉到这是一个连续的音频信号。

Example

以下示例展示了使用 Python 分析存储在文件中的音频信号的分步方法。此音频信号的频率为 44,100 HZ。

导入必要的程序包,如下所示——

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

现在,读取存储的音频文件。它将返回两个值:采样频率和音频信号。提供音频文件存储的路径,如下所示——

frequency_sampling, audio_signal = wavfile.read("/Users/admin/audio_file.wav")

使用所示的命令显示音频信号的采样频率、信号的数据类型及其持续时间等参数——

print('\nSignal shape:', audio_signal.shape)
print('Signal Datatype:', audio_signal.dtype)
print('Signal duration:', round(audio_signal.shape[0] /
float(frequency_sampling), 2), 'seconds')

此步骤涉及标准化信号,如下所示——

audio_signal = audio_signal / np.power(2, 15)

在此步骤中,我们从这个信号中提取前 100 个值进行可视化。为此,请使用以下命令 -

audio_signal = audio_signal [:100]
time_axis = 1000 * np.arange(0, len(signal), 1) / float(frequency_sampling)

现在,使用下面给出的命令可视化信号 -

plt.plot(time_axis, signal, color='blue')
plt.xlabel('Time (milliseconds)')
plt.ylabel('Amplitude')
plt.title('Input audio signal')
plt.show()

您会看到上面音频信号的输出图表和提取的数据,如下图所示

visualizing audio signals
Signal shape: (132300,)
Signal Datatype: int16
Signal duration: 3.0 seconds

Characterizing the Audio Signal: Transforming to Frequency Domain

音频信号的表征涉及将时域信号转换为频域,并通过以下方式理解其频率分量。这是一个重要的步骤,因为它提供了关于信号的大量信息。您可以使用诸如傅里叶变换之类的数学工具来执行此转换。

Example

以下示例逐步展示了如何使用 Python 表征存储在文件中的信号。请注意,此处我们使用傅立叶变换数学工具将其转换为频域。

导入必要的程序包,如下所示 -

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

现在,读取存储的音频文件。它将返回两个值:采样频率和音频信号。在命令中提供音频文件存储的路径,如下所示 -

frequency_sampling, audio_signal = wavfile.read("/Users/admin/sample.wav")

在此步骤中,我们将使用以下命令显示参数,如音频信号的采样频率、信号数据类型及其持续时间 -

print('\nSignal shape:', audio_signal.shape)
print('Signal Datatype:', audio_signal.dtype)
print('Signal duration:', round(audio_signal.shape[0] /
float(frequency_sampling), 2), 'seconds')

在此步骤中,我们需要对信号进行归一化,如下所示 -

audio_signal = audio_signal / np.power(2, 15)

此步骤涉及提取信号的长度和半长度。为此,请使用以下命令 -

length_signal = len(audio_signal)
half_length = np.ceil((length_signal + 1) / 2.0).astype(np.int)

现在,我们需要应用数学工具进行频域转换。这里我们使用傅立叶变换。

signal_frequency = np.fft.fft(audio_signal)

现在,对频域信号进行归一化并进行平方 -

signal_frequency = abs(signal_frequency[0:half_length]) / length_signal
signal_frequency **= 2

接下来,提取频率转换信号的长度和半长度 -

len_fts = len(signal_frequency)

请注意,必须对傅里叶转换的信号进行调整,以适用于偶数和奇数情况。

if length_signal % 2:
   signal_frequency[1:len_fts] *= 2
else:
   signal_frequency[1:len_fts-1] *= 2

现在,提取分贝 (dB) 中的功率 -

signal_power = 10 * np.log10(signal_frequency)

为 X 轴调整 kHz 中的频率 -

x_axis = np.arange(0, len_half, 1) * (frequency_sampling / length_signal) / 1000.0

现在,按以下方式可视化信号的表征 -

plt.figure()
plt.plot(x_axis, signal_power, color='black')
plt.xlabel('Frequency (kHz)')
plt.ylabel('Signal power (dB)')
plt.show()

您可以观察到上面代码的输出图表,如下图所示 -

characterizing audio signal

Generating Monotone Audio Signal

您迄今为止看到的两个步骤对于学习信号很重要。现在,如果您想要使用一些预定义的参数生成音频信号,此步骤将会很有用。请注意,此步骤将音频信号保存在输出文件中。

Example

在以下示例中,我们将使用 Python 生成一个单调信号,该信号将存储在一个文件中。为此,您需要执行以下步骤 −

导入必要的包,如下所示

import numpy as np
import matplotlib.pyplot as plt
from scipy.io.wavfile import write

提供输出文件应保存的文件

output_file = 'audio_signal_generated.wav'

现在,指定您选择的参数,如下所示

duration = 4 # in seconds
frequency_sampling = 44100 # in Hz
frequency_tone = 784
min_val = -4 * np.pi
max_val = 4 * np.pi

在此步骤中,我们可以生成音频信号,如下所示

t = np.linspace(min_val, max_val, duration * frequency_sampling)
audio_signal = np.sin(2 * np.pi * tone_freq * t)

现在,将音频文件保存在输出文件中−

write(output_file, frequency_sampling, signal_scaled)

为我们的图表提取前 100 个值,如下所示 −

audio_signal = audio_signal[:100]
time_axis = 1000 * np.arange(0, len(signal), 1) / float(sampling_freq)

现在,可视化生成的音频信号如下 −

plt.plot(time_axis, signal, color='blue')
plt.xlabel('Time in milliseconds')
plt.ylabel('Amplitude')
plt.title('Generated audio signal')
plt.show()

你可以观察到在此处给出的图像中的绘图 −

generating monotone audio signal

Feature Extraction from Speech

这是构建一个语音识别器中最重要的步骤,因为在将语音信号转换成频率域后,我们必须将其转换成可用的特征向量形式。我们可以使用不同的特征提取技术,如 MFCC、PLP、PLP-RASTA 等来实现此目的。

Example

在以下示例中,我们将逐步使用 Python,通过使用 MFCC 技术从信号中提取特征。

导入必要的程序包,如下所示 -

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
from python_speech_features import mfcc, logfbank

现在,读取存储的音频文件。它将返回两个值−采样频率和音频信号。提供存储音频文件的位置。

frequency_sampling, audio_signal = wavfile.read("/Users/admin/audio_file.wav")

请注意,这里我们正在获取前 15000 个样本进行分析。

audio_signal = audio_signal[:15000]

使用 MFCC 技术并执行以下命令以提取 MFCC 特征 −

features_mfcc = mfcc(audio_signal, frequency_sampling)

现在,打印 MFCC 参数,如下所示 −

print('\nMFCC:\nNumber of windows =', features_mfcc.shape[0])
print('Length of each feature =', features_mfcc.shape[1])

现在,使用以下给出的命令绘制并可视化 MFCC 特征 −

features_mfcc = features_mfcc.T
plt.matshow(features_mfcc)
plt.title('MFCC')

在此步骤中,我们使用滤波器组特征,如下所示

提取滤波器组特征 −

filterbank_features = logfbank(audio_signal, frequency_sampling)

现在,打印滤波器组参数。

print('\nFilter bank:\nNumber of windows =', filterbank_features.shape[0])
print('Length of each feature =', filterbank_features.shape[1])

现在,绘制和可视化滤波器组功能。

filterbank_features = filterbank_features.T
plt.matshow(filterbank_features)
plt.title('Filter bank')
plt.show()

由于上述步骤,您可以观察到以下输出:MFCC 的图 1 和滤波器组的图 2

feature extraction from speech
filter bank

Recognition of Spoken Words

语音识别意味着当人类说话时,机器会理解它。在这里,我们使用 Python 中的 Google 语音 API 来实现它。我们需要为此安装以下包 -

  1. Pyaudio - 可以使用 pip install Pyaudio 命令进行安装。

  2. SpeechRecognition - 可以使用 pip install SpeechRecognition. 安装此包

  3. Google-Speech-API - 可以使用命令 pip install google-api-python-client 进行安装。

Example

观察以下示例以了解如何识别口语 -

导入必要的包,如下所示

import speech_recognition as sr

创建一个对象,如下所示 -

recording = sr.Recognizer()

现在, Microphone() 模块将接受语音作为输入 -

with sr.Microphone() as source: recording.adjust_for_ambient_noise(source)
   print("Please Say something:")
   audio = recording.listen(source)

现在,Google API 将识别语音并给出输出。

try:
   print("You said: \n" + recording.recognize_google(audio))
except Exception as e:
   print(e)

您可以看到以下输出 -

Please Say Something:
You said:

例如,如果您说 tutorialspoint.com ,则系统会正确识别,如下所示 -

tutorialspoint.com