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