朱德平 新疆烏魯木齊
語音識別前,需要根據(jù)語音識別API的要求,對原始音頻文件進行預處理,下面主要介紹音頻編碼轉(zhuǎn)換和語音分割兩項功能。
語音識別API一般對語音文件的編碼算法、聲道數(shù)、采樣頻率、量化比特等參數(shù)有要求,因此需要對原始語音文件進行編碼轉(zhuǎn)換,可以利用FFmpeg或者Pydub實現(xiàn)。FFmpeg是一個跨平臺的音視頻錄制、轉(zhuǎn)換、流化工具,其音頻編碼轉(zhuǎn)換的命令示例:
os.system("ffmpeg -i speech.mp3 -acodec pcm_s16le-ac 1 -ar 16000 speech.wav")
Python語言中將speech.mp3轉(zhuǎn)換成單聲道、16K采樣率、16量化比特的wav文件。
Pydub是Python的一個音頻庫,提供了簡單、易于使用的音頻編程接口,其中編碼轉(zhuǎn)換的示例:
from pydub import AudioSegment
speech = AudioSegment.from_mp3("speech.mp3")
speech.export("speech.wav", format="wav",parameters=["-ac", "1", "-ar", "16000"])
由于語音識別API通常對語音的時長有限制,例如不能超過60s等,因此需要對語音文件進行分割,一般采用VAD進行分割。VAD(語音激活檢測,又叫語音端點檢測),是指通過對語音信號和噪聲信號的分析,區(qū)別語音區(qū)域和非語音區(qū)域,利用VAD進行語音分割的基本思路是將語音分割成時長10-30ms的幀,判斷每一幀是否是語音信號。 WebRTC VAD是VAD的一個常用實現(xiàn),py-webrtcvad是它的Python包裝庫,代碼示例:
import webrtcvad
vad = webrtcvad.Vad()
sample_rate = 16000
result=vad.is_speech(frame, sample_rate)
其中frame是分割的幀,result為幀是否為語音的布爾值。
百度AI開放平臺支持離線語音識別,要求音頻文件單聲道、采樣率8K或16K,16位量化比特,文件格式是pcm、wav等。語音時間最長60s。代碼示例:
from aip import AipSpeech
aipSpeech = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
with open(file_path, 'rb') as file:
speech_content = file.read()
result = aipSpeech.asr(speech_content, 'pcm', 16000, {'dev_pid': 1536})
if result["err_no"] == 0:
print("識別成功,文本是:{}".format(result["result"][0]))
else:
print("識別出錯:{}".format(result["err_msg"]))
其中APP_ID,、API_KEY,、SECRET_KEY注冊百度平臺和創(chuàng)建應用時系統(tǒng)會創(chuàng)建和分配,file_path是語音文件名,dev_pid屬性設(shè)置語言類型,1536為普通話識別,1537為英語識別。識別結(jié)果result為Json結(jié)構(gòu)的數(shù)據(jù),其中result["err_no"]若為0,代表識別成功,result["result"]是識別的1-5個候選結(jié)果,若result["err_no"]為其它數(shù)字,則表示識別出錯,result["err_no"]為錯誤碼。
有些情況下,需要將識別出的語音文本和已有的文本進行匹配,可以使用模糊匹配完成,一般使用Levenshtein編輯距離算法,Levenshtein距離是指兩個文本由一個轉(zhuǎn)換成另一個需要的最少編輯次數(shù),此處的編輯是指替換、插入和刪除操作。代碼示例:
import Levenshtein
max_distance = 30
distance = Levenshtein.distance(text1, text2)
if distance < max_distance:
print("匹 配 成 功, Levenshtein距 離 是:{}".format(distance))
else:
print("匹 配 不 成 功, Levenshtein距 離 是:{}".format(distance))
其中text1和text2是進行匹配的文本,如果Levenshtein距離小于30,則認為匹配成功,否則匹配失敗。
分詞就是將句子切分成一個一個詞匯,它是實現(xiàn)文本搜索、統(tǒng)計功能和自然語言處理等的基礎(chǔ),中文分詞的算法和庫都很多,這里介紹Jieba中文分詞庫。代碼示例:
import jieba
words = jieba.cut(text, cut_all=True)
print("全模式:{} ".format(words)))
words = jieba.cut(text, cut_all=False)
print("精確模式模式:{} ".format(words)))
words = jieba.cut_for_search(text)
print("搜索引擎模式:{} ".format(words)))
其中text為需要分解的文本,words為切分后的詞匯列表。分詞有三種分詞模式,精確模式、全模式、搜索引擎模式。精確模式是常用模式,適合文本分析,全模式是把所有可以成詞的詞匯都切分出來,搜索引擎模式會對長詞再次切分,適用于搜索關(guān)鍵字切分。
若需要對文本進行進一步的處理,可以使用NLP工具實現(xiàn)詞性標注、命名實體識別、依存句法分析、語義角色標注等自然語言處理功能。