- 人工智能与 Python 教程
- 家
- AI 与 Python – 入门概念
- AI 与 Python – 入门
- AI 与 Python – 机器学习
- AI与Python——数据准备
- 监督学习:分类
- 监督学习:回归
- AI与Python——逻辑编程
- 无监督学习:聚类
- 自然语言处理
- AI 与 Python – NLTK 包
- 分析时间序列数据
- AI与Python——语音识别
- AI 与 Python – 启发式搜索
- AI 与 Python – 游戏
- 使用 Python 进行人工智能 – 神经网络
- 强化学习
- AI与Python——遗传算法
- 人工智能与Python——计算机视觉
- AI 与 Python – 深度学习
- 人工智能与 Python 资源
- AI 与 Python – 快速指南
- AI 与 Python – 有用的资源
- AI 与 Python – 讨论
AI与Python——语音识别
在本章中,我们将学习使用 AI 和 Python 进行语音识别。
言语是成年人人类交流最基本的手段。语音处理的基本目标是提供人与机器之间的交互。
语音处理系统主要有三个任务 -
首先,语音识别,让机器捕捉我们所说的单词、短语和句子
其次,自然语言处理让机器理解我们所说的话,以及
第三,语音合成,让机器说话。
本章重点介绍语音识别,即理解人类所说话语的过程。请记住,语音信号是在麦克风的帮助下捕获的,然后系统必须理解它。
构建语音识别器
语音识别或自动语音识别 (ASR) 是机器人等人工智能项目关注的焦点。如果没有 ASR,就无法想象认知机器人与人类互动。然而,构建语音识别器并不容易。
开发语音识别系统的困难
开发高质量的语音识别系统确实是一个难题。语音识别技术的难度可以从多个维度来概括,如下所述 -
词汇量- 词汇量影响开发 ASR 的难易程度。为了更好地理解,请考虑以下词汇量。
小词汇量由 2-100 个单词组成,例如在语音菜单系统中
例如,在数据库检索任务中,中等大小的词汇表由数百到数千个单词组成
与一般听写任务一样,大词汇量由数万个单词组成。
渠道特征- 渠道质量也是一个重要维度。例如,人类语音包含具有全频率范围的高带宽,而电话语音包含具有有限频率范围的低带宽。请注意,后者更难。
说话模式- 开发 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 等。
例子
在下面的示例中,我们将使用 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()
通过上述步骤,您可以观察到以下输出: 图 1 为 MFCC,图 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