在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 語音識(shí)別
人工智能開發(fā)環(huán)境配置
計(jì)算機(jī)視覺
啟發(fā)式搜索
人工智能監(jiān)督學(xué)習(xí)(回歸)
賭勝負(fù)
強(qiáng)化學(xué)習(xí)
人工智能無監(jiān)督學(xué)習(xí):聚類
人工智能入門概念
深度學(xué)習(xí)
NLTK包
人工智能(Python)教程
神經(jīng)網(wǎng)絡(luò)
自然語言處理
人工智能邏輯編程
遺傳算法
人工智能監(jiān)督學(xué)習(xí)(分類)
人工智能數(shù)據(jù)準(zhǔn)備
人工智能機(jī)器學(xué)習(xí)
語音識(shí)別
分析時(shí)間序列數(shù)據(jù)

語音識(shí)別

在本章中,我們將學(xué)習(xí)使用AI和Python進(jìn)行語音識(shí)別。
言語是成人人際溝通的最基本手段。 語音處理的基本目標(biāo)是提供人與機(jī)器之間的交互。
語音處理系統(tǒng)主要有三項(xiàng)任務(wù) -

  • 首先,語音識(shí)別允許機(jī)器捕捉我們所說的單詞,短語和句子
  • 其次,自然語言處理使機(jī)器能夠理解我們所說的話
  • 第三,語音合成允許機(jī)器說話。

本章重點(diǎn)講述語音識(shí)別,理解人類說話的過程。 請(qǐng)記住,在麥克風(fēng)的幫助下捕捉語音信號(hào),然后系統(tǒng)才能理解它。

構(gòu)建語音識(shí)別器

語音識(shí)別或自動(dòng)語音識(shí)別(ASR)是AI機(jī)器人等AI項(xiàng)目的關(guān)注焦點(diǎn)。 沒有ASR,就不可能想象一個(gè)認(rèn)知機(jī)器人與人進(jìn)行交互。 但是,構(gòu)建語音識(shí)別器并不容易。

開發(fā)語音識(shí)別系統(tǒng)的困難
開發(fā)高質(zhì)量的語音識(shí)別系統(tǒng)確實(shí)是一個(gè)難題。 語音識(shí)別技術(shù)的困難可以廣泛地表征為如下所討論的許多維度 -

  • 詞匯大小 - 詞匯大小影響開發(fā)ASR的難易程度??紤]以下詞匯量以便更好地理解。
    • 例如,在一個(gè)語音菜單系統(tǒng)中,一個(gè)小詞匯由2到100個(gè)單詞組成
    • 例如,在數(shù)據(jù)庫檢索任務(wù)中,中等大小的詞匯包含幾個(gè)100到1000個(gè)單詞
    • 一個(gè)大的詞匯由幾萬個(gè)單詞組成,如在一般的聽寫任務(wù)中。
  • 信道特性 - 信道質(zhì)量也是一個(gè)重要的維度。 例如,人類語音包含全頻率范圍的高帶寬,而電話語音包含頻率范圍有限的低帶寬。 請(qǐng)注意,后者更難。
  • 說話模式 - 輕松開發(fā)ASR還取決于說話模式,即語音是處于孤立詞模式還是連接詞模式,還是處于連續(xù)語音模式。 請(qǐng)注意,連續(xù)說話很難辨認(rèn)。

  • 口語風(fēng)格 - 閱讀說話可以采用正式風(fēng)格,也可以采用自發(fā)風(fēng)格和對(duì)話風(fēng)格。 后者更難以識(shí)別。

  • 揚(yáng)聲器依賴性 - 語音可以依賴揚(yáng)聲器,揚(yáng)聲器自適應(yīng)或揚(yáng)聲器獨(dú)立。 獨(dú)立發(fā)言人是最難建立的。
  • 噪音類型 - 噪音是開發(fā)ASR時(shí)需要考慮的另一個(gè)因素。 信噪比可以在各種范圍內(nèi),這取決于觀察較少的聲學(xué)環(huán)境與較多的背景噪聲 -
    • 如果信噪比大于30dB,則認(rèn)為是高范圍
    • 如果信噪比在30dB到10db之間,則認(rèn)為是中等信噪比
    • 如果信噪比小于10dB,則認(rèn)為是低范圍
  • 麥克風(fēng)特性 - 麥克風(fēng)的質(zhì)量可能很好,平均水平或低于平均水平。 此外,嘴和微型電話之間的距離可能會(huì)有所不同。 識(shí)別系統(tǒng)也應(yīng)考慮這些因素。

盡管存在這些困難,研究人員在語音的各個(gè)方面做了很多工作,例如理解語音信號(hào),說話人以及識(shí)別口音。

所以,需要按照以下步驟構(gòu)建語音識(shí)別器 -

可視化音頻信號(hào) - 從文件讀取并進(jìn)行處理

這是構(gòu)建語音識(shí)別系統(tǒng)的第一步,因?yàn)樗梢詭椭斫庖纛l信號(hào)的結(jié)構(gòu)。 處理音頻信號(hào)可遵循的一些常見步驟如下所示 -

記錄
當(dāng)必須從文件中讀取音頻信號(hào)時(shí),首先使用麥克風(fēng)錄制。

采樣
用麥克風(fēng)錄音時(shí),信號(hào)以數(shù)字形式存儲(chǔ)。 但為了解決這個(gè)問題,機(jī)器需要使用離散數(shù)字形式。 因此,我們應(yīng)該以某個(gè)頻率進(jìn)行采樣,并將信號(hào)轉(zhuǎn)換為離散數(shù)字形式。 選擇高頻采樣意味著當(dāng)人類聽到信號(hào)時(shí),他們會(huì)感覺它是一個(gè)連續(xù)的音頻信號(hào)。

示例

以下示例顯示了使用Python存儲(chǔ)在文件中的逐步分析音頻信號(hào)的方法。 這個(gè)音頻信號(hào)的頻率是44,100HZ。

下面導(dǎo)入必要的軟件包 -

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

現(xiàn)在,讀取存儲(chǔ)的音頻文件。 它會(huì)返回兩個(gè)值:采樣頻率和音頻信號(hào)。 提供存儲(chǔ)音頻文件的路徑,如下所示 -

frequency_sampling, audio_signal = wavfile.read("/Users/admin/audio_file.wav")

使用顯示的命令顯示音頻信號(hào)的采樣頻率,信號(hào)的數(shù)據(jù)類型及其持續(xù)時(shí)間等參數(shù) -

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')

這一步涉及如下所示對(duì)信號(hào)進(jìn)行標(biāo)準(zhǔn)化 -

audio_signal = audio_signal / np.power(2, 15)

在這一步中,從這個(gè)信號(hào)中提取出前100個(gè)值進(jìn)行可視化。 為此目的使用以下命令 -

audio_signal = audio_signal [:100]
time_axis = 1000 * np.arange(0, len(signal), 1) / float(frequency_sampling)

現(xiàn)在,使用下面給出的命令可視化信號(hào) -

plt.plot(time_axis, signal, color='blue')
plt.xlabel('Time (milliseconds)')
plt.ylabel('Amplitude')
plt.title('Input audio signal')
plt.show()

下面輸出圖形是上述音頻信號(hào)提取的數(shù)據(jù),如圖所示 -

Signal shape: (132300,)
Signal Datatype: int16
Signal duration: 3.0 seconds

表征音頻信號(hào):轉(zhuǎn)換到頻域

表征音頻信號(hào)涉及將時(shí)域信號(hào)轉(zhuǎn)換為頻域,并通過以下方式理解其頻率分量。 這是一個(gè)重要的步驟,因?yàn)樗峁┝岁P(guān)于信號(hào)的大量信息。 可以使用像傅立葉變換這樣的數(shù)學(xué)工具來執(zhí)行此轉(zhuǎn)換。

示例

以下示例將逐步說明如何使用存儲(chǔ)在文件中的Python來表征信號(hào)。 請(qǐng)注意,這里使用傅里葉變換數(shù)學(xué)工具將其轉(zhuǎn)換為頻域。

導(dǎo)入必要的軟件包,如下所示 -

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

現(xiàn)在,讀取存儲(chǔ)的音頻文件。 它會(huì)返回兩個(gè)值:采樣頻率和音頻信號(hào)。 提供存儲(chǔ)音頻文件的路徑,如命令所示 -

frequency_sampling, audio_signal = wavfile.read("/Users/admin/sample.wav")

在這一步中,將使用下面給出的命令顯示音頻信號(hào)的采樣頻率,信號(hào)的數(shù)據(jù)類型和持續(xù)時(shí)間等參數(shù) -

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')

在這一步中,我們需要對(duì)信號(hào)進(jìn)行標(biāo)準(zhǔn)化,如下面的命令所示 -

audio_signal = audio_signal / np.power(2, 15)

這一步涉及提取信號(hào)的長度和半長。使用以下命令 -

length_signal = len(audio_signal)
half_length = np.ceil((length_signal + 1) / 2.0).astype(np.int)

現(xiàn)在,需要應(yīng)用數(shù)學(xué)工具來轉(zhuǎn)換到頻域。 這里使用傅里葉變換。

signal_frequency = np.fft.fft(audio_signal)

現(xiàn)在,進(jìn)行頻域信號(hào)的歸一化并將其平方 -

signal_frequency = abs(signal_frequency[0:half_length]) / length_signal
signal_frequency **= 2

接下來,提取頻率變換信號(hào)的長度和一半長度 -

len_fts = len(signal_frequency)

請(qǐng)注意,傅里葉變換信號(hào)必須針對(duì)奇偶情況進(jìn)行調(diào)整。

if length_signal % 2:
   signal_frequency[1:len_fts] *= 2
else:
   signal_frequency[1:len_fts-1] *= 2

現(xiàn)在,以分貝(dB)為單位提取功率 -

signal_power = 10 * np.log10(signal_frequency)

調(diào)整X軸的以kHz為單位的頻率 -

x_axis = np.arange(0, len_half, 1) * (frequency_sampling / length_signal) / 1000.0

現(xiàn)在,將信號(hào)的特征可視化如下 -

plt.figure()
plt.plot(x_axis, signal_power, color='black')
plt.xlabel('Frequency (kHz)')
plt.ylabel('Signal power (dB)')
plt.show()

可以觀察上面代碼的輸出圖形,如下圖所示 -

生成單調(diào)音頻信號(hào)

到目前為止你所看到的兩個(gè)步驟對(duì)于了解信號(hào)很重要。 現(xiàn)在,如果要使用某些預(yù)定義參數(shù)生成音頻信號(hào),此步驟將很有用。 請(qǐng)注意,此步驟會(huì)將音頻信號(hào)保存在輸出文件中。

示例

在下面的例子中,我們將使用Python生成一個(gè)單調(diào)信號(hào),它將被存儲(chǔ)在一個(gè)文件中。需要采取以下步驟 -

導(dǎo)入必要的軟件包 -

import numpy as np
import matplotlib.pyplot as plt
from scipy.io.wavfile import write

指定輸出保存的文件 -

output_file = 'audio_signal_generated.wav'

現(xiàn)在,指定選擇的參數(shù),如圖所示 -

duration = 4 # in seconds
frequency_sampling = 44100 # in Hz
frequency_tone = 784
min_val = -4 * np.pi
max_val = 4 * np.pi

在這一步中,我們可以生成音頻信號(hào),如下代碼所示 -

t = np.linspace(min_val, max_val, duration * frequency_sampling)
audio_signal = np.sin(2 * np.pi * tone_freq * t)

現(xiàn)在,將音頻文件保存在輸出文件中 -

write(output_file, frequency_sampling, signal_scaled)

如圖所示,提取圖形的前100個(gè)值 -

audio_signal = audio_signal[:100]
time_axis = 1000 * np.arange(0, len(signal), 1) / float(sampling_freq)

現(xiàn)在,將生成的音頻信號(hào)可視化如下 -

plt.plot(time_axis, signal, color='blue')
plt.xlabel('Time in milliseconds')
plt.ylabel('Amplitude')
plt.title('Generated audio signal')
plt.show()

可以觀察這里給出的圖形 -

語音特征提取

這是構(gòu)建語音識(shí)別器的最重要步驟,因?yàn)樵趯⒄Z音信號(hào)轉(zhuǎn)換為頻域后,我們必須將其轉(zhuǎn)換為可用的特征向量形式。 可以為此使用不同的特征提取技術(shù),如MFCC,PLP,PLP-RASTA等。

示例

在以下示例中,我們將使用MFCC技術(shù)逐步使用Python從信號(hào)中提取特征。

導(dǎo)入必要的軟件包,如下所示 -

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
from python_speech_features import mfcc, logfbank

現(xiàn)在,讀取存儲(chǔ)的音頻文件。 它會(huì)返回兩個(gè)值 - 采樣頻率和音頻信號(hào)。 提供存儲(chǔ)音頻文件的路徑。

frequency_sampling, audio_signal = wavfile.read("/Users/admin/audio_file.wav")

請(qǐng)注意,在此首先抽取15000個(gè)樣本進(jìn)行分析。

audio_signal = audio_signal[:15000]

使用MFCC技術(shù)并執(zhí)行以下命令來提取MFCC特征 -

features_mfcc = mfcc(audio_signal, frequency_sampling)

現(xiàn)在,打印MFCC參數(shù),如下所示 -

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)

現(xiàn)在,打印過濾器組參數(shù)。

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()

根據(jù)上述步驟,您可以觀察到以下輸出:圖1為MFCC,圖2為過濾器組。

口語詞的識(shí)別

語音識(shí)別意味著當(dāng)人們說話時(shí),機(jī)器就會(huì)理解它。 這里使用Python中的Google Speech API來實(shí)現(xiàn)它。 需要為此安裝以下軟件包 -

  • Pyaudio - 它可以通過使用pip安裝Pyaudio命令進(jìn)行安裝。
  • SpeechRecognition - 這個(gè)軟件包可以通過使用pip install SpeechRecognition進(jìn)行安裝。
  • Google-Speech-API - 可以使用命令pip install google-api-python-client進(jìn)行安裝。

實(shí)例

觀察下面的例子來理解口語的識(shí)別。如下所示導(dǎo)入必要的軟件包 -

import speech_recognition as sr

創(chuàng)建一個(gè)對(duì)象,如下所示 -

recording = sr.Recognizer()

現(xiàn)在,Microphone()模塊將把語音作為輸入 -

with sr.Microphone() as source: recording.adjust_for_ambient_noise(source)
   print("Please Say something:")
   audio = recording.listen(source)

現(xiàn)在谷歌API會(huì)識(shí)別語音并提供輸出。

try:
   print("You said: \n" + recording.recognize_google(audio))
except Exception as e:
   print(e)

可以看到下面的輸出 -

Please Say Something:
You said:

例如,如果您說yiibai.com,那么系統(tǒng)會(huì)如下正確識(shí)別它 -

yiibai.com