你有沒有想過谷歌助手或者亞馬遜 Alexa 是如何識別你所說的一切的?你一定在想一些在監獄裏工作的複雜智能技術。除了識別系統的巨大技術增長在市場上大受歡迎之外,大多數蜂窩設備都通過一些內置應用或第三方應用具有語音識別功能。不一定;大多數這樣的語音識別系統都是在 python 包和庫的幫助下構建和部署的。在一定程度上,Python 已經證明了它是可預見的未來的一個重要方面。原因很明顯。要將語音識別納入 Python,您需要一定程度的交互性和可訪問性來匹配技術。
可訪問性的概念值得考慮,因為該識別允許老年人、身體殘疾者、或視障人與機器進行交互,並使用最先進的服務和產品快速解決他們的問題,而無需選擇隨機的圖形用戶界面應用。
在本文中,您將學習用 Python 創建語音識別系統。為了簡化理解它是如何構建的過程,本文旨在教您如何用更少的努力和更大的熱情來構建系統。但是在進入項目之前,讓我們談談作為開發人員需要了解的一些更重要的方面。
概述-它是如何工作的
在進入項目的細節和複雜之處之前,您將構建並花一點時間了解語音識別工作的基本概況。雖然沒有開始的先決條件,但是了解 python 編程語言的基礎是很好的。
語音識別從 1950 年貝爾實驗室進行的研究發展而來,僅限於單個說話者,詞彙數據庫有限。自從古代語音識別應用出現以來,現代語音識別應用已經取得了長足的進步。
說到演講的成分,第一個成分是演講。它必須從聲音轉換成可以通過麥克風傳播的信號,並可以轉換成數字數據。這是使用模數轉換器完成的。一旦數據的形式被數字化,幾個經過訓練的模型可以很容易地將音頻轉錄成文本。
現代語音識別器依賴於鮮為人知的隱馬爾可夫模型的概念。該方法基於當語音信號持續一小段時間(比如 5 毫秒)時為其制定的假設,並且可以被稱為平穩過程,即基於不隨時間變化的統計的過程。
在典型的 HMM 中,語音的默認信號劃分大約是十毫秒劃分成各種片段。每個片段的功率譜有助於信號繪製一個函數,併產生一個頻率,該頻率隨後被映射到實數向量,稱為倒譜係數。映射向量的維度非常小,與一些精確系統相比只有 10 個維度,精確系統的維度可能接觸 32 或更多。隱馬爾可夫模型生成的最終輸出以向量序列的形式出現。
向量組在藉助音素(語音的基本單位)將語音解碼成文本中起着重要作用。音素的計算取決於訓練,因為存在說話者變化,並且即使對於同一說話者,話語有時也是不同的。因此,為了解決這個問題,考慮了一種特殊的算法來確定產生音素序列的最相關的單詞。
就計算而言,你剛剛學習的整個過程相當昂貴。神經網絡用於在現代語音識別系統中變換特徵和維度,減少了對 HMM 的需求。此外,語音活動檢測器 (VAD)也用於減少音頻信號中可能包含某些語音的部分。它主要用於識別不必要的詞類,並阻止它們被考慮。
語音識別包
在 PyPI 的鏈條上,有一小撮語音識別軟件包。其中一些是:
- 裝配
- 阿皮亞
- 語音識別
- 才智
- 沃森-開發者-雲
上面給出的包,如apai**wit,提供了類似自然語言處理**的功能。它們的內置功能有助於識別說話者的意圖,並超越了一般的語音識別。其他包主要關注語音到文本的轉換。
以上給出的包中只有一個包是語音識別。
識別語音需要一些音頻形式的輸入,語音識別包可以毫不費力地檢索這些類型的輸入。它不需要硬核腳本來訪問麥克風,然後從頭開始處理音頻。這個包的另一個優點是,它將節省您的時間,並且在幾分鐘內就可以執行指令。
SpeechRecognition 庫的行為就像是專門為語音構建的各種 API 的封面或包裝。它非常靈活和敏捷。一個這樣的 API 是谷歌網絡語音API,支持硬編碼的默認語音識別。
SpeechRecognition 庫非常容易使用,並且該包很容易作為 python 項目導入。還需要注意的是,這個包可能不會包裝目前所有可用的 API。因此,您需要準確地確定構建語音識別器需要什麼樣的包。
您可能已經從理論上理解了一些語音識別器的優點和缺點,並對語音識別器的工作原理有了一個概述,讓我們使用下面給出的安裝過程繼續將語音識別包安裝到本地環境中。
語音識別安裝
SpeechRecognition 包兼容各種版本的 python 語言,如 2.6、2.7 、 3.3 +。如果您的 python 版本較舊,它可能還需要一些其他安裝。假設您的本地系統上有 Python 3.3+版本,您可以通過 pip 從終端執行您的安裝方法。
$ pip install SpeechRecognition
安裝後,您必須使用下面給出的代碼驗證安裝是否被正確解釋。
>>> import speech_recognition as sr
>>> sr._version_'3.8.1'
如果您正在處理包中的音頻文件,語音識別可能會非常有效。然而,它可能還需要一些依賴關係。因此,為了簡化這個過程, PyAudio 包在捕捉麥克風輸入時非常方便。
識別器類
語音識別的魔力只有在識別器類出現時才會發揮作用。識別器的主要目的是識別語音以及不同語音的閱讀變體,然後驅動功能並驗證來自音頻源的語音。
要創建識別器,您需要創建它的實例。因此,在 python 解釋器中鍵入下面的代碼。
>>> r=sr.Recognizer()
有各種方法可以創建識別器實例,這些實例可以在 API 的支持下識別來自音頻源的語音。他們中的一些人在下面應徵入伍。
recognize_bing(): Microsoft Bing Speech
recognize_google(): Google Web Speech API
recognize_google_cloud(): Google Cloud Speech - requires
installation of the google-cloud-speech package
recognize_houndify(): Houndify by SoundHound
recognize_ibm(): IBM Speech to Text
recognize_sphinx(): CMU Sphinx - requires installing PocketSphinx
recognize_wit(): Wit.ai
在這些包中,如果與 CMU 獅身人面像引擎一起使用,包識別 _ 獅身人面像()被設計為離線服務。其餘的包需要互聯網連接才能工作。
注意:一定要注意語音識別中提供的默認鍵。它主要用於測試和安全目的,可能會被谷歌撤銷。因此,SpeechRecognition 有一個 API 接口,可以翻譯這些缺省鍵來小心使用。
*每個 recognize( )方法可能會拋出一個名為語音識別的異常。RequestError 異常。發生這種情況的原因可能是,由於安裝損壞,API 可能無法訪問。對於上面顯示的其餘方法,如果達到配額限制,可能會生成請求錯誤**,或者服務器或互聯網連接可能有問題。可能會出現類似這樣的問題。
Traceback (most recent call last):
File "", line 1, in <module>TypeError: recognize_google() missing 1 required positional argument: 'audio_data'</module>
使用音頻文件
在使用 Python 中的 SpeechRecognition 包之前,您首先需要下載一個音頻文件。SpeechRecognition 通過將音頻文件保存到您當前運行的 python 解釋器的同一目錄中,可以輕鬆處理音頻文件。它通過使用音頻文件類來做到這一點。這個類需要用音頻文件路徑初始化和設置,以便上下文管理器提供讀取文件及其內容的良好接口。
支持的文件類型
語音識別支持的文件格式類型如下:
- WAV :格式必須是 PCM/LPCM
- AIFF
- AIFF-C
- FLAC :格式必須是原生 FLAC
如果您有基於 x-86 的 Windows、Linux 或 macOS,那麼使用 FLAC 文件會更容易。除了這些操作系統之外,您可能還需要安裝一個 FLAC 編碼器,讓您能夠訪問命令行工具。
使用記錄()捕獲數據
record()函數用於在文件中使用 python 解釋器從文件中捕獲數據。例如,文件的名稱是「 harvard.wav ,用於編碼該方法的 python 解釋器代碼如下。
>>> hardvard = sr.AudioFile('harvard.wav')
>>> with harvard as source:
Audio = r.record(source)
這段代碼將打開上下文管理器來讀取文件的內容,並將數據存儲在名為源的音頻文件實例中。記錄()方法記錄文件中的真實數據。要確認數據是否被記錄,您可以使用以下代碼進行檢查。
>>> type(audio)
或者,您也可以調用 recognize_google()來識別音頻。這可能取決於您的網絡速度、音頻捕獲方式以及顯示結果的秒數。
>>> r.recognize_google(audio)
該代碼將轉錄文件中存在的所有數據,並以文本格式寫入識別的音頻。
持續時間和段偏移捕獲
考慮您只想捕獲文件中特定的語音片段。record()方法可以做到這一點,方法是識別 duration 關鍵字,後跟幾秒鐘後停止語音的參數。例如,您可能需要從「harvard.wav」文件中捕獲演講的前 5 秒;您可以使用下面給出的方法做到這一點。
>>> with harvard as source:
Audio = r.record(source, duration=5)
>> >r.recognize_google(audio)
當在塊中使用時,record()方法總是希望在文件流中向前移動。這通常意味著錄制會再次進行四秒鐘,如果您正在錄製前四秒鐘,則會返回前四秒鐘的音頻。這個現象可以用下面給出的代碼片段來說明。
>>> with harvard as source:
... audio1 = r.record(source, duration=4)
... audio2 = r.record(source, duration=4)
...
>>> r.recognize_google(audio1)
'the stale smell of old beer lingers'
>>> r.recognize_google(audio2)
'it takes heat to bring out the odor a cold dip.'
您可以注意到音頻 2 包含音頻第三階段的一部分。也有一些情況下,您指定持續時間,錄製中途停止,這通常會損害音頻的透明度。此外,在指定 record()方法時,您甚至可以通過 offset 關鍵字使用參數設置特定的起始點。起點表示開始錄製前距離文件的秒數。因此,要從音頻文件中捕獲第二個短語,您可以使用下面的方法,根據您的需要選擇 5 秒或 3 秒。
>>> with harvard as source:
... audio = r.record(source, offset=4, duration=3)
...
>>> r.recognize_google(audio)
持續時間和偏移關鍵字的重要性在於包含音頻的文件的分段。如果你已經知道音頻幀,你可能會匆忙陷入糟糕的轉錄結果。要可視化這種效果,請使用 python 解釋器嘗試使用以下代碼。
>>> with harvard as source:
... audio = r.record(source, offset=4.7, duration=2.8)
...
>>> r.recognize_google(audio)
上面的代碼片段表示錄製從 4.7 秒開始,開頭的短語將會丟失。同樣,當錄製結束時,捕獲的短語將與開始階段不匹配。
另一個遺漏導致不準確轉錄的短語的原因是噪音。以上可能工作得很好,因為它是乾淨的音頻,但現實世界中沒有沒有噪音的地方。
噪聲對語音識別的影響
沒有一個地方沒有噪音。所有的語音識別技術都是為了解決和消除語音中存在的有害噪聲而開發的,這些噪聲會削弱捕獲音頻幀的能力。噪音會破壞應用的精度。要了解 Noise 對語音識別的影響,需要下載一個名為「 jackhammer.wav 」的文件,並確保保存在解釋器的工作目錄中。假設這個文件中有一句「 javaTpoint 是最好的 Java 培訓網站」大聲說出來,你需要在後台轉錄。為此,請考慮以下方法。
>>> jackhammer = sr.AudioFile('jackhammer.wav')
>>> with jackhammer as source:
... audio = r.record(source)
...
>>> r.recognize_google(audio)
為了處理噪聲,在上述步驟之後嘗試的另一種方法是使用識別器類的調整環境噪聲()的方法。
>>> with jackhammer as source:
... r.adjust_for_ambient_noise(source)
... audio = r.record(source)
...
>>> r.recognize_google(audio)
上面的代碼片段錯過了初始輸出,輸出中沒有第一個單詞。因此,當 record()方法捕獲音頻時,會使用音頻文件的第一部分,並捕獲後面的數據。調整環境噪聲()方法讀取音頻文件的第一秒,識別器校準音頻的噪聲水平。
如果要使用調整環境噪聲()來調整時間範圍,可以在代碼段中使用 duration 關鍵字,方法是以秒為單位為其分配數值。如果不賦值,則取一個作為默認值,但建議將該值降低到 0.5 。下面的代碼片段顯示了相同的技術。
>>> with jackhammer as source:
... r.adjust_for_ambient_noise(source, duration=0.5)
... audio = r.record(source)
...
>>> r.recognize_google(audio)
上面的代碼片段將返回您之前在開頭錯過的整個音頻文件。但是,在某些情況下,很難處理或消除噪聲的影響,因為信號可能過於嘈雜,無法處理。
因此,您可能不得不求助於一些其他技術來預處理音頻,以處理這樣的問題。為此,您可以使用音頻編輯軟件或類似 SciPy 的 Python 包。該軟件包可以預處理音頻文件,並可以過濾噪音。
此外,在處理有噪聲的文件時,使用實際的 API 響應是有幫助的,因為大多數 API 返回具有許多轉錄的 JSON 字符串。類似地, recognize_google() 方法也必然會傳遞類似的轉錄文件,除非被迫傳遞完整的響應。這個方法實際上可以使用某些參數和關鍵字來實現,比如 recognize_google()方法返回的 show_all。
>>> r.recognize_google(audio, show_all=True)
{'alternative': [
{'transcript': 'javatpoint best is the programming site'},
{'transcript': 'the javatpoint site is best programming'},
{'transcript': 'javatpoint programming is the best site'},
{'transcript': 'the programming is javatpoint best site'},
{'transcript': 'best is the programming site javatpoint'},
], 'final': True}
在上面的代碼片段中, recognize_google() 方法返回一個字典,該字典帶有指向上面顯示的各種轉錄的替代鍵。儘管響應結構可能因為 API 的不同而有不同的形式,但這主要用於調試。
到目前為止,您可能已經學習了語音識別及其 Python 包的基礎知識。學習的下一個階段包括轉錄音頻文件,通過麥克風輸入使項目更具互動性。
使用麥克風輸入工作
通過安裝名為 PyAudio 的軟件包,您可以使用 SpeechRecognizer 軟件包訪問您的麥克風。為此,請保存當前的更改並關閉解釋器。繼續安裝 PyAudio ,過程與您安裝 SpeechRecognizer 的過程相似。
$ pip install pyaudio
安裝後,要測試它是否與您正在使用的語音識別器版本兼容,請鍵入以下命令。
$ python -m speech_recognizer
完成此步驟後,您需要確保默認麥克風已打開且未靜音。如果您在安裝和測試中沒有遇到任何問題,您應該會在終端上看到類似這樣的內容。
A moment of silence, please?
Set minimum energy threshold to 600.4452854381937
Say something!
試着通過尋找麥克風並測試 SpeechRecognizer 包如何轉錄您的語音來玩。
麥克風班
麥克風類用於為系統創建一個實例,以識別來自源的音頻文件。要使用這個類,您需要通過打開另一個解釋器會話並創建一個識別器類來導入它,如下所示。
>>> import speech_recognizer as sr
>>> r.=sr.Recognizer()
您需要使用系統上的默認麥克風,而不是使用來源的音頻文件。您可以使用如圖所示的方法來實現這一點。
>>> mic = sr.Microphone()
如果您無法識別系統的默認麥克風,您可能需要指定一個設備索引。您可以使用麥克風類中的list 麥克風 name()方法獲取所有可用麥克風名稱的列表。
>>> sr.Microphone.list_microphone_names()
['HDA Intel PCH: ALC272 Analog (hw:0,0)',
'HDA Intel PCH: HDMI 0 (hw:0,3)',
'sysdefault',
'front',
'surround40',
'surround51',
'surround71',
'hdmi',
'pulse',
'dmix',
'default']
上述代碼中定義的設備索引稱為索引,其中包含系統上可用麥克風名稱的列表。例如,在上面給出的輸出中,名為「front」的麥克風位於列表中的索引 3 處。這可以使用下面給出的方法來完成。
>>> mic = sr.Microphone(device_index=3)
上面的代碼只是一個例子,因此建議不要在解釋器中運行。對於大多數項目,您應該使用默認的系統麥克風。
使用 listen()捕捉麥克風輸入
您將在這裡學習的另一種方法是 listen()方法,該方法用於捕獲來自麥克風的輸入。由於您已經創建了麥克風實例,現在是捕獲一些輸入的合適時機。像大多數音頻文件類一樣,麥克風也被視為上下文管理器。它通過內部有一個塊的 Recognizer 類捕獲輸入,方法是接受它作為第一個參數,然後記錄來自源的輸入,直到麥克風檢測到靜音。為了對此進行總結,讓我們看看如何使用給定的代碼來應用它。
>>> with mic as source:
... audio = r.listen(source)
...
一旦用塊執行了上面的代碼,您應該嘗試對着麥克風說點什麼,然後等待一段時間。解釋器可能會在一段時間後提示顯示。一旦您看到「> > >」作為返回的提示,就可以確定識別器可以識別您所說的任何內容。
如果識別器未能返回提示,可能會出現一些環境噪音。您可以通過按下 Ctrl+C 進行提示來停止。
要調整語音中的主要噪聲,您可能需要使用與「識別器」類相同的調整方法。由於與音頻文件相比,麥克風輸入是不可預測的,所以總是在聽麥克風輸入時進行這些操作總是一個好主意。要獲得精確且無噪聲的輸出,可以使用如下所示的 listen()方法進行嘗試。
>>> with mic as source:
... r.adjust_for_ambient_noise(source)
... audio = r.listen(source)
...
當運行上述代碼時,請等待幾秒鐘,以便 adjust for environmental Noise()方法完成其任務。代碼編譯並運行後,試着對着麥克風說點什麼,等待解釋器識別語音。如果它能識別並返回提示,它就能正常工作。
您也可以使用 duration 關鍵字,並嘗試再次使用它來獲得您想要識別的特定語音幀。同時,如果 duration 關鍵字的持續時間小於等於 0.5,SpeechRecognizer 文檔建議使用 duration 關鍵字。您可能還會發現,在某些情況下沒有使用 duration 關鍵字,因此使用了一個作為默認值來生成更好的結果。此外,最小值很可能取決於麥克風環境的輸入。因此,一秒鐘的持續時間最好被認為是這類任務的最佳時間。
無法識別的語音
有了代碼庫,你已經在解釋器中創建了一些有形的代碼,使用麥克風來發出一些難以理解的噪音。你肯定會收到這樣的錯誤。
Traceback (most recent call last):
File "", line 1, in <module>File
"/home/david/real_python/speech_recognition_primer/venv/lib/pyth
on3.5/site-packages/speech_recognition/__init__.py", line 858, in recognize_google
if not isinstance(actual_result, dict) or
len(actual_result.get("alternative", [])) == 0: raise
UnknownValueError()
speech_recognition.UnknownValueError</module>
這個錯誤是因為通過麥克風捕獲的語音作為輸入的不可識別的性質,因此 API 代碼庫不夠先進,無法轉錄這些簡短的咕嚕聲或人聲。也可能有這樣的情況,解釋器可能通過識別當前輸入並顯示甚至不接近通過麥克風捕獲的內容來提示。因此,像拍手、點擊或其他小節這樣的活動可能會分別引發異常或沒有正確的輸出。
摘要
在這篇關於 Python 語音識別的長教程中,您從零開始學習了時間表的工作方式。您講述了從概念知識到創建實時簡單的 python 語音識別器的實踐經驗,該語音識別器可以聽到您的語音並以文本格式顯示在控制台上。您還學習了一些關鍵方法來處理使用 SpeechRecognizer 包時經常出現的問題,並學習了如何糾正這些問題。Python 是廣泛使用的編程和腳本語言,涵蓋了大多數語音識別應用,因為它的環境庫和框架顯示了它只用幾行簡單可讀的代碼就能處理關鍵問題的能力。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/247418.html