版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
大数据采集及预处理技术*
*项目三语音直播数据采集与预处理序号软件配置要求1OBS最新版本2Praat等最新版本一、项目目标:1、根据应用需求确定语音数据采集方法,并完成语音数据采集;2、对采集的语音数据进行去噪、归一化、采样频率转换、语音特征提取、静音去除、语音切分、信号增强等预处理操作;3、根据训练模型要求完成语音数据文本转录、音频分割、标签标注等,为不同模型准备训练数据。二、环境要求:任务三语音直播数据标注一、任务目标(1)掌握语音内容的常见标签体系,如情绪标签(积极、消极、中性)、内容主题标签(教育、娱乐、新闻等)、语速、音量等。(2)使用praat语音标注工具完成语音直播数据的主题标签标注,了解LabelStudio语音标注工具使用方法。(3)使用praat语音标注工具提取语音直播数据中的关键词,导出标注的数据,并查看其基本格式。(4)了解标注数据的质量控制,学习标注数据的质量控制方法,确保数据集的完整性和标注的准确性,根据所学理论完成语音直播数据的标注质量检查。1、语音标注语音标注是指对语音数据进行标记和注释,以便用于语音识别、语音合成、情感识别等领域的训练和评估。1)数据预处理:对收集到的语音数据进行预处理,可能包括去噪、降采样、音频格式转换等操作。2)标注工具选择:常见的标注工具包括praat、Audacity、LabelStudio等。2、标注类型
1)语音段标注
使用标注工具在音频波形图上标记出语音段的起始点和结束点,进行打标签、注释或分类,比如标记说话者、标记语音片段的内容等。2)语音词语标注
在进行语音识别模型训练时,有时需要对语音中的词语进行标注,即将语音与对应的文字转录进行对齐。这种标注常用于监督式学习任务。3)情感标注
有些场景下需要对语音中所表达的情感进行标注,比如喜怒哀乐、焦虑平静等,这对于情感识别研究和应用具有重要意义。4)质量控制
完成标注后,需要进行质量控制,包括对标注的一致性、正确性进行检查,以及针对特定问题的再标注或修正。3、Praat语音标注Praat是一款跨平台的多功能语音专业软件,主要用于对数字化的语音信号进行分析、标注、处理及合成等实验,同时生成各种语图和文字报表。
官方下载地址:https://www.fon.hum.uva.nl/praat/
选择Windows、Mac或linux版本使用步骤1)导入语音文件点击praat—>open—>readfromfile—>找到你打开的文件—>打开,文件被添加在了praat中;2)生成TextGrid文件选中要转写的语音文件—>annotate-—>ToTextGrid...—>语音文件分层(三层,每层用户自定义要标注的信息比如“说话人名、说话内容、感情等等”)如下图:点击OK生成TextGrid文件;3)编辑语音和TextGrid文件同时选中语音文件和TextGrid文件—>View&Edit;如图:(1)时间边界定位按Tab键可以播放语音,再次按Tab键可以停止播放语音;滚动鼠标可以放大波形,缩小波形。ctrl+s可以保存TextGrid文件。(2)长声音切分添加时间边界后选择其中一段,点击file->SaveselectedsoundasWAVfile...即可(3)给边界区域加文字在标注层,可以输入语音片段对应的文字,也可以增加标注层,在“Tier”菜单选择“AddInternaltier…”,输入标注层名,然后选择整个语音片段输入对应的文字信息。(4)保存和读取标注文件保存可以自己写Python去解析这个.TextGrid格式文本。pip3installtextgrid谢谢!大数据采集与预处理技术*
*项目三语音直播数据采集与预处理序号软件配置要求1OBS最新版本2Labelstudio等最新版本一、项目目标:1、根据应用需求确定语音数据采集方法,并完成语音数据采集;2、对采集的语音数据进行去噪、归一化、采样频率转换、语音特征提取、静音去除、语音切分、信号增强等预处理操作;3、根据训练模型要求完成语音数据文本转录、音频分割、标签标注等,为不同模型准备训练数据。二、环境要求:1、LabelStudio语音标注LabelStudio提供了对音频数据的标注支持,适用于语音识别、音频事件检测和语音分类等多种音频任务。(1)创建项目
LabelStudio安装后在文本标注部分已经详细说明,读者可以查阅参考,本处不在赘述。
启动LabelStudio,登录用户,然后可以选择“Create”创建项目,选择“Audio/SpeechProcessing”。
以“AutomaticSpeechRecognitionusingSegments”自动语音片段转写文本和“SpeechTranscripton”(语音转录)任务为例讲解。先选择“AutomaticSpeechRecognitionusingSegments”,弹出项目信息设置页面,可以选择添加标签,删除标签,也可以选择“DataImport”导入要标注的数据(可以选多个),如果项目设置时不导入数据,打开项目会提示导入数据。(2)语音转文本标注项目创建后,点击进入项目后,选择要标注的数据,点击对应的数据,就进入标注页面。选择数据进入标注页面,在语音音频图形上拖动鼠标可以对语音进行分段,然后选择“人声”或“噪音”标签,在下方可以输入对应的文本,点击“Add”完成该片段标注。按照上述操作完成其他片段操作即可(3)标注数据导出需要注意的是每次标注完成后,选择“Submit”提交任务。完成标注后跳转到项目页,在右上方选择“Export”可以导出标注的数据,这里需要注意,不同的任务可能需要不同标注数据类型,这里根据实际需要选择。这里选择“ASRManifest”导出。打开标注数据包,audio文件夹存放的是音频文件,manifest.json是存放的标注数据。(4)语音转录标注选择创建“SpeechTranscripton”(语音转录)项目,导入数据,选择标注数据,进入标注页面,在语音音频图形上拖动鼠标对语音进行分段,选择“Speech”(人声)或“Noise”(噪音)标签,在下方可以选择语音的感情分类标签。按照该操作完成其他片段操作即可。数据标注完成导出标注数据即可。谢谢!大数据采集与预处理技术*
*项目三语音直播数据采集与预处理序号软件配置要求1OBS最新版本2Librosa等最新版本一、项目目标:1、根据应用需求确定语音数据采集方法,并完成语音数据采集;2、对采集的语音数据进行去噪、归一化、采样频率转换、语音特征提取、静音去除、语音切分、信号增强等预处理操作;3、根据训练模型要求完成语音数据文本转录、音频分割、标签标注等,为不同模型准备训练数据。二、环境要求:1、语音直播数据文本转录语音直播数据文本转录需要将语音数据中的口语内容逐字逐句转成文本,用于训练语音识别(ASR)系统,帮助模型学习语音和文本之间的对应关系。比如音频中的话语“我喜欢阅读”转录为文字“我喜欢阅读”。
对于大规模的语音数据文本转录,通过自动化语音识别API进行是较为优先选择,转换后可以通过人工检查方法对错误的转录进行调整,这种方法可以保证转录速度和质量。读者可以参考“任务一语音直播数据采集”部分,使用科大讯飞语音转录API进行处理。#参考代码:importbase64,hashlib,hmac,json,timeimportrequestsfromurllib.parseimporturlencodeclassIFlytekASR: #类初始化接口
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(接下页)(接上页)
#认证功能函数
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)}"#生成认证信息
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#文本转录
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(接上页)#初始化API对象appid="your_appid"#替换为你的APPIDapi_key="your_api_key"#替换为你的APIKeyapi_secret="your_api_secret"#替换为你的APISecretasr=IFlytekASR(appid,api_key,api_secret)#处理多个语音文件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、语音直播数据情感标注使用labelstudio工具创建语音标注项目,选择“IntentClassification”类别。进入项目设置页,可以在“Addlabelnames”功能处添加“speech”和“noise”两类标签,这是用于标注哪些语音段是语音表达,哪些是停顿时的背景噪声。同时在“Addchoices”功能栏添加“愤怒”、“高兴”、“平静”、“悲伤”、“惊讶”、“其他”几个选择,是用于对语音段的表达情感进行标注。导入待标注的语音数据,根据语音片段表达的情感对语音进行分段,如果是噪声或者背景声也分为一段。对每一段音频数据,如果具有情感表达,就标记为“Segment”,并选择对应的情感,否则标记为“noise”,选择“其他”。3、语音直播数据事件标注语音直播数据事件标注相对简单,主要是对音频分段,然后输入语音片段出现的非语言事件,如笑声、鼓掌、咳嗽、背景音乐等。这类标注主要用于背景声音识别、事件检测和环境音分析。使用labelstudio工具创建语音标注项目,选择“SoundEventDetection”类别。进入项目设置页,可以在“Addlabelnames”功能处添加“笑声”、“鼓掌”、“打赏”、“音乐”、“其他”等标签,用于标注语音段事件。导入待标注的语音数据,根据语音中包含的事件对语音进行分段,并选择对应的事件标签,如果事件不在列表中,可以选择添加新标签,也可以根据需要选择“其他”。上图语音事件标注,有多段事件,注意选择片段切片时,应准确标注事件对应的声音,不要选择过多的说话语音片段。谢谢!大数据采集及预处理技术*
*语音直播标注数据使用序号软件配置要求1Pytorch/2sklearn/一、项目目标:1、了解简单语音转文本模型构建方法。2、能够使用标注的直播数据训练语音转义模型。3、熟悉自然语言处理语音转录模型的测试方法。二、环境要求:importosimporttorchimporttorch.nnasnnimporttorch.optimasoptimfromtorch.utils.dataimportDataset,DataLoaderimportnumpyasnpimportlibrosafromsklearn.model_selectionimporttrain_test_splitfromcollectionsimportCounterimporttorchaudioimporttorchaudio.transformsasTimportpandasaspd1、导入依赖库classSpeechDataset(Dataset):def__init__(self,audio_paths,labels,char_to_idx,sample_rate=16000,max_audio_len=160000):"""audio_paths:音频文件路径列表,labels:对应的文本标签列表,char_to_idx:字符到索引的映射字典,psample_rate:音频采样率,max_audio_len:音频最大长度(超过部分截断,不足部分填充)"""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、自定义数据集类def__getitem__(self,idx):"""获取单个样本,paramidx:样本索引,return:音频特征(MFCC)和对应的标签索引"""audio_path=self.audio_paths[idx]waveform,sample_rate=torchaudio.load(audio_path)#转换为单声道(取均值)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)#标准化长度
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)#处理标签
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):"""返回数据集大小"""returnlen(self.audio_paths)classSpeechToTextModel(nn.Module):def__init__(self,input_dim,hidden_dim,output_dim,num_layers=2):"""初始化语音转文本模型,input_dim:输入特征维度(MFCC特征维度),hidden_dim:RNN隐藏层维度,output_dim:输出维度(字符数量),num_layers:RNN层数"""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,时间步,特征维度),return:模型输出(batch_size,时间步,输出维度)"""#x:(batch_size,time_steps,input_dim),x_lengths:各序列实际长度
#打包序列
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、模型定义#假设标注文件包含音频路径和对应文本标签,CSV文件data=pd.read_csv('custom_dataset.csv')char_counts=Counter() #构建字符到索引的映射forlabelindata['label']:char_counts.update(label)char_to_idx={'<PAD>':0,'<UNK>':1}forchar,countinchar_counts.items():ifcount>=2: #只保留出现次数大于等于2的字符
char_to_idx[char]=len(char_to_idx)#分割数据集为训练集和验证集train_paths,val_paths,train_labels,val_labels=train_test_split(data['audio_path'],data['label'],test_size=0.2,random_state=42)#将PandasSeries转换为列表train_paths=train_paths.tolist()val_paths=val_paths.tolist()train_labels=train_labels.tolist()val_labels=val_labels.tolist()4、数据预处理#创建数据集和数据加载器sample_rate=16000max_audio_len=160000 #10秒音频(假设采样率为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)#超参数input_dim=40 #MFCC特征维度hidden_dim=256 #RNN隐藏层维度output_dim=len(char_to_idx)#输出维度(字符数量)num_layers=2 #RNN层数num_epochs=10 #训练轮数learning_rate=0.001 #学习率4、数据预处理#添加自定义collate_fn处理变长序列defcollate_fn(batch):#按MFCC序列长度排序(降序)
batch.sort(key=lambdax:x[0].shape[0],reverse=True)#分离MFCC和标签
mfccs,labels=zip(*batch)#获取各序列长度
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#处理标签
label_lengths=torch.tensor([len(label)forlabelinlabels])max_label_length=label_lengths.max().item()#初始化填充后的标签张量(batch_size,max_label_length)padded_labels=torch.zeros(len(labels),max_label_length,dtype=torch.long)#填充标签
fori,labelinenumerate(labels):length=label.shape[0]padded_labels[i,:length]=labelreturnpadded_mfccs,mfcc_lengths,padded_labels,label_lengths#初始化模型、损失函数和优化器model=SpeechToTextModel(input_dim,hidden_dim,output_dim,num_layers)criterion=nn.CTCLoss(blank=0)#blank对应<PAD>标记optimizer=optim.Adam(model.parameters(),lr=learning_rate)#训练循环forepochinrange(num_epochs):model.train()total_loss=0formfccs,mfcc_lengths,labels,label_lengthsintrain_loader:optimizer.zero_grad()logits=model(mfccs,mfcc_lengths)#准备CTC输入(time_steps,batch_size,num_classes)log_probs=logits.transpose(0,1).log_softmax(2)#计算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、模型训练#验证
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}')#保存模型
"""保存模型和所有必要参数"""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'):#加载保存的状态
state=torch.load(model_path,map_location=device)#重建字符映射
char_to_idx=state['char_to_idx']idx_to_char={v:kfork,vinchar_to_idx.items()}#初始化模型结构
model=SpeechToTextModel(input_dim=input_dim,hidden_dim=hidden_dim,output_dim=len(char_to_idx),num_layers=2).to(device)#加载模型参数
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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年福清滨江中学教师招聘备考题库附答案详解
- 2025年四川省盐业集团有限责任公司公开招聘9人备考题库及参考答案详解1套
- 2025年广州市花都区新雅街嘉行学校临聘教师招聘备考题库及答案详解一套
- 2025年景洪市自然资源局招聘编外聘用人员备考题库及一套完整答案详解
- 安钢总医院2026年成熟型人才招聘备考题库及参考答案详解一套
- 2025年惠州市第一妇幼保健院公开招聘第二批工作人员16人备考题库及一套完整答案详解
- 2025年雅安市名山区茗投产业集团有限公司公开招聘合同制员工的备考题库及答案详解参考
- 宁波市镇海中学(含甬江校区)2026年教师招聘14人备考题库及参考答案详解一套
- 2025年集团综合管理部高级主管岗位招聘备考题库及答案详解1套
- 2025年四川省文化和旅游发展研究中心公开考核招聘工作人员的备考题库及答案详解一套
- 管道维修人员管理制度
- 2025-2030中国辅助生殖技术行业市场发展趋势与前景展望战略研究报告
- 美恩电子新材料有限公司86万吨-年电子级化学品项目环评资料环境影响
- 2024年崇义县发展投资集团有限公司招聘真题
- 冠心病试题及答案选择题
- 阿奇霉素试题及答案
- 浙江省公路工程监理用表-监理抽检记录2025
- TSG D7004-2010 压力管道定期检验规则 -公用管道
- 2025+CSCO肿瘤治疗所致血小板减少症(CTIT)诊疗指南解读课件
- 陈阅增普通生物学课件
- DB32T 4772-2024自然资源基础调查技术规程
评论
0/150
提交评论