CosyVoice icon indicating copy to clipboard operation
CosyVoice copied to clipboard

CPU 合成的质量远高于GPU

Open davidjia1972 opened this issue 6 months ago • 11 comments

用相同的代码、参考音频和文本,在Mac 和 Linux下面,分别用CPU和GPU合成语音,CPU合成的语音质量明显远高于GPU的合成质量。甚至有的参考音频在GPU上合成的音频结果在默认有严重的杂音。

davidjia1972 avatar May 26 '25 15:05 davidjia1972

两个平台合成结果的显著区别是Mac上用CPU合成的声音更加圆润、饱满,而Linux下GPU合成的语音经常有明显的机器金属音的感觉。

davidjia1972 avatar May 26 '25 15:05 davidjia1972

load_jit load_trt都置false,如果还有差异那就是pytorch cpu/gpu推理的差异

aluminumbox avatar May 27 '25 02:05 aluminumbox

load_jit load_trt都置false,如果还有差异那就是pytorch cpu/gpu推理的差异

load_jit=False, load_trt=False, fp16=False,这三个都关了,模型和代码都是最新的,但还是差异明显。尝试了13个不同的原始声音,在Mac CPU上得到的结果都是非常圆润完美,在Linux GPU上的结果差异明显,不仅有“金属音“的感觉,而且有那种劣质耳机模振动的感觉(我是把所有wav文件放在一台机器上用相同的耳机听的)

因为差异过于明显了,所以很是不甘心,但实在不知道怎么解决。

davidjia1972 avatar May 27 '25 03:05 davidjia1972

load_jit load_trt都置false,如果还有差异那就是pytorch cpu/gpu推理的差异

load_jit=False, load_trt=False, fp16=False,这三个都关了,模型和代码都是最新的,但还是差异明显。尝试了13个不同的原始声音,在Mac CPU上得到的结果都是非常圆润完美,在Linux GPU上的结果差异明显,不仅有“金属音“的感觉,而且有那种劣质耳机模振动的感觉(我是把所有wav文件放在一台机器上用相同的耳机听的)

因为差异过于明显了,所以很是不甘心,但实在不知道怎么解决。

有 demo 吗?好奇差别有多大😂

jayzen33 avatar May 27 '25 03:05 jayzen33

cpu/gpu结果肯定是有差异,但不会有质量差异,我们合成的case都是gpu合成的

aluminumbox avatar May 27 '25 03:05 aluminumbox

大家稍等,等我把不同对比的结果放到网盘给大家鉴定。

davidjia1972 avatar May 27 '25 03:05 davidjia1972

在这里我放了6组语音:https://pan.baidu.com/s/1uYMmZhuRwPhtYivqM5r8ew?pwd=we7k

GPU合成的结果有两个问题:有的音色合成的语音“稳定”的会在最后几秒钟乱掉,另外就是质量有明显的不同,CPU生成的更“干净”、更圆润。

davidjia1972 avatar May 27 '25 03:05 davidjia1972

听了,hift.pt和推理代码不适配就是这样机械音问题,CPU和GPU两边推理代码不完全一致吧,检查下版本

foxmale007 avatar May 27 '25 03:05 foxmale007

听了,hift.pt和推理代码不适配就是这样机械音问题,CPU和GPU两边推理代码不完全一致吧,检查下版本

确实,CPU这边的推理代码不是最新的,大致就是4、5天前的版本,模型不记得是哪天下的了。

GPU这边,因为发现有问题,今天凌晨,我从魔搭和Github分别下载了最新的,现在听到的这些有机械音,就是之后生成的。

刚刚,CPU这边我同样又下载了最新的推理代码和模型数据,执行的效果仍旧很好。

按照您的指导,那就是最新的代码里面GPU推理和当前魔搭的上的模型数据不匹配么?

davidjia1972 avatar May 27 '25 03:05 davidjia1972

听了,hift.pt和推理代码不适配就是这样机械音问题,CPU和GPU两边推理代码不完全一致吧,检查下版本

确实,CPU这边的推理代码不是最新的,大致就是4、5天前的版本,模型不记得是哪天下的了。

GPU这边,因为发现有问题,今天凌晨,我从魔搭和Github分别下载了最新的,现在听到的这些有机械音,就是之后生成的。

刚刚,CPU这边我同样又下载了最新的推理代码和模型数据,执行的效果仍旧很好。

按照您的指导,那就是最新的代码里面GPU推理和当前魔搭的上的模型数据不匹配么?

我一直用GPU推理的,只是之前被机械音这个问题折腾过,先是自动更新了模型,出现机械音,后面回退模型就正常;上周五更新了推理代码,适配了最新的模型,更新后就没有机械音了。对了,我用的是qi-hua大佬的VLLM版,不是官方原版,推理的代码只合并了generator.py,下次等有空更新原版看看。

foxmale007 avatar May 27 '25 06:05 foxmale007

大佬们 电流音如何解决呢 GPU合成的

hgaong avatar May 27 '25 08:05 hgaong

@foxmale007 qi-hua大佬的vllm加速推理版不是不支持新版的模型吗,而且也不支持最新的cosyvocie库吗,大佬是你自己修改的吗,可不可以给出修改适配的步骤,一直报bug

2654420646 avatar May 30 '25 03:05 2654420646

唉,我用28个不同音色范例文件做测试,每个音色用10条不同风格的文本做TTS,分别在Mac的CPU(M1 Pro)和Linux的GPU(Nviaid 4060)上,都是用最新的推理代码和模型数据,并且在Linux上load_jit为true和false分别测了两遍,最后得到三批结果,每批28组,每组10条语音。Mac 上CPU得到的结果都非常完美。Linux上的2批56组只有5组是成功的,其中不同批次有两组的音色相同。其他不成功的那些组里面或多或少有各种问题,通常是四种情况:(1) 纯粹的白噪声,没有任何有意义的内容;(2)全部为质量差到无法接受的电音;(3)前面正常,到后面出现质量差到无法接受的电音;(4) 前面正常,后面出现纯粹的白噪声。

另外成功的5组(3种音色)里面,有一种音色是我用CosyVoice-300M-SFT里面的“中文女”这个音色合成后作为因为范例的,它在Linux的两批测试中表现都很好。不过那个“中文男”音色不行,没法通过测试。

当然,GPU成功合唱的那些语音的质量都非常好。也就是说,现在要么就质量很好,要么完全没法接受。

还有,具体哪条会在使用哪个音色的时候出现什么样的问题,并没有体现出明显的规律。

现在看起来,不知道是新的模型还是推理代码,在使用GPU的时候,应该是存在问题的,下面附上我测试的10条文本:

sentence_list = [{ 'name': '介绍', 'text': '长城是中国古代最伟大的建筑之一,绵延数千公里,被誉为世界七大奇迹之一。' },{ 'name': '客服', 'text': '您好,欢迎致电客服中心,请问有什么可以帮您的么?' },{ 'name': '全音', 'text': '北方白鹭飞来,穿过山川河流,静静落在湖边青草地上。' },{ 'name': '组合', 'text': '北京的秋天格外迷人,天空湛蓝,阳光温暖。街道两旁的银杏树金黄一片,仿佛铺上了地毯。' },{ 'name': '招呼', 'text': '嘿,你来了啊!今天过得怎么样?有没有什么新鲜事儿?' },{ 'name': '询问', 'text': '你昨天说的那家店我去了,真的还挺不错的,下次一起去?' },{ 'name': '情绪', 'text': '最近工作有点忙,总感觉时间不够用。你那边还好吗?' },{ 'name': '抱怨', 'text': '手机又开始卡了,换还是不换啊?你用的那款还顺畅吗?' },{ 'name': '分享', 'text': '我刚看完一部电影,剧情挺有意思的,推荐你也看看。' }, { 'name': '工会', 'text': '中国工会是中国共产党领导的职工自愿结合的群众组织,核心职能是维护职工合法权益、服务企业发展、促进劳动关系和谐。其特点是行政化色彩较强,注重政策执行与劳资协调,较少采取对抗性手段(如罢工),更多通过协商、调解等方式解决问题。所以,这和国外的工会有很大的不同' } ]

davidjia1972 avatar May 30 '25 03:05 davidjia1972

唉,我用28个不同音色范例文件做测试,每个音色用10条不同风格的文本做TTS,分别在Mac的CPU(M1 Pro)和Linux的GPU(Nviaid 4060)上,都是用最新的推理代码和模型数据,并且在Linux上load_jit为true和false分别测了两遍,最后得到三批结果,每批28组,每组10条语音。Mac 上CPU得到的结果都非常完美。Linux上的2批56组只有5组是成功的,其中不同批次有两组的音色相同。其他不成功的那些组里面或多或少有各种问题,通常是四种情况:(1) 纯粹的白噪声,没有任何有意义的内容;(2)全部为质量差到无法接受的电音;(3)前面正常,到后面出现质量差到无法接受的电音;(4) 前面正常,后面出现纯粹的白噪声。

另外成功的5组(3种音色)里面,有一种音色是我用CosyVoice-300M-SFT里面的“中文女”这个音色合成后作为因为范例的,它在Linux的两批测试中表现都很好。不过那个“中文男”音色不行,没法通过测试。

当然,GPU成功合唱的那些语音的质量都非常好。也就是说,现在要么就质量很好,要么完全没法接受。

还有,具体哪条会在使用哪个音色的时候出现什么样的问题,并没有体现出明显的规律。

现在看起来,不知道是新的模型还是推理代码,在使用GPU的时候,应该是存在问题的,下面附上我测试的10条文本:

sentence_list = [{ 'name': '介绍', 'text': '长城是中国古代最伟大的建筑之一,绵延数千公里,被誉为世界七大奇迹之一。' },{ 'name': '客服', 'text': '您好,欢迎致电客服中心,请问有什么可以帮您的么?' },{ 'name': '全音', 'text': '北方白鹭飞来,穿过山川河流,静静落在湖边青草地上。' },{ 'name': '组合', 'text': '北京的秋天格外迷人,天空湛蓝,阳光温暖。街道两旁的银杏树金黄一片,仿佛铺上了地毯。' },{ 'name': '招呼', 'text': '嘿,你来了啊!今天过得怎么样?有没有什么新鲜事儿?' },{ 'name': '询问', 'text': '你昨天说的那家店我去了,真的还挺不错的,下次一起去?' },{ 'name': '情绪', 'text': '最近工作有点忙,总感觉时间不够用。你那边还好吗?' },{ 'name': '抱怨', 'text': '手机又开始卡了,换还是不换啊?你用的那款还顺畅吗?' },{ 'name': '分享', 'text': '我刚看完一部电影,剧情挺有意思的,推荐你也看看。' }, { 'name': '工会', 'text': '中国工会是中国共产党领导的职工自愿结合的群众组织,核心职能是维护职工合法权益、服务企业发展、促进劳动关系和谐。其特点是行政化色彩较强,注重政策执行与劳资协调,较少采取对抗性手段(如罢工),更多通过协商、调解等方式解决问题。所以,这和国外的工会有很大的不同' } ]

cli/model.py里 self.trt_context_pool.put(torch.cuda.stream(torch.cuda.Stream(self.device)) if torch.cuda.is_available() else nullcontext()) 改成 self.trt_context_pool.put(nullcontext())试试

aluminumbox avatar May 30 '25 06:05 aluminumbox

唉,我用28个不同音色范例文件做测试,每个音色用10条不同风格的文本做TTS,分别在Mac的CPU(M1 Pro)和Linux的GPU(Nviaid 4060)上,都是用最新的推理代码和模型数据,并且在Linux上load_jit为true和false分别测了两遍,最后得到三批结果,每批28组,每组10条语音。Mac 上CPU得到的结果都非常完美。Linux上的2批56组只有5组是成功的,其中不同批次有两组的音色相同。其他不成功的那些组里面或多或少有各种问题,通常是四种情况:(1) 纯粹的白噪声,没有任何有意义的内容;(2)全部为质量差到无法接受的电音;(3)前面正常,到后面出现质量差到无法接受的电音;(4) 前面正常,后面出现纯粹的白噪声。 另外成功的5组(3种音色)里面,有一种音色是我用CosyVoice-300M-SFT里面的“中文女”这个音色合成后作为因为范例的,它在Linux的两批测试中表现都很好。不过那个“中文男”音色不行,没法通过测试。 当然,GPU成功合唱的那些语音的质量都非常好。也就是说,现在要么就质量很好,要么完全没法接受。 还有,具体哪条会在使用哪个音色的时候出现什么样的问题,并没有体现出明显的规律。 现在看起来,不知道是新的模型还是推理代码,在使用GPU的时候,应该是存在问题的,下面附上我测试的10条文本: sentence_list = [{ 'name': '介绍', 'text': '长城是中国古代最伟大的建筑之一,绵延数千公里,被誉为世界七大奇迹之一。' },{ 'name': '客服', 'text': '您好,欢迎致电客服中心,请问有什么可以帮您的么?' },{ 'name': '全音', 'text': '北方白鹭飞来,穿过山川河流,静静落在湖边青草地上。' },{ 'name': '组合', 'text': '北京的秋天格外迷人,天空湛蓝,阳光温暖。街道两旁的银杏树金黄一片,仿佛铺上了地毯。' },{ 'name': '招呼', 'text': '嘿,你来了啊!今天过得怎么样?有没有什么新鲜事儿?' },{ 'name': '询问', 'text': '你昨天说的那家店我去了,真的还挺不错的,下次一起去?' },{ 'name': '情绪', 'text': '最近工作有点忙,总感觉时间不够用。你那边还好吗?' },{ 'name': '抱怨', 'text': '手机又开始卡了,换还是不换啊?你用的那款还顺畅吗?' },{ 'name': '分享', 'text': '我刚看完一部电影,剧情挺有意思的,推荐你也看看。' }, { 'name': '工会', 'text': '中国工会是中国共产党领导的职工自愿结合的群众组织,核心职能是维护职工合法权益、服务企业发展、促进劳动关系和谐。其特点是行政化色彩较强,注重政策执行与劳资协调,较少采取对抗性手段(如罢工),更多通过协商、调解等方式解决问题。所以,这和国外的工会有很大的不同' } ]

cli/model.py里 self.trt_context_pool.put(torch.cuda.stream(torch.cuda.Stream(self.device)) if torch.cuda.is_available() else nullcontext()) 改成 self.trt_context_pool.put(nullcontext())试试

改过之后,28组音色,280个合成结果,全部都没问题了,效果perfect,而且运行速度与之前基本上一样。

如果可以,建议就这样改吧。

这个issue到这里我就把它Close了

davidjia1972 avatar May 30 '25 16:05 davidjia1972

看起来像是异步执行了非默认流,但是没有同步的问题 在cosyvoice/flow/flow_matching.py的129行: [estimator, stream], trt_engine = self.estimator.acquire_estimator() with stream: xxx 这里虽然结束的时候进行了流同步,但是开始的时候,没有对默认流同步,会不会是这里获取的data_ptr其实还没准备好,就被拿过来用了? 在129行之前加一行(一定在with stream之前) torch.cuda.current_stream().synchronize() 试试哇?

JiaYK avatar Jun 04 '25 08:06 JiaYK