Zhou
Zhou
Hi,have you solved this problem?
我使用https://github.com/BytedanceSpeech/seed-tts-eval?tab=readme-ov-file提供的音色评估代码,在数据集Seed-TTS test-zh上得到cosyvoice得分74.7(与您们发布的指标一致),但测试minicpm-o得分只有42。并且测试克隆任务时生成的音频音色的确不太像。
并且根据这个延时来看,端到端的延时好像比两阶段还慢?在4090上,短问题(今天天气怎么样)qwen2延时0.1+chattts延时0.5=0.6s,而相同的问题在4090上测试minicpmo(声音克隆)延时0.7s左右。 是否是我测试的有什么问题呢,minicpm-o在延时上相对于两阶段的语音克隆有优势吗?
> 您好,我负责MiniCPM-o语音模态。感谢您的反馈! > > 表格里写的是首响,也就是最开始的一段音频输出。 > > o2.6可以流式输出音频,也可以非流式输出音频。ChatTTS是一个非流式模型,我们在训练o2.6时把ChatTTS改成了流式版本,可以在只生成非常少文本的情况下就立刻产生第一段语音输出。 > > * 在流式状态下,首响其实很低,所以可以比Qwen2+ChatTTS快很多。 > * 但如果是非流式模式,速度和Qwen2+ChatTTS应该是一样的。您测试的应该是在命令行下跑的非流式模式。 > > 不知道是否解答了您的疑问? 您好,不是的,我测试的是流式的首token延时。不知道您说的快很多是多少,我这边测试延时如上述所示,的确不算太快。 仔细看了代码,发现有一部分应该是可以优化,在“_generate_mel_spec_audio_streaming”函数中,因为音频融合,在第二次生成音频时才会返回首token。  如上修改以后,首token延时会比两阶段快。(第一次生成音频就返回,保留音频后半部分和之后的音频做融合) 不知道我理解的是否正确,目前输出的效果是正常的,修改以后的延时也可以达到我的要求了。 感谢~
> * 首响其实很低,所以可以比Qwen2+ChatTTS快很多。 您好,您这边是否可以提供一个minicpm语音克隆首token延时指标呢,我想判断一下我的操作是否有问题。如果是我这边操作有误,该如何修改?
> 可以在只生成非常少文本的情况下就立刻产生第一段语音输出。 我看默认是收集10个字会生成第一段语音,您说的非常少文本是指多少文本呢?如果将参数streaming_text_chunk_size改小,好像会影响效果?(改成5以后,句子连贯性好像有点问题,而且生成的语音会在最后循环)这个参数一般设置多少比较合适?
感谢您的解答,方便问一下tts的训练损失设计嘛? “在训练过程中,来自语音解码器的梯度会反向传播到包含大语言模型主干和音频编码器的整个模型参数。模型通过端到端方式训练,没有使用任何中间损失和监督。“ 技术文档中,看起来llm和tts是联合训练的,但是又说没有用中间损失。所以想问一下llm和tts是同时训练嘛,是分别有一个损失嘛?
抱歉,还想问一下,在生成语音的时候,for 循环文本,当个数达到streaming_text_chunk_size以后,就去生成,for循环结束的时候,为什么会存在语音生成没有结束的情况,即outputs.finished=Flase,并且进入1740行的if语句中继续生成。并且继续生成的时间挺长的,导致生成音频的总时间很长。 是因为tts是流式,所以每次返回的不是整个文本的语音嘛?但是为什么总时间这么长呢?生成40个字的音频,需要差不多20秒。我看chattts官方有参数compile的设置,是否是因为这个导致总的生成时间很长呢? 期待您的解答。感谢~
> > 抱歉,还想问一下,在生成语音的时候,for 循环文本,当个数达到streaming_text_chunk_size以后,就去生成,for循环结束的时候,为什么会存在语音生成没有结束的情况,即outputs.finished=Flase,并且进入1740行的if语句中继续生成。并且继续生成的时间挺长的,导致生成音频的总时间很长。 是因为tts是流式,所以每次返回的不是整个文本的语音嘛?但是为什么总时间这么长呢?生成40个字的音频,需要差不多20秒。我看chattts官方有参数compile的设置,是否是因为这个导致总的生成时间很长呢? 期待您的解答。感谢~ > > 是这样的:是因为tts是流式,所以每次返回的不是整个文本的语音。语音和文本不是对齐的,文本生成会有冗余性,于是当文本生成结束,语音生成并没有结束,还需要再继续生成。不是因为没有开启compile。 > > 如果开启compile的话会让语音解码速度快2倍,但有一个初始化过程比较缓慢,我们目前也没有找到好的方法初始化一次之后后面都不重新初始化,所以就没有写到readme里。 所以按照目前代码的逻辑,生成40个字的音频需要20s是正常的嘛~?
好的,感谢您的解答~