📅  最后修改于: 2020-12-11 05:43:39             🧑  作者: Mango
在本章中,我们将学习使用AI和Python语音识别。
语音是成人交流的最基本手段。语音处理的基本目标是提供人与机器之间的交互。
语音处理系统主要有三个任务-
首先,语音识别使机器可以捕捉我们说的单词,短语和句子
其次,自然语言处理使机器能够理解我们所说的内容,并且
第三,语音合成让机器说话。
本章重点介绍语音识别,即理解人类所说单词的过程。请记住,语音信号是在麦克风的帮助下捕获的,然后系统必须理解它。
语音识别或自动语音识别(ASR)是诸如机器人技术之类的AI项目的关注重点。没有ASR,就无法想象认知机器人会与人互动。但是,构建语音识别器并不是一件容易的事。
开发高质量的语音识别系统确实是一个难题。语音识别技术的难点可以从多个方面大致表征,如下所述-
词汇量-词汇量影响开发ASR的难易程度。为了更好地理解,请考虑以下词汇量。
小型词汇表由2-100个单词组成,例如在语音菜单系统中
中等大小的词汇表包含几百到千个单词,例如在数据库检索任务中
与一般的听写任务一样,大型词汇表包含10,000个单词。
请注意,词汇量越大,识别就越困难。
频道特性-频道质量也是一个重要的维度。例如,人类语音包含具有整个频率范围的高带宽,而电话语音包含具有有限频率范围的低带宽。请注意,后者更难。
口语模式-开发ASR的难易程度还取决于口语模式,即语音是处于隔离单词模式,连接单词模式还是连续语音模式。请注意,连续语音很难识别。
演讲风格-阅读的演讲可以是正式的风格,也可以是自发的,也可以随意交谈。后者更难辨认。
说话者依赖性-语音可以是说话者依赖性,说话者自适应性或说话者无关性。独立于演讲者是最难建立的。
噪声类型-噪声是开发ASR时要考虑的另一个因素。信噪比可能在不同的范围内,具体取决于观察到的背景噪声多于背景噪声多的声学环境-
如果信噪比大于30dB,则认为是高范围
如果信噪比在30dB至10db之间,则认为是中等SNR
如果信噪比小于10dB,则认为是低范围
例如,背景噪声的类型,例如固定的,非人为的噪声,背景语音和其他说话者的串扰,也造成了问题的难度。
麦克风的特性–麦克风的质量可能良好,中等或低于平均水平。同样,嘴和麦克风之间的距离可能会有所不同。对于识别系统,也应考虑这些因素。
尽管存在这些困难,研究人员仍在语音的各个方面进行了大量工作,例如理解语音信号,说话者和识别口音。
您将必须按照以下给出的步骤来构建语音识别器-
这是构建语音识别系统的第一步,因为它可以了解音频信号的结构。使用音频信号可以遵循的一些常见步骤如下-
当您必须从文件中读取音频信号时,请先使用麦克风进行录制。
用麦克风录音时,信号以数字形式存储。但是要对其进行处理,机器需要离散数字形式的它们。因此,我们应该以一定的频率进行采样并将信号转换为离散的数值形式。选择高频进行采样意味着当人们收听信号时,他们会感觉到它是连续的音频信号。
以下示例显示了使用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
表征音频信号包括将时域信号转换为频域,并据此了解其频率成分。这是重要的一步,因为它提供了有关信号的大量信息。您可以使用诸如傅立叶变换这样的数学工具来执行此变换。
以下示例逐步显示了如何使用存储在文件中的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()
您可以观察到上面代码的输出图,如下图所示:
到目前为止,您已经看到的两个步骤对于了解信号非常重要。现在,如果要生成带有一些预定义参数的音频信号,此步骤将非常有用。请注意,此步骤会将音频信号保存在输出文件中。
在下面的示例中,我们将使用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()
您可以观察该图,如下图所示:
这是构建语音识别器的最重要步骤,因为在将语音信号转换到频域之后,我们必须将其转换为可用的特征向量形式。为此,我们可以使用不同的特征提取技术,例如MFCC,PLP,PLP-RASTA等。
在下面的示例中,我们将使用MFCC技术通过Python逐步从信号中提取特征。
导入必要的软件包,如下所示:
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)
现在,打印filterbank参数。
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和Filter Bank的图2
语音识别意味着当人们说话时,机器会理解它。在这里,我们使用Python的Google Speech API来实现它。我们需要为此安装以下软件包-
Pyaudio-可以使用pip install Pyaudio命令安装。
SpeechRecognition-可以使用pip install SpeechRecognition安装此软件包。
Google-Speech-API-可以使用命令pip install google-api-python-client进行安装。
观察以下示例以了解有关语音识别的知识-
如图所示导入必要的程序包-
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)
现在,谷歌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