铁道部建设管理司官方网站,网站毕业作品代做,焦作河南网站建设,北京卓天下网站建设公司一、模型 VITS模型训练教程VITS-从零开始微调#xff08;finetune#xff09;训练并部署指南-支持本地云端 
Wav2lip是2D数字人#xff0c;可参考训练嘴型同步模型Wav2Lip 
PS:以上模型都是开源可用。 
二. VITS数据处理问题 
VITS模型的输出为一维的numpy类型数据#xff…一、模型 VITS模型训练教程VITS-从零开始微调finetune训练并部署指南-支持本地云端 
Wav2lip是2D数字人可参考训练嘴型同步模型Wav2Lip 
PS:以上模型都是开源可用。 
二. VITS数据处理问题 
VITS模型的输出为一维的numpy类型数据官方开源代码中给出的处理方法为使用scipy.io.wavfile提供将numpy数据采样并存为音频文件代码示例为 if language is not None:text  language_marks[language]  text  language_marks[language]speaker_id  speaker_ids[spk]stn_tst  get_text(text, hps, False)with no_grad():x_tst  stn_tst.unsqueeze(0).to(device)x_tst_lengths  LongTensor([stn_tst.size(0)]).to(device)sid  LongTensor([speaker_id]).to(device)audio  net_g.infer(x_tst, x_tst_lengths, sidsid, noise_scalenoise_scale, noise_scale_wnoise_scale_w,length_scale1.0 / length)[0][0, 0].data.cpu().float().numpy()del stn_tst, x_tst, x_tst_lengths, sidwavf.write(str(output_dir)/output_name.wav,hps.data.sampling_rate,audio)但是如果要将该模型作为数字人的音频克隆输出上述代码的保存方式对于实时性形成较大阻碍我们应该考虑如何不写入文件直接传输到如Web前端进行播放音频。经过思考若前端使用如下代码解析音频, 
divaudio idaudio controls autoplay styledisplay: none;/audio
/divconst audioEl  document.querySelector(audio)
audioEl.src data:audio/mp3;base64, messageData该前端不可解析numpy类型数据并且如果直接将numpy类型音频数据直接转为字节类型数据并回传到前端也是不可行的。我们仔细阅读开源模型提供的解决方案中出现的wavf.write函数发现我们可以直接从该函数的实现进行稍微修改即可实现numpy类型音频数据不写入文件直接传输到如Web前端进行播放音频修改结果如下所示 # 采样header_e  bRIFFheader_m  b\x00\x00\x00\x00# 音频参数fs  16000format_tag  0x0003channels  1bit_depth  _audio.dtype.itemsize * 8bytes_per_second  fs * ( bit_depth // 8) * channelsblock_align  channels * (bit_depth // 8)fmt_chunk_data  struct.pack(HHIIHH, format_tag, channels, fs, bytes_per_second, block_align, bit_depth)fmt_chunk_data  b\x00\x00header_l  bWAVEfmt   struct.pack(I, len(fmt_chunk_data))  fmt_chunk_data  bfact  struct.pack(II, 4, _audio.shape[0])# numpy类型音频数据data  bdatapre_data  struct.pack(I, _audio.nbytes)audio_data  header_e  header_m  header_l  data  pre_data  _audio.ravel().view(b).datasize  len(audio_data)_len  struct.pack(I, size - 8)audio_data  header_e  _len  header_l  data  pre_data  _audio.ravel().view(b).data上述代码的最后一行生成的audio_data 变量即为可回传到前端进行正常播放的音频字节信息。由此也可以看出为什么直接将numpy类型音频数据直接转为字节类型数据并回传到前端也是不可行的其原因在于音频数据存在固定保存结构。 
三、VITS输出结构驱动Wav2lip 
由于VITS模型的输出为numpy类型的音频数据Wav2lip按照官方给出的开源处理方式为输入一个音频文件然后将该音频文件以numpy形式进行读取然后转成梅尔图谱的形式与图片进行batch_size匹配后输入到网络中驱动相关帧的嘴型变化。如果直接读取音频文件将会是一个耗时的任务为此我们应该直接将VITS的numpy类型数据直接传入到Wav2lip,从而跳过读取文件和形成numpy类型的数据过程减少工程实现上的时间。针对Wav2lip模型的优化方案 后续给出。