GPT-SoVITS
GPT-SoVITS copied to clipboard
能否压缩模型部署到移动端?
现在模型速度推理本身也不慢,在cpu上的速度都可以接受,所以我感觉是否可以进一步压缩模型,稍微损失音质的情况下部署到没有gpu的设备或移动设备。 例如把模型体积压缩到100MB以内,cpu一秒内可以合成10秒的音频,也希望可以支持c++的推理或rust的推理。
mark
你那边测试得到的推理效率怎么样?
我自己昨天做了下测试
主分支下,api.py接口
20个参考音频,10个进程并发推理,推理文本17段共计768字符,最终耗时772秒。
单线程推理效率20*768/10/772约等于2字/秒
总体推理效率约等于20字/秒
设备19-1300HX,4080laptop
您能给一个测试脚本吗,这样统计的性能数据可以尽可能和你那边一致。 我这边没有gpu设备,cpu是i5的也比较老的,实时推理有点慢,但是可接受范围,合成“你好呀,我们是一群追逐梦想的人。”15个字大概需要6秒,输出的音频只有两三秒,显然达不到实时性。
您能给一个测试脚本吗,这样统计的性能数据可以尽可能和你那边一致。 我这边没有gpu设备,cpu是i5的也比较老的,实时推理有点慢,但是可接受范围,合成“你好呀,我们是一群追逐梦想的人。”15个字大概需要6秒,输出的音频只有两三秒,显然达不到实时性。 #1044 没有专门的测试脚本,那个测试是在做参考音频筛选的时候顺便看的。
只能说,以目前的推理效率,想要在低功耗的手机上运行,不太现实
你那边测试得到的推理效率怎么样?
我自己昨天做了下测试
主分支下,api.py接口
20个参考音频,10个进程并发推理,推理文本17段共计768字符,最终耗时772秒。
单线程推理效率20*768/10/772约等于2字/秒
总体推理效率约等于20字/秒
设备19-1300HX,4080laptop
mark
只能说,以目前的推理效率,想要在低功耗的手机上运行,不太现实
是的
不知道模型是否还可以继续压缩。
您能给一个测试脚本吗,这样统计的性能数据可以尽可能和你那边一致。 我这边没有gpu设备,cpu是i5的也比较老的,实时推理有点慢,但是可接受范围,合成“你好呀,我们是一群追逐梦想的人。”15个字大概需要6秒,输出的音频只有两三秒,显然达不到实时性。
您的推理速度比我的速度快很多(我这里16个字耗时60s+),我的cpu是12核i7-8700K CPU @ 3.70GHz,使用的fast_interence_分支python webui.py,已经勾选了并行。请问您是怎么做的呢?
我使用的是主分支推理,我的cpu是Intel(R) Core(TM) i5-4670T CPU @ 2.30GHz,4核心。
mark
mark
我之前尝试把模型转换到onnx,然后使用rust的推理方案,这样很容易迁移到移动端,但是不知道bert的模型如何实现,这是我的一部分代码:
mod audio;
mod text;
use std::time::SystemTime;
use ndarray::Array;
use ort::{CUDAExecutionProvider, inputs, SessionBuilder};
use crate::audio::{pcm_decode, play_sound, SampleRateConverter};
fn main() {
let sess = SessionBuilder::new()
.unwrap()
.with_execution_providers([CUDAExecutionProvider::default().build()])
.unwrap()
.commit_from_file("../GPT-SoVITS_inference_rust/xxx_vits-sim.onnx")
.unwrap();
let text_seq = Array::from_shape_vec((1, 30), vec![227i64, 167, 158, 119, 318, 101, 1, 316, 232, 225, 144, 251, 214, 318, 169, 247, 312, 320, 280, 320, 256, 225, 148, 317, 183, 127, 134, 248, 141, 0]).unwrap();
let pred_semantic = Array::from_shape_vec((1, 1, 18), vec![540i64, 14, 656, 420, 245, 0, 321, 304, 169, 166, 147, 335, 342, 190, 768, 753, 399, 666]).unwrap();
let (pcm, sr) = pcm_decode("../GPT-SoVITS_inference_rust/hello_in_cn.mp3").unwrap();
let data = SampleRateConverter::new(pcm.into_iter(), sr, 32000, 1).collect::<Vec<f32>>();
let len = data.len();
let ref_audio = Array::from_shape_vec((1, len), data).unwrap();
let time = SystemTime::now();
let outputs = sess.run(inputs![
"text_seq" => text_seq.view(),
"pred_semantic" => pred_semantic.view(),
"ref_audio" => ref_audio.view()
].unwrap()).unwrap();
let output = outputs["audio"].try_extract_tensor::<f32>().unwrap();
println!("{:?}, {:?}", time.elapsed().unwrap(), output);
// let mut output_file = std::fs::File::create("out.wav").unwrap();
// write_pcm_as_wav(&mut output_file, output.as_slice().unwrap(), 32_000).unwrap();
play_sound(output.as_slice().unwrap(), 32000);
}
@mzdk100 我也在研究rust实现推理端的事情。我觉得可以参考这个 repo https://github.com/425776024/GPT-SoVITS-Rust/tree/main
他用到了这个库 https://crates.io/crates/tokenizers 看起来好像可以
我看看。
这个仓库的实现挺好的。