- Python AI 教程
- 首页
- Python AI – 基础概念
- Python AI – 入门
- Python AI – 机器学习
- Python AI – 数据准备
- 监督学习:分类
- 监督学习:回归
- Python AI – 逻辑编程
- 无监督学习:聚类
- 自然语言处理
- Python AI – NLTK 包
- 分析时间序列数据
- Python AI – 语音识别
- Python AI – 启发式搜索
- Python AI – 游戏
- Python AI – 神经网络
- 强化学习
- Python AI – 遗传算法
- Python AI – 计算机视觉
- Python AI – 深度学习
- Python AI 资源
- Python AI – 快速指南
- Python AI – 有用资源
- Python AI – 讨论
Python AI – 语音识别
在本章中,我们将学习如何使用 Python AI 进行语音识别。
语音是成年人最基本的交流方式。语音处理的基本目标是在人与机器之间建立互动。
语音处理系统主要有三个任务:
**首先**,语音识别,允许机器捕捉我们所说的单词、短语和句子
**其次**,自然语言处理,允许机器理解我们所说的内容,以及
**第三**,语音合成,允许机器说话。
本章重点介绍**语音识别**,即理解人类所说的话语的过程。请记住,语音信号是借助麦克风捕捉的,然后系统必须理解它。
构建语音识别器
语音识别或自动语音识别 (ASR) 是机器人等 AI 项目关注的焦点。如果没有 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 语音 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)
现在,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