Python 語音辨識

來源:互聯網
上載者:User

標籤:intel   關閉   mac   下載   語音   文字   活動   起點   sphinx   

出品 | 悅動智能(公眾號ID:aibbtcom)

遇到問題請文末留言

【悅動智能導讀】亞馬遜的 Alexa 的巨大成功已經證明:在不遠的將來,實現一定程度上的語音支援將成為日常科技的基本要求。整合了語音辨識的 Python 程式提供了其他技術無法比擬的互動性和可訪問性。最重要的是,在 Python 程式中實現語音辨識非常簡單。通過本指南,你將學到:

  • 語音辨識的工作原理;
  • PyPI 支援哪些軟體包;
  • 如何安裝和使用 SpeechRecognition 軟體包——一個功能全面且便於使用的 Python 語音辨識庫。
語言識別工作原理概述

語音辨識源於 20 世紀 50 年代早期在貝爾實驗室所做的研究。早期語音辨識系統僅能識別單個講話者以及只有約十幾個單詞的詞彙量。現代語音辨識系統已經取得了很大進步,可以識別多個講話者,並且擁有識別多種語言的龐大詞彙表。

語音辨識的首要部分當然是語音。通過麥克風,語音便從物理聲音被轉換為電訊號,然後通過模數轉換器轉換為資料。一旦被數字化,就可適用若干種模型,將音頻轉錄為文本。

大多數現代語音辨識系統都依賴於隱馬爾可夫模型(HMM)。其工作原理為:語音訊號在非常短的時間尺度上(比如 10 毫秒)可被近似為靜止過程,即一個其統計特性不隨時間變化的過程。

許多現代語音辨識系統會在 HMM 識別之前使用神經網路,通過特徵變換和降維的技術來簡化語音訊號。也可以使用語音活動檢測器(VAD)將音頻訊號減少到可能僅包含語音的部分。

幸運的是,對於 Python 使用者而言,一些語音辨識服務可通過 API 線上使用,且其中大部分也提供了 Python SDK。

選擇 Python 語音辨識包

PyPI中有一些現成的語音辨識軟體包。其中包括:

?apiai

?google-cloud-speech

?pocketsphinx

?SpeechRcognition

?watson-developer-cloud

?wit

一些軟體包(如 wit 和 apiai )提供了一些超出基本語音辨識的內建功能,如識別講話者意圖的自然語言處理功能。其他軟體包,如Google雲語音,則專註於語音向文本的轉換。

其中,SpeechRecognition 就因便於使用脫穎而出。

識別語音需要輸入音頻,而在 SpeechRecognition 中檢索音頻輸入是非常簡單的,它無需構建訪問麥克風和從頭開始處理音頻檔案的指令碼,只需幾分鐘即可自動完成檢索並運行。

SpeechRecognition 庫可滿足幾種主流語音 API ,因此靈活性極高。其中 Google Web Speech API 支援寫入程式碼到 SpeechRecognition 庫中的預設 API 金鑰,無需註冊就可使用。SpeechRecognition 以其靈活性和易用性成為編寫 Python 程式的最佳選擇。

安裝 SpeechRecognation

SpeechRecognition 相容 Python2.6 , 2.7 和 3.3+,但若在 Python 2 中使用還需要一些額外的安裝步驟。本教程中所有開發版本預設 Python 3.3+。

讀者可使用 pip 命令從終端安裝 SpeechRecognition:

$ pip install SpeechRecognition

安裝完成後請開啟解譯器視窗並輸入以下內容來驗證安裝:

>>> import speech_recognition as sr>>> sr.__version__‘3.8.1‘

註:不要關閉此會話,在後幾個步驟中你將要使用它。

若處理現有的音頻檔案,只需直接調用 SpeechRecognition ,注意具體的用例的一些依賴關係。同時注意,安裝 PyAudio 包來擷取麥克風輸入。

辨識器類

SpeechRecognition 的核心就是辨識器類。

Recognizer API 主要目是識別語音,每個 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

以上七個中只有 recognition_sphinx()可與CMU Sphinx 引擎離線工作, 其他六個都需要串連互連網。

SpeechRecognition 附帶 Google Web Speech API 的預設 API 金鑰,可直接使用它。其他六個 API 都需要使用 API 金鑰或使用者名稱/密碼組合進行身分識別驗證,因此本文使用了 Web Speech API。

現在開始著手實踐,在解譯器會話中調用 recognise_google()函數。

>>> r.recognize_google()

螢幕會出現:

Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: recognize_google() missing 1 required positional argument: ‘audio_data‘

相信你已經猜到了結果,怎麼可能從空檔案中識別出資料呢?

這 7 個 recognize_*()  辨識器類都需要輸入 audio_data 參數,且每種辨識器的 audio_data 都必須是 SpeechRecognition 的 AudioData 類的執行個體。

AudioData 執行個體的建立有兩種路徑:音頻檔案或由麥克風錄製的音頻,先從比較容易上手的音頻檔案開始。

音頻檔案的使用

首先需要下載音頻檔案(https://github.com/realpython/python-speech-recognition/tree/master/audio_files),儲存到 Python 解譯器會話所在的目錄中。

AudioFile 類可以通過音頻檔案的路徑進行初始化,並提供用於讀取和處理檔案內容的上下文管理器介面。

支援檔案類型

SpeechRecognition 目前支援的檔案類型有:

  • WAV: 必須是 PCM/LPCM 格式
  • AIFF
  • AIFF-C
  • FLAC: 必須是初始 FLAC 格式;OGG-FLAC 格式不可用

若是使用 Linux 系統下的 x-86 ,macOS 或者是 Windows 系統,需要支援 FLAC檔案。若在其它系統下運行,需要安裝 FLAC 編碼器並確保可以訪問 flac 命令。

使用 record() 從檔案中擷取資料

在解譯器會話框鍵入以下命令來處理 “harvard.wav” 檔案的內容:

>>> harvard = sr.AudioFile(‘harvard.wav‘)>>> with harvard as source:...   audio = r.record(source)...

通過上下文管理器開啟檔案並讀取檔案內容,並將資料存放區在 AudioFile 執行個體中,然後通過 record()將整個檔案中的資料記錄到 AudioData 執行個體中,可通過檢查音訊類型來確認:

>>> type(audio)<class ‘speech_recognition.AudioData‘>

現在可以調用 recognition_google()來嘗試識別音頻中的語音。

>>> r.recognize_google(audio)‘the stale smell of old beer lingers it takes heatto bring out the odor a cold dip restores health andzest a salt pickle taste fine with ham tacos alPastore are my favorite a zestful food is the hotcross bun‘

以上就完成了第一個音頻檔案的錄製。

利用位移量和期間擷取音頻片段

若只想捕捉檔案中部分演講內容該怎麼辦?record() 命令中有一個 duration 關鍵字參數,可使得該命令在指定的秒數後停止記錄。

例如,以下內容僅擷取檔案前四秒內的語音:

>>> with harvard as source:...   audio = r.record(source, duration=4)...>>> r.recognize_google(audio)‘the stale smell of old beer lingers‘

在with塊中調用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‘

除了指定記錄期間之外,還可以使用 offset 參數為 record() 命令指定起點,其值表示在開始記錄的時間。如:僅擷取檔案中的第二個短語,可設定 4 秒的位移量並記錄 3 秒的期間。

>>> with harvard as source:...   audio = r.record(source, offset=4, duration=3)...>>> recognizer.recognize_google(audio)‘it takes heat to bring out the odor‘

在事Crowdsourced Security Testing道檔案中語音結構的情況下,offset 和 duration 關鍵字參數對於分割音頻檔案非常有用。但使用不準確會導致轉錄不佳。

>>> with harvard as source:...   audio = r.record(source, offset=4.7, duration=2.8)...>>> recognizer.recognize_google(audio)‘Mesquite to bring out the odor Aiko‘

本程式從第 4.7 秒開始記錄,從而使得片語 “it takes heat to bring out the odor” ,中的 “it t” 沒有被記錄下來,此時 API 只得到 “akes heat” 這個輸入,而與之匹配的是 “Mesquite” 這個結果。

同樣的,在擷取錄音結尾片語 “a cold dip restores health and zest” 時 API 僅僅捕獲了 “a co” ,從而被錯誤匹配為 “Aiko” 。

噪音也是影響翻譯準確度的一大元兇。上面的例子中由於音頻檔案乾淨從而運行良好,但在現實中,除非事先對音頻檔案進行處理,否則不可能得到無雜訊音頻。

雜訊對語音辨識的影響

 

雜訊在現實世界中確實存在,所有錄音都有一定程度的雜訊,而未經處理的噪音可能會破壞語音辨識應用程式的準確性。

要瞭解雜訊如何影響語音辨識,請下載 “jackhammer.wav” (https://github.com/realpython/python-speech-recognition/tree/master/audio_files)檔案,並確保將其儲存到解譯器會話的工作目錄中。檔案中短語 “the stale smell of old beer lingers” 在是很大鑽牆聲的背景音中被念出來。

嘗試轉錄此檔案時會發生什嗎?

>>> jackhammer = sr.AudioFile(‘jackhammer.wav‘)>>> with jackhammer as source:...   audio = r.record(source)...>>> r.recognize_google(audio)‘the snail smell of old gear vendors‘

那麼該如何處理這個問題呢?可以嘗試調用 Recognizer 類的adjust_for_ambient_noise()命令。

>>> with jackhammer as source:...   r.adjust_for_ambient_noise(source)...   audio = r.record(source)...>>> r.recognize_google(audio)‘still smell of old beer vendors‘

這樣就與準確結果接近多了,但精確度依然存在問題,而且片語開頭的 “the” 被丟失了,這是什麼原因呢?

因為使用 adjust_for_ambient_noise()命令時,預設將檔案流的第一秒識別為音訊雜訊層級,因此在使用 record()擷取資料前,檔案的第一秒已經被消耗了。

可使用duration關鍵字參數來調整adjust_for_ambient_noise()命令的時間分析範圍,該參數單位為秒,預設為 1,現將此值降低到 0.5。

>>> with jackhammer as source:...   r.adjust_for_ambient_noise(source, duration=0.5)...   audio = r.record(source)...>>> r.recognize_google(audio)‘the snail smell like old Beer Mongers‘

現在我們就得到了這句話的 “the”,但現在出現了一些新的問題——有時因為訊號太吵,無法消除噪音的影響。

若經常遇到這些問題,則需要對音頻進行一些預先處理。可以通過音頻編輯軟體,或將濾鏡應用於檔案的 Python 包(例如SciPy)中來進行該預先處理。處理嘈雜的檔案時,可以通過查看實際的 API 響應來提高準確性。大多數 API 返回一個包含多個可能轉錄的 JSON 字串,但若不強制要求給出完整響應時,recognition_google()方法始終僅返回最可能的轉錄字元。

通過把 recognition_google()中 True 參數改成 show_all 來給出完整響應。

>>> r.recognize_google(audio, show_all=True){‘alternative‘: [ {‘transcript‘: ‘the snail smell like old Beer Mongers‘},  {‘transcript‘: ‘the still smell of old beer vendors‘},  {‘transcript‘: ‘the snail smell like old beer vendors‘}, {‘transcript‘: ‘the stale smell of old beer vendors‘},  {‘transcript‘: ‘the snail smell like old beermongers‘},  {‘transcript‘: ‘destihl smell of old beer vendors‘},  {‘transcript‘: ‘the still smell like old beer vendors‘},  {‘transcript‘: ‘bastille smell of old beer vendors‘},  {‘transcript‘: ‘the still smell like old beermongers‘},  {‘transcript‘: ‘the still smell of old beer venders‘},  {‘transcript‘: ‘the still smelling old beer vendors‘},  {‘transcript‘: ‘musty smell of old beer vendors‘},  {‘transcript‘: ‘the still smell of old beer vendor‘}], ‘final‘: True}

可以看到,recognition_google()返回了一個關鍵字為 ‘alternative‘ 的列表,指的是所有可能的響應列表。此響應列表結構會因 API 而異且主要用於對結果進行調試。

麥克風的使用

若要使用 SpeechRecognizer 訪問麥克風則必須安裝 PyAudio 軟體包,請關閉當前的解譯器視窗,進行以下操作:

安裝 PyAudio

安裝 PyAudio 的過程會因作業系統而異。

Debian Linux

如果使用的是基於 Debian的Linux(如 Ubuntu ),則可使用 apt 安裝 PyAudio:

$ sudo apt-get install python-pyaudio python3-pyaudio

安裝完成後可能仍需要啟用 pip install pyaudio ,尤其是在虛擬情況下運行。

macOS:macOS 使用者則首先需要使用 Homebrew 來安裝 PortAudio,然後調用 pip 命令來安裝 PyAudio。

$ brew install portaudio$ pip install pyaudio

Windows:Windows 使用者可直接調用 pip 來安裝 PyAudio。

$ pip install pyaudio

安裝測試:安裝了 PyAudio 後可從控制台進行安裝測試。

$ python -m speech_recognition

請確保預設麥克風開啟並取消靜音,若安裝正常則應該看到如下所示的內容:

A moment of silence, please...Set minimum energy threshold to 600.4452854381937Say something!

請對著麥克風講話並觀察 SpeechRecognition 如何轉錄你的講話。

Microphone 類

請開啟另一個解譯器會話,並建立識一個別器類的例子。

>>> import speech_recognition as sr>>> r = sr.Recognizer()

此時將使用預設系統麥克風,而不是使用音頻檔案作為訊號源。讀者可通過建立一個Microphone 類的執行個體來訪問它。

>>> mic = sr.Microphone()

若系統沒有預設麥克風(如在 RaspberryPi 上)或想要使用非預設麥克風,則需要通過提供裝置索引來指定要使用的麥克風。讀者可通過調用 Microphone 類的list_microphone_names()函數來擷取麥克風名稱列表。

>>> 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‘]

注意:你的輸出可能與上例不同。

list_microphone_names()返回列表中麥克風裝置名稱的索引。在上面的輸出中,如果要使用名為 “front” 的麥克風,該麥克風在列表中索引為 3,則可以建立如下所示的麥克風執行個體:

>>> # This is just an example; do not run>>> mic = sr.Microphone(device_index=3)

但大多數情況下需要使用系統預設麥克風。

使用 listen()擷取麥克風輸入資料

 

準備好麥克風執行個體後,讀者可以捕獲一些輸入。

就像 AudioFile 類一樣,Microphone 是一個上下文管理器。可以使用 with 塊中 Recognizer 類的 listen()方法捕獲麥克風的輸入。該方法將音頻源作為第一個參數,並自動記錄來自源的輸入,直到檢測到靜音時自動停止。

>>> with mic as source:...   audio = r.listen(source)...

執行 with 塊後請嘗試在麥克風中說出 “hello” 。請等待解譯器再次顯示提示,一旦出現 “>>>” 提示返回就可以識別語音。

>>> r.recognize_google(audio)‘hello‘

如果沒有提示再次返回,可能是因為麥克風收到太多的環境噪音,請使用 Ctrl + C 中斷這個過程,從而讓解譯器再次顯示提示。

要處理環境雜訊,可調用 Recognizer 類的 adjust_for_ambient_noise()函數,其操作與處理噪音音頻檔案時一樣。由於麥克風輸入聲音的可預測性不如音頻檔案,因此任何時間聽麥克風輸入時都可以使用此過程進行處理。

>>> with mic as source:...   r.adjust_for_ambient_noise(source)...   audio = r.listen(source)...

運行上面的代碼後稍等片刻,嘗試在麥克風中說 “hello” 。同樣,必須等待解譯器提示返回後再嘗試識別語音。

請記住,adjust_for_ambient_noise()預設分析音頻源中1秒鐘長的音頻。若讀者認為此時間太長,可用duration參數來調整。

SpeechRecognition 資料建議 duration 參數不少於0.5秒。某些情況下,你可能會發現,期間超過預設的一秒會產生更好的結果。您所需要的最小值取決於麥克風所處的周圍環境,不過,這些資訊在開發過程中通常是未知的。根據我的經驗,一秒鐘的預設期間對於大多數應用程式已經足夠。

處理難以識別的語音

嘗試將前面的程式碼範例輸入到解譯器中,並在麥克風中輸入一些無法理解的噪音。你應該得到這樣的結果:

Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/david/real_python/speech_recognition_primer/venv/lib/python3.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

無法被 API 匹配成文字的音頻會引發 UnknownValueError 異常,因此要頻繁使用 try  和 except 塊來解決此類問題。API 會盡全力去把任何聲音轉成文字,如短咕嚕聲可能會被識別為 “How”,咳嗽聲、鼓掌聲以及舌頭哢噠聲都可能會被轉成文字從而引起異常。

結語

本教程中,我們一直在識別英語語音,英語是 SpeechRecognition 軟體包中每個 recognition _ *()方法的預設語言。但是,識別其他語音也是絕對有可能且很容易完成的。要識別不同語言的語音,請將 recognition _ *()方法的語言關鍵字參數設定為與所需語言對應的字串。

原文連結:http://www.aibbt.com/a/28552.html

Python 語音辨識

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.