在本章中,我们将学习使用AI和Python进行语音识别.
语音是成人人际交流的最基本手段.语音处理的基本目标是提供人与机器之间的交互.
语音处理系统主要有三个任务 :
首先,语音识别,允许机器捕捉我们说的单词,短语和句子
第二次,自然语言处理,让机器了解我们说的话,
第三次,语音合成让机器说话.
本章重点关注语音识别,理解人类所说话语的过程.请记住,语音信号是在麦克风的帮助下捕获的,然后必须由系统理解.
语音识别或自动语音识别(ASR)是机器人等AI项目的关注焦点.没有ASR,就不可能想象一个认知机器人与人交互.然而,构建语音识别器并不容易.
开发高质量的语音识别系统是真是一个难题.语音识别技术的难度可以广泛地表征为多个维度,如下所述 :
大小词汇 : 词汇量的大小会影响开发ASR的难易程度.考虑以下大小的词汇表以便更好地理解.
小型词汇表由2-100组成单词,例如,在语音菜单系统中
中等大小的词汇表包含几个100到1,000个单词,例如,数据库检索任务
大型词汇表由几万个单词组成,如一般的口述任务.
请注意,词汇量越大,执行识别的难度就越大.
频道特征 : 渠道质量也是一个重要方面.例如,人类语音包含具有全频率范围的高带宽,而电话语音包括具有有限频率范围的低带宽.请注意,后者更难.
说话模式 : 易于开发ASR还取决于说话模式,即语音是处于隔离字模式,还是连接字模式,还是处于连续语音模式.请注意,连续发言很难识别.
说话风格 : 阅读演讲可以采用正式风格,也可以是随意风格的自发和对话.后者更难识别.
演讲者依赖 : 语音可以取决于说话者,说话者自适应或独立于说话者.独立发言人是最难建立的.
噪音类型 : 噪声是开发ASR时需要考虑的另一个因素.信噪比可能在不同的范围内,取决于观察较少的声学环境与较多的背景噪声和减去;
如果信噪比大于30dB,则认为是高范围
如果信噪比介于30dB到10db之间,它被认为是中等信噪比
如果信噪比小于10dB,则认为是低范围
例如,背景噪音的类型,如静止,非人为噪音,背景语音和其他扬声器的串扰,也会导致问题的困难.
麦克风特征 : 麦克风的质量可能很好,平均或低于平均水平.此外,嘴和微型电话之间的距离可能会有所不同.这些因素也应该考虑用于识别系统.
尽管存在这些困难,研究人员还是在语言的各个方面做了大量工作,例如理解语音信号,说话者和识别重音符号.
您必须按照下面给出的步骤构建语音识别器 :
这是构建语音识别系统的第一步,因为它可以理解音频信号的结构.使用音频信号时可以遵循的一些常见步骤如下:
当您必须从a读取音频信号时文件,然后首先使用麦克风录制.
使用麦克风录制时,信号以数字化形式存储.但要对其进行处理,机器需要它们以离散的数字形式.因此,我们应该以特定频率进行采样并将信号转换为离散数字形式.选择高频采样意味着当人类听到信号时,他们会将其视为连续的音频信号.
以下示例显示了使用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)
调整频率,以kHz为单位表示X轴和减号;
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)
现在,sav e输出文件中的音频文件 :
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等.
在以下示例中,我们将使用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要素;&/p>
features_mfcc = features_mfcc.T plt.matshow(features_mfcc) plt.title('MFCC')
在此步骤中,我们使用过滤器库功能如图所示&减去;
提取过滤器库功能和减号;
filterbank_features = logfbank(audio_signal,frequency_sampling)
现在,打印filterbank参数.
打印('\ nFilter bank:\ nNumber of windows =',filterbank_features.shape [0]) print('每个特征的长度=',filterbank_features.shape [1])$ b $ b
现在,绘制并可视化滤波器组功能.
filterbank_features = filterbank_features.T plt.matshow(filterbank_features) plt.title('过滤银行') plt.show()
通过上述步骤,您可以观察到以下输出:图1表示MFCC,图2表示Fi lter Bank
演讲识别意味着当人类说话时,机器会理解它.我们在这里使用Python语音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()
现在,麦克风()模块将声音作为输入 :
with sr.Microphone() as source: recording.adjust_for_ambient_noise(source) print("Please Say something:") audio = recording.listen(source)
现在谷歌API会识别语音并给出输出.
try:你可以看到以下输出 :
Please Say Something: You said:
例如,如果您说 it1352.com ,那么系统会正确识别它,如下所示;
it1352.com