RVC-Project / Retrieval-based-Voice-Conversion-WebUI

Easily train a good VC model with voice data <= 10 mins!
MIT License
24.89k stars 3.65k forks source link

rvc导出的onnx模型做实时变声推理,声音不连续 #2277

Open EbanShen opened 3 months ago

EbanShen commented 3 months ago

环境: RVC版本:https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI.git -- RVC的git仓库最新提交版本 使用以下脚本导出的onnx:https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/blob/main/tools/export_onnx.py 原模型为rvc自带的keruanV1.pth,导出模型为keruanV1.onnx,确认生成的是动态模型。

现象: 由于是做实时变声推理,因此每次送入模型的数据片段会很短,大概7200个采样。但输出的数据片段并不能很好的衔接在一起。如:片段A、B、C,在从麦克风进来后,三个数据片段的声音是连续的,但从变声器出来后,听感上A会高一些,B会低一些,而且三个片段的衔接处也无法丝滑过渡,会导致衔接处播放时产生噪音。实际听感就是,变声后的声音会周期性出现“点点点”的声音。

所做的尝试:

  1. 参考https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/blob/main/gui_v1.py中对推理后数据的处理。增加了交叉淡化算法,但收效甚微。
// 计算当前返回帧的头部淡化效果
auto fo_head = in_buf + sola_offset;
auto fo_tail = fo_head + block_frame;
for (size_t i = 0; i < sola_buffer_frame; i++) {
    fo_head[i] *= fade_in_window[i];
    fo_head[i] += (sola_buffer[i] * fade_out_window[i]);
}
memcpy(sola_buffer, fo_tail, sola_buffer_frame * sizeof(float_t));
  1. 利用ffmpeg的acrossfade滤镜进行处理,但得到的结果一样,效果不大。
  2. 增加每次送入模型的数据量,通过滑动窗口的方式返回数据。如:我会缓存500ms左右的历史变声前数据,新的7200个采样到来后会从缓存尾部推入,缓存头部则会被挤出7200个采样,将整个缓存数据送入变声器。取输出数据尾部的7200个采样返回。
  3. 将3中返回窗口分别设置在输出数据的头部、中部、尾部,均未得到特别好的效果,也将这种窗口形式与1/2中的交叉淡化结合,亦无明显效果。

请问是否有什么办法,能让每次推理的数据片段能衔接起来,让声音连续呢?

UkiTenzai commented 2 months ago

请问不同片段之间有重叠部分吗

EbanShen commented 2 months ago

请问不同片段之间有重叠部分吗

输入片段是由麦克风采集获得的,每个输入片段之间是没有重叠部分的

UkiTenzai commented 2 months ago

请问不同片段之间有重叠部分吗

输入片段是由麦克风采集获得的,每个输入片段之间是没有重叠部分的

我也是这个问题,我觉得应该就是不重叠分帧导致的

Zer0TheObserver commented 2 months ago

同样吞字,想看看你是怎么写的推理

EbanShen commented 2 months ago

请问不同片段之间有重叠部分吗

输入片段是由麦克风采集获得的,每个输入片段之间是没有重叠部分的

我也是这个问题,我觉得应该就是不重叠分帧导致的

尝试过使用缓存保留部分历史数据,与新数据一起送入推理引擎,然后每次取固定部位的数据返回,但每次返回的片段依然会有衔接不上的问题。

EbanShen commented 2 months ago

同样吞字,想看看你是怎么写的推理

我目前就是用历史缓存+新数据送入推理引擎,每次返回取前面部分,但依然会有衔接不上的问题

EbanShen commented 2 months ago

目前在尝试用libtorch复刻RVC的处理流程。 之前用onnxruntime推理onnx模型,不知道是不是小引擎对某些算子不支持,所以小片段推理问题较多。

UkiTenzai commented 2 months ago

目前在尝试用libtorch复刻RVC的处理流程。 之前用onnxruntime推理onnx模型,不知道是不是小引擎对某些算子不支持,所以小片段推理问题较多。

意思是不用onnx 单纯用torch推理 衔接效果还不错吗

UkiTenzai commented 2 months ago

目前在尝试用libtorch复刻RVC的处理流程。 之前用onnxruntime推理onnx模型,不知道是不是小引擎对某些算子不支持,所以小片段推理问题较多。

据我所知 Google开源的神经音频编解码器Lyra 如果用官方给的tflite 是可以不重叠分帧直接流式在线推理的 生成音频没有任何不连贯的感觉 但是如果转成onnx用onnx推理 生成音频会很吵