在本章中,我們將學習如何使用帶有Python的AI進行語音識別。
言語是成人最基本的交際手段。語音處理的基本目標是提供人與機器之間的交互。
語音處理系統主要有三個任務:負;
首先是語音識別,它允許機器捕捉我們所說的單詞、短語和句子
第二種是自然語言處理,允許機器理解我們所說的內容,以及
第三個是語音合成,允許機器講話。
本章主要介紹語音識別,即理解人類所說的單詞的過程。記住,語音信號是在麥克風的幫助下捕獲的,然後系統必須能夠理解。
Building a Speech Recognizer
語音識別或自動語音識別(ASR)是像機器人技術這樣的人工智慧項目的關注中心。沒有ASR,就不可能想像一個認知機器人與人類互動。然而,建立一個語音識別器並不容易。
Difficulties in developing a speech recognition system
開發一個高質量的語音識別系統確實是一個難題。語音識別技術的困難可以從以下幾個方面來概括;
詞彙量的大小會影響ASR的開發。爲了更好的理解,請考慮下列詞彙量。
小型詞彙表由2-100個單詞組成,例如在語音菜單系統中
中等大小的詞彙表由幾個100到1000個單詞組成,例如,在資料庫檢索任務中
一個大的詞彙表由成千上萬個單詞組成,如在一般的聽寫任務中。
信道特性也是一個重要的維度。例如,人類語音包含全頻段的高帶寬,而電話語音包含有限頻段的低帶寬。注意,後者更難。
口語模式−開發ASR的難易程度還取決於口語模式,即語音是處於孤立詞模式、連接詞模式還是處於連續語音模式。注意,連續的講話很難辨認。
演講風格−閱讀演講可以是正式的風格,也可以是自發的、隨意的對話風格。後者更難識別。
揚聲器相關性−語音可以是揚聲器相關、揚聲器自適應或揚聲器無關。獨立於說話人是最難建立的。
噪聲類型−噪聲是開發ASR時要考慮的另一個因素。信噪比可以在不同的範圍內,這取決於觀察到的背景噪聲越少的聲環境;
如果信噪比大於30dB,則視爲高範圍
如果信噪比在30dB到10db之間,則認爲是中等信噪比
如果信噪比小於10dB,則視爲低範圍
麥克風特性&負;麥克風的質量可能是好的、一般的或低於平均值。此外,嘴巴和手機之間的距離也可能不同。識別系統也應考慮這些因素。
注意,詞彙量越大,識別就越困難。
例如,背景噪聲的類型,如靜止噪聲、非人爲噪聲、背景語音和其他揚聲器的串擾,也導致了問題的難度。
儘管有這些困難,研究人員還是在語音的各個方面做了很多工作,如理解語音信號、說話人和識別口音。
您必須按照下面給出的步驟來構建語音識別器;
Visualizing Audio Signals - Reading from a File and Working on it
這是建立語音識別系統的第一步,因爲它使我們了解音頻信號是如何構成的。使用音頻信號可以遵循的一些常見步驟如下所示;
Recording
當你必須從文件中讀取音頻信號時,首先用麥克風錄製。
Sampling
使用麥克風錄音時,信號以數位化形式存儲。但要對其進行操作,機器需要離散的數字形式。因此,我們應該在一定的頻率下進行採樣,並將信號轉換成離散的數值形式。選擇高頻率進行採樣意味著當人類聽到信號時,他們會感覺到它是一個連續的音頻信號。
Example
下面的示例演示了使用存儲在文件中的Python逐步分析音頻信號的方法。這個音頻信號的頻率是44100赫茲。
如圖所示導入必要的包;
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
Characterizing the Audio Signal: Transforming to Frequency Domain
表徵音頻信號涉及將時域信號轉換爲頻域,並通過了解其頻率成分。這是一個重要的步驟,因爲它提供了很多關於信號的信息。您可以使用像Fourier Transform這樣的數學工具來執行此轉換。
Example
下面的示例一步一步地演示如何使用存儲在文件中的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()
您可以觀察上面代碼的輸出圖,如下圖所示;
Generating Monotone Audio Signal
到目前爲止,你所看到的兩個步驟對於了解信號很重要。現在,如果您想用一些預定義的參數生成音頻信號,此步驟將非常有用。請注意,此步驟將音頻信號保存在輸出文件中。
Example
在下面的示例中,我們將使用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()
你可以觀察圖中所示的情節;
Feature Extraction from Speech
這是建立語音識別器最重要的一步,因爲將語音信號轉換到頻域後,必須將其轉換成可用的特徵向量形式。爲此,我們可以使用不同的特徵提取技術,如MFCC、PLP、PLP-RASTA等。
Example
在下面的例子中,我們將通過使用MFCC技術,使用Python一步一步地從signal中提取特性。
導入必要的包,如這裡所示&負;
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特性。
filterbank_features = filterbank_features.T plt.matshow(filterbank_features) plt.title('Filter bank') plt.show()
通過以上步驟,您可以觀察到以下輸出:圖1爲MFCC,圖2爲濾波器組
Recognition of Spoken Words
Speech recognition means that when humans are speaking, a machine understands it. Here we are using Google Speech API in Python to make it happen. We need to install the following packages for this −
Pyaudio − It can be installed by using pip install Pyaudio command.
SpeechRecognition − This package can be installed by using pip install SpeechRecognition.
Google Speech API−可以使用命令安裝Google API python client。
Example
觀察下面的例子,了解口語的識別;
如圖所示進口必要的包裝;
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)
現在,google API將識別語音並給出輸出。
try: print("You said: \n" + recording.recognize_google(audio)) except Exception as e: print(e)
您可以看到下面的輸出&負;
Please Say Something: You said: