Artificial Intelligence With Python 简明教程
AI with Python – Speech Recognition
在本章中,我们将学习使用 Python 中的 AI 进行语音识别。
语音是成人人类交流最基本的手段。语音处理的基本目标是提供人与机器之间的交互。
语音处理系统主要有三个任务 −
-
First ,语音识别,它允许机器理解我们所说的单词、短语和句子。
-
Second ,自然语言处理,它允许机器理解我们所说的内容,以及
-
Third ,语音合成,它允许机器说话。
本章重点介绍 speech recognition ,即理解人类说出的单词的过程。请记住,语音信号是借助麦克风捕获的,然后系统必须理解它。
Building a Speech Recognizer
语音识别或自动语音识别 (ASR) 是机器人技术等人工智能项目的关注中心。没有 ASR,就无法想象认知机器人与人类之间的互动。然而,构建语音识别器并非易事。
Difficulties in developing a speech recognition system
开发一个高质量的语音识别系统是一个艰巨的任务。语音识别技术的困难性可以沿着以下讨论的多个层面进行概括。
-
Size of the vocabulary ——词汇量大小影响 ASR 的开发难度。考虑以下词汇量大小以加深理解。
-
Channel characteristics ——信道质量也是一个重要方面。例如,人类语音包含全频段的高带宽,而电话语音包含限频段的低带宽。请注意,后者更困难。
-
Speaking mode ——ASR 的开发难度还取决于说话方式,即语音是否为孤立词模式、连接词模式还是持续语音模式。请注意,连续语音更难识别。
-
Speaking style ——朗读的语音可能是正式风格,也可能是即兴的会话日常风格。后者更难识别。
-
Speaker dependency ——语音可以是说话者相关、说话者适应性或说话者无关的。说话者无关是最难构建的。
-
Type of noise ——噪声是开发 ASR 时需要考虑的另一个因素。信噪比可能在不同范围内,具体取决于观察到的背景噪声较少或较多的声学环境。
-
Microphone characteristics ——麦克风质量可能是好的、一般的或低于一般的。此外,嘴与麦克风之间的距离也会有所不同。识别系统也应考虑这些因素。
尽管有这些困难,研究人员在语音理解语音信号、说话者和识别口音等各个方面的开展了大量工作。
若要构建语音识别器,您需要遵循以下步骤。
Visualizing Audio Signals - Reading from a File and Working on it
这是构建语音识别系统的第一步,因为它可以理解音频信号的结构。可以用来处理音频信号的一些常见步骤如下——
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()
您会看到上面音频信号的输出图表和提取的数据,如下图所示
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()
您可以观察到上面代码的输出图表,如下图所示 -
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()
你可以观察到在此处给出的图像中的绘图 −
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
Recognition of Spoken Words
语音识别意味着当人类说话时,机器会理解它。在这里,我们使用 Python 中的 Google 语音 API 来实现它。我们需要为此安装以下包 -
-
Pyaudio - 可以使用 pip install Pyaudio 命令进行安装。
-
SpeechRecognition - 可以使用 pip install SpeechRecognition. 安装此包
-
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