Python语音识别 Python分析时间序列数据 Python启发式搜索 在本章中,我们将学习使用AI和Python进行语音识别。 言语是成人人际交往的最基本手段。语音处理的基本目标是提供人与机器之间的交互。 语音处理系统主要有三个任务 - 首先 ,语音识别允许机器捕捉我们说的单词,短语和句子 第二 ,自然语言处理,让机器了解我们所说的话,和 第三 ,语音合成让机器说话。 本章重点介绍 语音识别 ,即理解人类所说话语的过程。请记住,语音信号是在麦克风的帮助下捕获的,然后必须由系统理解。 构建语音识别器 语音识别或自动语音识别(ASR)是机器人等AI项目的关注焦点。没有ASR,就无法想象认知机器人与人交互。但是,构建语音识别器并不容易。 开发语音识别系统的困难 开发高质量的语音识别系统确实是一个难题。语音识别技术的难度可以沿着如下所述的多个维度进行广泛表征 - 词汇量的 大小 - 词汇量的 大小会影响ASR的开发。考虑以下大小的词汇表以便更好地理解。 例如,在语音菜单系统中,小型词汇表由2-100个单词组成 例如,在数据库检索任务中,中等大小的词汇表由几个100到1,000个单词组成 大型词汇表由几万个单词组成,如一般的听写任务。 请注意,词汇量越大,执行识别就越困难。 渠道特征 - 渠道质量也是一个重要方面。 例如,人类语音包含具有全频率范围的高带宽,而电话语音包括具有有限频率范围的低带宽。请注意,后者更难。 说话模式 - 易于开发ASR还取决于说话模式,即语音是处于隔离字模式,连接字模式还是连续语音模式。 请注意,连续语音难以识别。 口语风格 - 朗读演讲可以采用正式风格,也可以采用休闲风格自发和对话。 后者更难以识别。 说话者依赖 - 语音可以是说话者相关的,说话者自适应的或说话者独立的 独立的扬声器是最难建立的。 噪声类型 - 噪声是开发ASR时需要考虑的另一个因素。 信噪比可能在不同的范围内,具体取决于观察较少的声学环境与较多的背景噪声 - 如果信噪比大于30dB,则认为是高范围 如果信噪比介于30dB到10db之间,则认为是中等SNR 如果信噪比小于10dB,则认为是低范围 例如,诸如静止,非人类噪声,背景语音和其他扬声器的串扰之类的背景噪声也会导致问题的困难。 麦克风特性 - 麦克风 的质量可能很好,平均或低于平均水平。此外,嘴和微型电话之间的距离可能会有所不同。识别系统也应考虑这些因素。 尽管存在这些困难,研究人员仍然在语音的各个方面进行了大量工作,例如理解语音信号,说话者和识别口音。 您必须按照下面给出的步骤构建语音识别器 - 可视化音频信号 - 从文件读取并处理它 这是构建语音识别系统的第一步,因为它可以理解音频信号的结构。使用音频信号可以遵循的一些常见步骤如下 - 记录 当您必须从文件中读取音频信号时,首先使用麦克风录制它。 采样 使用麦克风录制时,信号以数字化形式存储。但是要对它进行处理,机器需要它们以离散的数字形式。因此,我们应该以特定频率进行采样并将信号转换为离散数字形式。选择高频采样意味着当人们听到信号时,他们会将其视为连续的音频信号。 例 以下示例显示了使用Python分析音频信号的逐步方法,该方法存储在文件中。该音频信号的频率为44,100HZ。 导入必要的包,如下所示 - 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) 现在,打印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() 根据上述步骤,您可以观察到以下输出:图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: 例如,如果你说 codingdict.com ,那么系统会正确识别它,如下所示 codingdict.com Python分析时间序列数据 Python启发式搜索