版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
大數(shù)據(jù)采集及預(yù)處理技術(shù)*
*項(xiàng)目三語(yǔ)音直播數(shù)據(jù)采集與預(yù)處理序號(hào)軟件配置要求1OBS最新版本2Praat等最新版本一、項(xiàng)目目標(biāo):1、根據(jù)應(yīng)用需求確定語(yǔ)音數(shù)據(jù)采集方法,并完成語(yǔ)音數(shù)據(jù)采集;2、對(duì)采集的語(yǔ)音數(shù)據(jù)進(jìn)行去噪、歸一化、采樣頻率轉(zhuǎn)換、語(yǔ)音特征提取、靜音去除、語(yǔ)音切分、信號(hào)增強(qiáng)等預(yù)處理操作;3、根據(jù)訓(xùn)練模型要求完成語(yǔ)音數(shù)據(jù)文本轉(zhuǎn)錄、音頻分割、標(biāo)簽標(biāo)注等,為不同模型準(zhǔn)備訓(xùn)練數(shù)據(jù)。二、環(huán)境要求:任務(wù)三語(yǔ)音直播數(shù)據(jù)標(biāo)注一、任務(wù)目標(biāo)(1)掌握語(yǔ)音內(nèi)容的常見(jiàn)標(biāo)簽體系,如情緒標(biāo)簽(積極、消極、中性)、內(nèi)容主題標(biāo)簽(教育、娛樂(lè)、新聞等)、語(yǔ)速、音量等。(2)使用praat語(yǔ)音標(biāo)注工具完成語(yǔ)音直播數(shù)據(jù)的主題標(biāo)簽標(biāo)注,了解LabelStudio語(yǔ)音標(biāo)注工具使用方法。(3)使用praat語(yǔ)音標(biāo)注工具提取語(yǔ)音直播數(shù)據(jù)中的關(guān)鍵詞,導(dǎo)出標(biāo)注的數(shù)據(jù),并查看其基本格式。(4)了解標(biāo)注數(shù)據(jù)的質(zhì)量控制,學(xué)習(xí)標(biāo)注數(shù)據(jù)的質(zhì)量控制方法,確保數(shù)據(jù)集的完整性和標(biāo)注的準(zhǔn)確性,根據(jù)所學(xué)理論完成語(yǔ)音直播數(shù)據(jù)的標(biāo)注質(zhì)量檢查。1、語(yǔ)音標(biāo)注語(yǔ)音標(biāo)注是指對(duì)語(yǔ)音數(shù)據(jù)進(jìn)行標(biāo)記和注釋?zhuān)员阌糜谡Z(yǔ)音識(shí)別、語(yǔ)音合成、情感識(shí)別等領(lǐng)域的訓(xùn)練和評(píng)估。1)數(shù)據(jù)預(yù)處理:對(duì)收集到的語(yǔ)音數(shù)據(jù)進(jìn)行預(yù)處理,可能包括去噪、降采樣、音頻格式轉(zhuǎn)換等操作。2)標(biāo)注工具選擇:常見(jiàn)的標(biāo)注工具包括praat、Audacity、LabelStudio等。2、標(biāo)注類(lèi)型
1)語(yǔ)音段標(biāo)注
使用標(biāo)注工具在音頻波形圖上標(biāo)記出語(yǔ)音段的起始點(diǎn)和結(jié)束點(diǎn),進(jìn)行打標(biāo)簽、注釋或分類(lèi),比如標(biāo)記說(shuō)話者、標(biāo)記語(yǔ)音片段的內(nèi)容等。2)語(yǔ)音詞語(yǔ)標(biāo)注
在進(jìn)行語(yǔ)音識(shí)別模型訓(xùn)練時(shí),有時(shí)需要對(duì)語(yǔ)音中的詞語(yǔ)進(jìn)行標(biāo)注,即將語(yǔ)音與對(duì)應(yīng)的文字轉(zhuǎn)錄進(jìn)行對(duì)齊。這種標(biāo)注常用于監(jiān)督式學(xué)習(xí)任務(wù)。3)情感標(biāo)注
有些場(chǎng)景下需要對(duì)語(yǔ)音中所表達(dá)的情感進(jìn)行標(biāo)注,比如喜怒哀樂(lè)、焦慮平靜等,這對(duì)于情感識(shí)別研究和應(yīng)用具有重要意義。4)質(zhì)量控制
完成標(biāo)注后,需要進(jìn)行質(zhì)量控制,包括對(duì)標(biāo)注的一致性、正確性進(jìn)行檢查,以及針對(duì)特定問(wèn)題的再標(biāo)注或修正。3、Praat語(yǔ)音標(biāo)注Praat是一款跨平臺(tái)的多功能語(yǔ)音專(zhuān)業(yè)軟件,主要用于對(duì)數(shù)字化的語(yǔ)音信號(hào)進(jìn)行分析、標(biāo)注、處理及合成等實(shí)驗(yàn),同時(shí)生成各種語(yǔ)圖和文字報(bào)表。
官方下載地址:https://www.fon.hum.uva.nl/praat/
選擇Windows、Mac或linux版本使用步驟1)導(dǎo)入語(yǔ)音文件點(diǎn)擊praat—>open—>readfromfile—>找到你打開(kāi)的文件—>打開(kāi),文件被添加在了praat中;2)生成TextGrid文件選中要轉(zhuǎn)寫(xiě)的語(yǔ)音文件—>annotate-—>ToTextGrid...—>語(yǔ)音文件分層(三層,每層用戶(hù)自定義要標(biāo)注的信息比如“說(shuō)話人名、說(shuō)話內(nèi)容、感情等等”)如下圖:點(diǎn)擊OK生成TextGrid文件;3)編輯語(yǔ)音和TextGrid文件同時(shí)選中語(yǔ)音文件和TextGrid文件—>View&Edit;如圖:(1)時(shí)間邊界定位按Tab鍵可以播放語(yǔ)音,再次按Tab鍵可以停止播放語(yǔ)音;滾動(dòng)鼠標(biāo)可以放大波形,縮小波形。ctrl+s可以保存TextGrid文件。(2)長(zhǎng)聲音切分添加時(shí)間邊界后選擇其中一段,點(diǎn)擊file->SaveselectedsoundasWAVfile...即可(3)給邊界區(qū)域加文字在標(biāo)注層,可以輸入語(yǔ)音片段對(duì)應(yīng)的文字,也可以增加標(biāo)注層,在“Tier”菜單選擇“AddInternaltier…”,輸入標(biāo)注層名,然后選擇整個(gè)語(yǔ)音片段輸入對(duì)應(yīng)的文字信息。(4)保存和讀取標(biāo)注文件保存可以自己寫(xiě)Python去解析這個(gè).TextGrid格式文本。pip3installtextgrid謝謝!大數(shù)據(jù)采集與預(yù)處理技術(shù)*
*項(xiàng)目三語(yǔ)音直播數(shù)據(jù)采集與預(yù)處理序號(hào)軟件配置要求1OBS最新版本2Labelstudio等最新版本一、項(xiàng)目目標(biāo):1、根據(jù)應(yīng)用需求確定語(yǔ)音數(shù)據(jù)采集方法,并完成語(yǔ)音數(shù)據(jù)采集;2、對(duì)采集的語(yǔ)音數(shù)據(jù)進(jìn)行去噪、歸一化、采樣頻率轉(zhuǎn)換、語(yǔ)音特征提取、靜音去除、語(yǔ)音切分、信號(hào)增強(qiáng)等預(yù)處理操作;3、根據(jù)訓(xùn)練模型要求完成語(yǔ)音數(shù)據(jù)文本轉(zhuǎn)錄、音頻分割、標(biāo)簽標(biāo)注等,為不同模型準(zhǔn)備訓(xùn)練數(shù)據(jù)。二、環(huán)境要求:1、LabelStudio語(yǔ)音標(biāo)注LabelStudio提供了對(duì)音頻數(shù)據(jù)的標(biāo)注支持,適用于語(yǔ)音識(shí)別、音頻事件檢測(cè)和語(yǔ)音分類(lèi)等多種音頻任務(wù)。(1)創(chuàng)建項(xiàng)目
LabelStudio安裝后在文本標(biāo)注部分已經(jīng)詳細(xì)說(shuō)明,讀者可以查閱參考,本處不在贅述。
啟動(dòng)LabelStudio,登錄用戶(hù),然后可以選擇“Create”創(chuàng)建項(xiàng)目,選擇“Audio/SpeechProcessing”。
以“AutomaticSpeechRecognitionusingSegments”自動(dòng)語(yǔ)音片段轉(zhuǎn)寫(xiě)文本和“SpeechTranscripton”(語(yǔ)音轉(zhuǎn)錄)任務(wù)為例講解。先選擇“AutomaticSpeechRecognitionusingSegments”,彈出項(xiàng)目信息設(shè)置頁(yè)面,可以選擇添加標(biāo)簽,刪除標(biāo)簽,也可以選擇“DataImport”導(dǎo)入要標(biāo)注的數(shù)據(jù)(可以選多個(gè)),如果項(xiàng)目設(shè)置時(shí)不導(dǎo)入數(shù)據(jù),打開(kāi)項(xiàng)目會(huì)提示導(dǎo)入數(shù)據(jù)。(2)語(yǔ)音轉(zhuǎn)文本標(biāo)注項(xiàng)目創(chuàng)建后,點(diǎn)擊進(jìn)入項(xiàng)目后,選擇要標(biāo)注的數(shù)據(jù),點(diǎn)擊對(duì)應(yīng)的數(shù)據(jù),就進(jìn)入標(biāo)注頁(yè)面。選擇數(shù)據(jù)進(jìn)入標(biāo)注頁(yè)面,在語(yǔ)音音頻圖形上拖動(dòng)鼠標(biāo)可以對(duì)語(yǔ)音進(jìn)行分段,然后選擇“人聲”或“噪音”標(biāo)簽,在下方可以輸入對(duì)應(yīng)的文本,點(diǎn)擊“Add”完成該片段標(biāo)注。按照上述操作完成其他片段操作即可(3)標(biāo)注數(shù)據(jù)導(dǎo)出需要注意的是每次標(biāo)注完成后,選擇“Submit”提交任務(wù)。完成標(biāo)注后跳轉(zhuǎn)到項(xiàng)目頁(yè),在右上方選擇“Export”可以導(dǎo)出標(biāo)注的數(shù)據(jù),這里需要注意,不同的任務(wù)可能需要不同標(biāo)注數(shù)據(jù)類(lèi)型,這里根據(jù)實(shí)際需要選擇。這里選擇“ASRManifest”導(dǎo)出。打開(kāi)標(biāo)注數(shù)據(jù)包,audio文件夾存放的是音頻文件,manifest.json是存放的標(biāo)注數(shù)據(jù)。(4)語(yǔ)音轉(zhuǎn)錄標(biāo)注選擇創(chuàng)建“SpeechTranscripton”(語(yǔ)音轉(zhuǎn)錄)項(xiàng)目,導(dǎo)入數(shù)據(jù),選擇標(biāo)注數(shù)據(jù),進(jìn)入標(biāo)注頁(yè)面,在語(yǔ)音音頻圖形上拖動(dòng)鼠標(biāo)對(duì)語(yǔ)音進(jìn)行分段,選擇“Speech”(人聲)或“Noise”(噪音)標(biāo)簽,在下方可以選擇語(yǔ)音的感情分類(lèi)標(biāo)簽。按照該操作完成其他片段操作即可。數(shù)據(jù)標(biāo)注完成導(dǎo)出標(biāo)注數(shù)據(jù)即可。謝謝!大數(shù)據(jù)采集與預(yù)處理技術(shù)*
*項(xiàng)目三語(yǔ)音直播數(shù)據(jù)采集與預(yù)處理序號(hào)軟件配置要求1OBS最新版本2Librosa等最新版本一、項(xiàng)目目標(biāo):1、根據(jù)應(yīng)用需求確定語(yǔ)音數(shù)據(jù)采集方法,并完成語(yǔ)音數(shù)據(jù)采集;2、對(duì)采集的語(yǔ)音數(shù)據(jù)進(jìn)行去噪、歸一化、采樣頻率轉(zhuǎn)換、語(yǔ)音特征提取、靜音去除、語(yǔ)音切分、信號(hào)增強(qiáng)等預(yù)處理操作;3、根據(jù)訓(xùn)練模型要求完成語(yǔ)音數(shù)據(jù)文本轉(zhuǎn)錄、音頻分割、標(biāo)簽標(biāo)注等,為不同模型準(zhǔn)備訓(xùn)練數(shù)據(jù)。二、環(huán)境要求:1、語(yǔ)音直播數(shù)據(jù)文本轉(zhuǎn)錄語(yǔ)音直播數(shù)據(jù)文本轉(zhuǎn)錄需要將語(yǔ)音數(shù)據(jù)中的口語(yǔ)內(nèi)容逐字逐句轉(zhuǎn)成文本,用于訓(xùn)練語(yǔ)音識(shí)別(ASR)系統(tǒng),幫助模型學(xué)習(xí)語(yǔ)音和文本之間的對(duì)應(yīng)關(guān)系。比如音頻中的話語(yǔ)“我喜歡閱讀”轉(zhuǎn)錄為文字“我喜歡閱讀”。
對(duì)于大規(guī)模的語(yǔ)音數(shù)據(jù)文本轉(zhuǎn)錄,通過(guò)自動(dòng)化語(yǔ)音識(shí)別API進(jìn)行是較為優(yōu)先選擇,轉(zhuǎn)換后可以通過(guò)人工檢查方法對(duì)錯(cuò)誤的轉(zhuǎn)錄進(jìn)行調(diào)整,這種方法可以保證轉(zhuǎn)錄速度和質(zhì)量。讀者可以參考“任務(wù)一語(yǔ)音直播數(shù)據(jù)采集”部分,使用科大訊飛語(yǔ)音轉(zhuǎn)錄API進(jìn)行處理。#參考代碼:importbase64,hashlib,hmac,json,timeimportrequestsfromurllib.parseimporturlencodeclassIFlytekASR: #類(lèi)初始化接口
def__init__(self,appid,api_key,api_secret):self.appid=appidself.api_key=api_keyself.api_secret=api_secretself.host="/v1/service/v1/iat"self.file_path=None(接下頁(yè))(接上頁(yè))
#認(rèn)證功能函數(shù)
defgenerate_auth_url(self):cur_time=str(int(time.time()))params={"app_id":self.appid,"cur_time":cur_time,"nonce_str":"random_string","signa":self.generate_signature(cur_time)}returnf"{self.host}?{urlencode(params)}"#生成認(rèn)證信息
defgenerate_signature(self,cur_time):signature_raw=self.api_key+cur_time+"random_string"signature=hmac.new(self.api_secret.encode(),signature_raw.encode(),hashlib.sha256).hexdigest()returnsignature#文本轉(zhuǎn)錄
defaudio_to_text(self,file_path):withopen(file_path,"rb")asf:audio_data=f.read()audio_base64=base64.b64encode(audio_data).decode()headers={"Content-Type":"application/json","Accept":"application/json"}data={"audio":audio_base64,"aue":"raw","engine_type":"sms16k",}response=requests.post(self.generate_auth_url(),headers=headers,data=json.dumps(data))result=response.json()ifresult.get("code")=="0":returnresult.get("data")else:print(f"Error:{result.get('desc')}")returnNone(接上頁(yè))#初始化API對(duì)象appid="your_appid"#替換為你的APPIDapi_key="your_api_key"#替換為你的APIKeyapi_secret="your_api_secret"#替換為你的APISecretasr=IFlytekASR(appid,api_key,api_secret)#處理多個(gè)語(yǔ)音文件audio_files=["audio1.wav","audio2.wav","audio3.wav"]#替換為你的文件路徑forfileinaudio_files:print(f"Processing{file}...")text=asr.audio_to_text(file)iftext:print(f"Transcriptof{file}:{text}")2、語(yǔ)音直播數(shù)據(jù)情感標(biāo)注使用labelstudio工具創(chuàng)建語(yǔ)音標(biāo)注項(xiàng)目,選擇“IntentClassification”類(lèi)別。進(jìn)入項(xiàng)目設(shè)置頁(yè),可以在“Addlabelnames”功能處添加“speech”和“noise”兩類(lèi)標(biāo)簽,這是用于標(biāo)注哪些語(yǔ)音段是語(yǔ)音表達(dá),哪些是停頓時(shí)的背景噪聲。同時(shí)在“Addchoices”功能欄添加“憤怒”、“高興”、“平靜”、“悲傷”、“驚訝”、“其他”幾個(gè)選擇,是用于對(duì)語(yǔ)音段的表達(dá)情感進(jìn)行標(biāo)注。導(dǎo)入待標(biāo)注的語(yǔ)音數(shù)據(jù),根據(jù)語(yǔ)音片段表達(dá)的情感對(duì)語(yǔ)音進(jìn)行分段,如果是噪聲或者背景聲也分為一段。對(duì)每一段音頻數(shù)據(jù),如果具有情感表達(dá),就標(biāo)記為“Segment”,并選擇對(duì)應(yīng)的情感,否則標(biāo)記為“noise”,選擇“其他”。3、語(yǔ)音直播數(shù)據(jù)事件標(biāo)注語(yǔ)音直播數(shù)據(jù)事件標(biāo)注相對(duì)簡(jiǎn)單,主要是對(duì)音頻分段,然后輸入語(yǔ)音片段出現(xiàn)的非語(yǔ)言事件,如笑聲、鼓掌、咳嗽、背景音樂(lè)等。這類(lèi)標(biāo)注主要用于背景聲音識(shí)別、事件檢測(cè)和環(huán)境音分析。使用labelstudio工具創(chuàng)建語(yǔ)音標(biāo)注項(xiàng)目,選擇“SoundEventDetection”類(lèi)別。進(jìn)入項(xiàng)目設(shè)置頁(yè),可以在“Addlabelnames”功能處添加“笑聲”、“鼓掌”、“打賞”、“音樂(lè)”、“其他”等標(biāo)簽,用于標(biāo)注語(yǔ)音段事件。導(dǎo)入待標(biāo)注的語(yǔ)音數(shù)據(jù),根據(jù)語(yǔ)音中包含的事件對(duì)語(yǔ)音進(jìn)行分段,并選擇對(duì)應(yīng)的事件標(biāo)簽,如果事件不在列表中,可以選擇添加新標(biāo)簽,也可以根據(jù)需要選擇“其他”。上圖語(yǔ)音事件標(biāo)注,有多段事件,注意選擇片段切片時(shí),應(yīng)準(zhǔn)確標(biāo)注事件對(duì)應(yīng)的聲音,不要選擇過(guò)多的說(shuō)話語(yǔ)音片段。謝謝!大數(shù)據(jù)采集及預(yù)處理技術(shù)*
*語(yǔ)音直播標(biāo)注數(shù)據(jù)使用序號(hào)軟件配置要求1Pytorch/2sklearn/一、項(xiàng)目目標(biāo):1、了解簡(jiǎn)單語(yǔ)音轉(zhuǎn)文本模型構(gòu)建方法。2、能夠使用標(biāo)注的直播數(shù)據(jù)訓(xùn)練語(yǔ)音轉(zhuǎn)義模型。3、熟悉自然語(yǔ)言處理語(yǔ)音轉(zhuǎn)錄模型的測(cè)試方法。二、環(huán)境要求:importosimporttorchimporttorch.nnasnnimporttorch.optimasoptimfromtorch.utils.dataimportDataset,DataLoaderimportnumpyasnpimportlibrosafromsklearn.model_selectionimporttrain_test_splitfromcollectionsimportCounterimporttorchaudioimporttorchaudio.transformsasTimportpandasaspd1、導(dǎo)入依賴(lài)庫(kù)classSpeechDataset(Dataset):def__init__(self,audio_paths,labels,char_to_idx,sample_rate=16000,max_audio_len=160000):"""audio_paths:音頻文件路徑列表,labels:對(duì)應(yīng)的文本標(biāo)簽列表,char_to_idx:字符到索引的映射字典,psample_rate:音頻采樣率,max_audio_len:音頻最大長(zhǎng)度(超過(guò)部分截?cái)啵蛔悴糠痔畛洌?""self.audio_paths=audio_pathsself.labels=labelsself.char_to_idx=char_to_idxself.sample_rate=sample_rateself.max_audio_len=max_audio_len#定義MFCC變換
self.mfcc_transform=T.MFCC(sample_rate=self.sample_rate,n_mfcc=40,melkwargs={'n_fft':512,'win_length':400,'hop_length':160,'n_mels':128,'center':False#避免邊緣填充
})2、自定義數(shù)據(jù)集類(lèi)def__getitem__(self,idx):"""獲取單個(gè)樣本,paramidx:樣本索引,return:音頻特征(MFCC)和對(duì)應(yīng)的標(biāo)簽索引"""audio_path=self.audio_paths[idx]waveform,sample_rate=torchaudio.load(audio_path)#轉(zhuǎn)換為單聲道(取均值)ifwaveform.shape[0]>1:#如果是立體聲
waveform=torch.mean(waveform,dim=0,keepdim=True)
#重采樣(如果需要)
ifsample_rate!=self.sample_rate:resampler=T.Resample(sample_rate,self.sample_rate)waveform=resampler(waveform)#標(biāo)準(zhǔn)化長(zhǎng)度
ifwaveform.shape[1]>self.max_audio_len:waveform=waveform[:,:self.max_audio_len]else:padding_length=self.max_audio_len-waveform.shape[1]waveform=torch.nn.functional.pad(waveform,(0,padding_length))#提取MFCC特征-確保輸出是2D(time_steps,n_mfcc)mfcc=self.mfcc_transform(waveform)#(1,n_mfcc,time_steps)mfcc=mfcc.squeeze(0).transpose(0,1)#(time_steps,n_mfcc)#處理標(biāo)簽
label=self.labels[idx]label_indices=[self.char_to_idx.get(char,1)forcharinlabel]#1是<UNK>的索引
label_indices=torch.tensor(label_indices,dtype=torch.long)returnmfcc,label_indices
def__len__(self):"""返回?cái)?shù)據(jù)集大小"""returnlen(self.audio_paths)classSpeechToTextModel(nn.Module):def__init__(self,input_dim,hidden_dim,output_dim,num_layers=2):"""初始化語(yǔ)音轉(zhuǎn)文本模型,input_dim:輸入特征維度(MFCC特征維度),hidden_dim:RNN隱藏層維度,output_dim:輸出維度(字符數(shù)量),num_layers:RNN層數(shù)"""super(SpeechToTextModel,self).__init__()self.rnn=nn.LSTM(input_dim,hidden_dim,num_layers,batch_first=True,bidirectional=True,dropout=0.3ifnum_layers>1else0)self.fc=nn.Linear(hidden_dim*2,output_dim)#雙向LSTM,輸出維度為hidden_dim*2defforward(self,x,x_lengths):"""前向傳播,paramx:輸入特征(batch_size,時(shí)間步,特征維度),return:模型輸出(batch_size,時(shí)間步,輸出維度)"""#x:(batch_size,time_steps,input_dim),x_lengths:各序列實(shí)際長(zhǎng)度
#打包序列
packed_input=nn.utils.rnn.pack_padded_sequence(x,x_lengths.cpu(),batch_first=True,enforce_sorted=True)packed_output,_=self.rnn(packed_input)#解包序列
output,_=nn.utils.rnn.pad_packed_sequence(packed_output,batch_first=True)logits=self.fc(output)returnlogits3、模型定義#假設(shè)標(biāo)注文件包含音頻路徑和對(duì)應(yīng)文本標(biāo)簽,CSV文件data=pd.read_csv('custom_dataset.csv')char_counts=Counter() #構(gòu)建字符到索引的映射forlabelindata['label']:char_counts.update(label)char_to_idx={'<PAD>':0,'<UNK>':1}forchar,countinchar_counts.items():ifcount>=2: #只保留出現(xiàn)次數(shù)大于等于2的字符
char_to_idx[char]=len(char_to_idx)#分割數(shù)據(jù)集為訓(xùn)練集和驗(yàn)證集train_paths,val_paths,train_labels,val_labels=train_test_split(data['audio_path'],data['label'],test_size=0.2,random_state=42)#將PandasSeries轉(zhuǎn)換為列表train_paths=train_paths.tolist()val_paths=val_paths.tolist()train_labels=train_labels.tolist()val_labels=val_labels.tolist()4、數(shù)據(jù)預(yù)處理#創(chuàng)建數(shù)據(jù)集和數(shù)據(jù)加載器sample_rate=16000max_audio_len=160000 #10秒音頻(假設(shè)采樣率為16kHz)train_dataset=SpeechDataset(train_paths,train_labels,char_to_idx,sample_rate,max_audio_len)val_dataset=SpeechDataset(val_paths,val_labels,char_to_idx,sample_rate,max_audio_len)train_loader=DataLoader(train_dataset,batch_size=16,shuffle=True,collate_fn=collate_fn)val_loader=DataLoader(val_dataset,batch_size=16,shuffle=False,collate_fn=collate_fn)#超參數(shù)input_dim=40 #MFCC特征維度hidden_dim=256 #RNN隱藏層維度output_dim=len(char_to_idx)#輸出維度(字符數(shù)量)num_layers=2 #RNN層數(shù)num_epochs=10 #訓(xùn)練輪數(shù)learning_rate=0.001 #學(xué)習(xí)率4、數(shù)據(jù)預(yù)處理#添加自定義collate_fn處理變長(zhǎng)序列defcollate_fn(batch):#按MFCC序列長(zhǎng)度排序(降序)
batch.sort(key=lambdax:x[0].shape[0],reverse=True)#分離MFCC和標(biāo)簽
mfccs,labels=zip(*batch)#獲取各序列長(zhǎng)度
mfcc_lengths=torch.tensor([mfcc.shape[0]formfccinmfccs])max_mfcc_length=mfcc_lengths.max().item()#獲取特征維度
feature_dim=mfccs[0].shape[1]#初始化填充后的MFCC張量(batch_size,max_length,feature_dim)padded_mfccs=torch.zeros(len(mfccs),max_mfcc_length,feature_dim)#填充MFCC序列
fori,mfccinenumerate(mfccs):length=mfcc.shape[0]padded_mfccs[i,:length,:]=mfcc#處理標(biāo)簽
label_lengths=torch.tensor([len(label)forlabelinlabels])max_label_length=label_lengths.max().item()#初始化填充后的標(biāo)簽張量(batch_size,max_label_length)padded_labels=torch.zeros(len(labels),max_label_length,dtype=torch.long)#填充標(biāo)簽
fori,labelinenumerate(labels):length=label.shape[0]padded_labels[i,:length]=labelreturnpadded_mfccs,mfcc_lengths,padded_labels,label_lengths#初始化模型、損失函數(shù)和優(yōu)化器model=SpeechToTextModel(input_dim,hidden_dim,output_dim,num_layers)criterion=nn.CTCLoss(blank=0)#blank對(duì)應(yīng)<PAD>標(biāo)記optimizer=optim.Adam(model.parameters(),lr=learning_rate)#訓(xùn)練循環(huán)forepochinrange(num_epochs):model.train()total_loss=0formfccs,mfcc_lengths,labels,label_lengthsintrain_loader:optimizer.zero_grad()logits=model(mfccs,mfcc_lengths)#準(zhǔn)備CTC輸入(time_steps,batch_size,num_classes)log_probs=logits.transpose(0,1).log_softmax(2)#計(jì)算CTC損失
loss=criterion(log_probs,labels,mfcc_lengths//2,#考慮可能的卷積下采樣
label_lengths)loss.backward()optimizer.step()total_loss+=loss.item()avg_train_loss=total_loss/len(train_loader)print(f'Epoch[{epoch+1}/{num_epochs}],TrainLoss:{avg_train_loss:.4f}')5、模型訓(xùn)練#驗(yàn)證
model.eval()val_loss=0withtorch.no_grad():formfccs,mfcc_lengths,labels,label_lengthsinval_loader:logits=model(mfccs,mfcc_lengths)log_probs=logits.transpose(0,1).log_softmax(2)loss=criterion(log_probs,labels,mfcc_lengths//2,label_lengths)val_loss+=loss.item()avg_val_loss=val_loss/len(val_loader)print(f'Epoch[{epoch+1}/{num_epochs}],ValLoss:{avg_val_loss:.4f}')#保存模型
"""保存模型和所有必要參數(shù)"""state={'model_state_dict':model.state_dict(),'optimizer_state_dict':optimizer.state_dict()ifoptimizerelseNone,'epoch':epoch,'loss':loss,'char_to_idx':char_to_idx,#必須保存字符映射
}torch.save(state,f'speech_to_text_model_epoch{epoch+1}.pth')importosimporttorchfrommodelAudioToTextimportSpeechToTextModel,SpeechDatasetdefload_model(model_path,input_dim=40,hidden_dim=256,device='cpu'):#加載保存的狀態(tài)
state=torch.load(model_path,map_location=device)#重建字符映射
char_to_idx=state['char_to_idx']idx_to_char={v:kfork,vinchar_to_idx.items()}#初始化模型結(jié)構(gòu)
model=SpeechToTextModel(input_dim=input_dim,hidden_dim=hidden_dim,output_dim=len(char_to_idx),num_layers=2).to(device)#加載模型參數(shù)
model.load_state_dict(state['model_state_dict'])model.eval()print(f"模型從{model_path}加載成功")returnmodel,char_to_idx,idx_to_char6、模型加載和推理defpredict_audio(model,audio_path,char_to_idx,idx_to_char,device
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年鄭州市中原銀行農(nóng)村普惠金融支付服務(wù)點(diǎn)招聘?jìng)淇碱}庫(kù)及1套完整答案詳解
- 旅館治安管理制度
- 2025年興業(yè)銀行拉薩分行社會(huì)招聘?jìng)淇碱}庫(kù)及答案詳解參考
- 2025年為棗莊市檢察機(jī)關(guān)公開(kāi)招聘聘用制書(shū)記員的備考題庫(kù)及完整答案詳解一套
- 黑龍江公安警官職業(yè)學(xué)院《英語(yǔ)口語(yǔ)》2025 學(xué)年第二學(xué)期期末試卷
- c語(yǔ)言課程設(shè)計(jì)紙牌代碼
- 2025河南信陽(yáng)藝術(shù)職業(yè)學(xué)院招才引智招聘專(zhuān)業(yè)技術(shù)人員32人備考核心題庫(kù)及答案解析
- c語(yǔ)言課程設(shè)計(jì)大數(shù)階乘
- 2025湖北武漢人才招聘工作人員-派往武漢商學(xué)院工作1人筆試重點(diǎn)題庫(kù)及答案解析
- 2025年揚(yáng)州市江都婦幼保健院公開(kāi)招聘編外合同制專(zhuān)業(yè)技術(shù)人員備考題庫(kù)及參考答案詳解
- 儲(chǔ)備林項(xiàng)目環(huán)境影響評(píng)估報(bào)告
- 2025至2030年中國(guó)裂隙燈顯微鏡行業(yè)市場(chǎng)調(diào)查研究及未來(lái)趨勢(shì)預(yù)測(cè)報(bào)告
- 2025春季學(xué)期國(guó)開(kāi)電大本科《管理英語(yǔ)4》一平臺(tái)機(jī)考真題及答案(第十四套)
- 協(xié)會(huì)財(cái)務(wù)支出管理制度
- 第四版(2025)國(guó)際壓力性損傷潰瘍預(yù)防和治療臨床指南解讀
- 廣東省工程勘察設(shè)計(jì)服務(wù)成本取費(fèi)導(dǎo)則(2024版)
- CNAS GL027-2023 化學(xué)分析實(shí)驗(yàn)室內(nèi)部質(zhì)量控制指南-控制圖的應(yīng)用
- 《汽車(chē)文化(第二版)》中職全套教學(xué)課件
- 生命倫理學(xué):生命醫(yī)學(xué)科技與倫理 知到智慧樹(shù)網(wǎng)課答案
- 23秋國(guó)家開(kāi)放大學(xué)《漢語(yǔ)基礎(chǔ)》期末大作業(yè)(課程論文)參考答案
- 關(guān)于建立英國(guó)常任文官制度的報(bào)告
評(píng)論
0/150
提交評(píng)論