首頁 > 軟體

Linux下利用python實現語音識別詳細教學

2023-04-02 06:03:15

語音識別工作原理簡介

語音識別源於 20 世紀 50 年代早期在貝爾實驗室所做的研究。早期語音識別系統僅能識別單個講話者以及只有約十幾個單詞的詞彙量。現代語音識別系統已經取得了很大進步,可以識別多個講話者,並且擁有識別多種語言的龐大詞彙表。
語音識別的首要部分當然是語音。通過麥克風,語音便從物理聲音被轉換為電訊號,然後通過模數轉換器轉換為資料。一旦被數位化,就可適用若干種模型,將音訊轉錄為文字。
大多數現代語音識別系統都依賴於隱馬爾可夫模型(HMM)。其工作原理為:語音訊號在非常短的時間尺度上(比如 10 毫秒)可被近似為靜止過程,即一個其統計特性不隨時間變化的過程。
許多現代語音識別系統會在 HMM 識別之前使用神經網路,通過特徵變換和降維的技術來簡化語音訊號。也可以使用語音活動檢測器(VAD)將音訊訊號減少到可能僅包含語音的部分。
幸運的是,對於 Python 使用者而言,一些語音識別服務可通過 API 線上使用,且其中大部分也提供了 Python SDK。

選擇合適的python語音識別包

PyPI中有一些現成的語音識別軟體包。其中包括:
•apiai
•google-cloud-speech
•pocketsphinx
•SpeechRcognition
•watson-developer-cloud
•wit
一些軟體包(如 wit 和 apiai )提供了一些超出基本語音識別的內建功能,如識別講話者意圖的自然語言處理功能。其他軟體包,如谷歌雲語音,則專注於語音向文字的轉換。
其中,SpeechRecognition 就因便於使用脫穎而出。
識別語音需要輸入音訊,而在 SpeechRecognition 中檢索音訊輸入是非常簡單的,它無需構建存取麥克風和從頭開始處理音訊檔的指令碼,只需幾分鐘即可自動完成檢索並執行。

安裝SpeechRecognition

SpeechRecognition 相容 Python2.6 , 2.7 和 3.3+,但若在 Python 2 中使用還需要一些額外的安裝步驟。大家可使用 pip 命令從終端安裝 SpeechRecognition:pip3 install SpeechRecognition
安裝過程中可能會出現一大片紅色字型提示安裝錯誤!我在另一篇部落格中有解決方法(https://www.jb51.net/article/279677.htm

安裝完成後可以開啟直譯器視窗進行驗證安裝:

注:不要關閉此對談,在後幾個步驟中你將要使用它。
若處理現有的音訊檔,只需直接呼叫 SpeechRecognition ,注意具體的用例的一些依賴關係。同時注意,安裝 PyAudio 包來獲取麥克風輸入

識別器類

SpeechRecognition 的核心就是識別器類。
Recognizer API 主要目是識別語音,每個 API 都有多種設定和功能來識別音訊源的語音,這裡我選擇的是recognize_sphinx(): CMU Sphinx - requires installing PocketSphinx(支援離線的語音識別
那麼我們就需要通過pip命令來安裝PocketSphinx,在安裝過程中也容易出現一大串紅色字型的錯誤。因為博主英語不太好,具體啥錯誤不知道。直接上解決方法吧!在我的另一篇文章有介紹:
https://www.jb51.net/article/279684.htm

音訊檔的使用

下載相關的音訊檔儲存到特定的目錄(博主直接儲存到ubuntu桌面):
連結:https://pan.baidu.com/s/1oWG1A6JnjpeT_8DhEpoZzw
提取碼:sf73
注意:
AudioFile 類可以通過音訊檔的路徑進行初始化,並提供用於讀取和處理檔案內容的上下文管理器介面。
SpeechRecognition 目前支援的檔案型別有:

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

英文的語音識別

在完成以上基礎工作以後,就可以進行英文的語音識別了。
(1)開啟終端
(2)進入語音測試檔案所在目錄(博主的是 桌面)
(3)開啟python直譯器
(4)按照下圖輸入相關命令

最後就可以看到語音轉文字的內容(this they’ll smell …),其實效果還是很不錯的!因為是英文,並且沒有噪音。

噪音對語音識別的影響

噪聲在現實世界中確實存在,所有錄音都有一定程度的噪聲,而未經處理的噪音可能會破壞語音識別應用程式的準確性。
要了解噪聲如何影響語音識別,請下載 “jackhammer.wav”(連結:https://pan.baidu.com/s/1AvGacwXeiSfMwFUTKer3iA
提取碼:3pj7)
通過嘗試轉錄效果並不好,我們可以通過嘗試呼叫 Recognizer 類的adjust_for_ambient_noise()命令。

麥克風的使用

若要使用 SpeechRecognizer 存取麥克風則必須安裝 PyAudio 軟體包。
如果使用的是基於 Debian的Linux(如 Ubuntu ),則可使用 apt 安裝 PyAudio:sudo apt-get install python-pyaudio python3-pyaudio安裝完成後可能仍需要啟用 pip3 install pyaudio ,尤其是在虛擬情況下執行。
在安裝完pyaudio的情況下可以通過python實現語音錄入生成相關檔案。
pocketsphinx的使用注意:
支援檔案格式:wav
音訊檔的解碼要求:16KHZ,單聲道
利用python實現錄音並生成相關檔案程式程式碼如下:

from pyaudio import PyAudio, paInt16
import numpy as np
import wave
class recoder:
     NUM_SAMPLES = 2000   
     SAMPLING_RATE = 16000  
     LEVEL = 500     
     COUNT_NUM = 20   
     SAVE_LENGTH = 8     
     Voice_String = []
     def savewav(self,filename):
         wf = wave.open(filename, 'wb')
         wf.setnchannels(1)
         wf.setsampwidth(2)
         wf.setframerate(self.SAMPLING_RATE)
         wf.writeframes(np.array(self.Voice_String).tostring())
         wf.close()
     def recoder(self):
         pa = PyAudio()
         stream = pa.open(format=paInt16, channels=1, rate=self.SAMPLING_RATE, input=True,frames_per_buffer=self.NUM_SAMPLES)
         save_count = 0
         save_buffer = []
         while True:
            string_audio_data = stream.read(self.NUM_SAMPLES)
            audio_data = np.fromstring(string_audio_data, dtype=np.short)
            large_sample_count = np.sum(audio_data > self.LEVEL)
            print(np.max(audio_data))
            if large_sample_count > self.COUNT_NUM:
                save_count = self.SAVE_LENGTH
            else:
                save_count -= 1
            if save_count < 0:
                save_count = 0
            if save_count > 0:
                save_buffer.append(string_audio_data )
            else:
                if len(save_buffer) > 0:
                    self.Voice_String = save_buffer
                    save_buffer = []
                    print("Recode a piece of voice successfully!")
                    return True
		 else:
                    return False
if __name__ == "__main__":
    r = recoder()
    r.recoder()
    r.savewav("test.wav")

注意:在利用python直譯器實現時一定要注意空格!!!
最後生成的檔案就在Python直譯器回話所在目錄下,可以通過play來播放測試一下,如果沒有安裝play可以通過apt命令來安裝。

中文的語音識別

在進行完以前的工作以後,我們對語音識別的流程大概有了一定的瞭解,但是作為一箇中國人總得做一箇中文的語音識別吧!

我們要在CMU Sphinx語音識別工具包裡面下載對應的普通話升學和語言模型。

圖片中標記的就是普通話!下載相關的語音識別工具包。

但是我們要把zh_broadcastnews_64000_utf8.DMP轉化成language-model.lm.bin,再解壓zh_broadcastnews_16k_ptm256_8000.tar.bz2得到zh_broadcastnews_ptm256_8000資料夾。
借鑑剛才那位博主的方法,在Ubuntu下找到speech_recognition資料夾。可能會有很多小夥伴找不到相關的資料夾,其實是在隱藏檔案下。大家可以點選資料夾右上角的三條槓。如下圖所示:

然後給顯示隱藏檔案打個勾,如下圖所示:

然後依次按照以下目錄就可以找到啦:

然後把原來的en-US改名成en-US-bak,新建一個資料夾en-US,把解壓出來的zh_broadcastnews_ptm256_8000改成acoustic-model,把chinese.lm.bin改成language-model.lm.bin,把pronounciation-dictionary.dic改字尾成dict,複製這三個檔案到en-US裡。同時把原來en-US檔案目錄下的LICENSE.txt複製到現在的資料夾下。
最終該資料夾下有以下檔案:

然後我們就可以通過麥克風錄入一個語音檔案檔案(“test.wav”)
在該檔案目錄下開啟python直譯器輸入以下內容:

就看到了輸出內容,但是我說的是兩個中國,也測試了一下其他的發現識別效果很不好!!!
當然有好多同學可能想要語音包,我就分享給大家啦!(連結:https://pan.baidu.com/s/13DTDnv_4NYbKXpkXAXODpw
提取碼:zh39)

小範圍中文識別

用官方提供的效果太差,幾乎不能用!那麼我看了很多文章以後就想到了一種優化方法,但是隻適合小範圍的識別!一些命令啥的應該沒有問題,但是聊天什麼的可能就效果不太好。
找到剛才複製的4個資料夾,有一個pronounciation-dictionary.dict的資料夾,開啟以後是以下內容:

感覺這內容就是類似於一個字典,很多用詞和平時交流的用詞差距比較大。那麼我們改成我們習慣的用詞就可以啦! 抱著試一試的想法,結果還真的可以。識別效果真的不錯!
我的做法是:
(1)把圖片中紅色標記以上的內容繼續保留,紅色以下的內容刪除掉。當然處於保險考慮建議大家給該檔案備份一下!
(2)給紅色線以下輸入自己想識別的內容!(按照規則輸入,不同於拼音!!!)最近新型肺炎的情況不斷的變好,聽到最多的一句話就是“中國加油”那麼今天的內容就是將“中國加油”實現語音轉文字!希望能早日開學,哈哈哈哈。

3)輸入以下內容:

語音合成

語音合成個人的理解就是文字轉語音。不過這句話中可以設定client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) result = client.synthesis('你好百度', 'zh', 1, { 'vol': 5,'spd': 3,'pit':9,'per': 3})音量、聲調、速度、男/女/蘿莉/逍遙。大家快去嘗試合成一下吧!最後來欣賞一下語音合成後4種不同風格的語音,你更喜歡那一款呢?

以上就是Linux下利用python實現語音識別詳細教學的詳細內容,更多關於Linux利用python實現語音識別的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com