FunAudioLLM / CosyVoice

Multi-lingual large voice generation model, providing inference, training and deployment full-stack ability.
https://funaudiollm.github.io/
Apache License 2.0
5.46k stars 562 forks source link

能否支持流式输出,当前生成的太慢了 #93

Open tiamohf opened 3 months ago

tiamohf commented 3 months ago

或者有没有指导建议

希望可以实时返回,不用等待全部结果

aluminumbox commented 3 months ago

not yet, we may work on it later, you are welcome to make a pr

xwang0415 commented 3 months ago
  1. 修改self.frontend.text_normalize,开启split=True
  2. 修改其中split_paragraph的token_max_n, token_min_n, merge_len为较小值,使文本切分更短
  3. 外层对每个text segmentation推理的音频yield抛出
yangcunning1 commented 3 months ago
  1. 修改self.frontend.text_normalize,开启split=True
  2. 修改其中split_paragraph的token_max_n, token_min_n, merge_len为较小值,使文本切分更短
  3. 外层对每个text segmentation推理的音频yield抛出

fastapi如何写流试输出?

tiamohf commented 3 months ago
  1. 修改self.frontend.text_normalize,开启split=True
  2. 修改其中split_paragraph的token_max_n, token_min_n, merge_len为较小值,使文本切分更短
  3. 外层对每个text segmentation推理的音频yield抛出

求PR,不太会

tiamohf commented 3 months ago

not yet, we may work on it later, you are welcome to make a pr

这是一个好项目,我还在学习中

yangcunning1 commented 3 months ago
  1. 修改self.frontend.text_normalize,开启split=True
  2. 修改其中split_paragraph的token_max_n, token_min_n, merge_len为较小值,使文本切分更短
  3. 外层对每个text segmentation推理的音频yield抛出

如何用fastapi写流试的接口呢?求pr

yangcunning1 commented 3 months ago
  1. 修改self.frontend.text_normalize,开启split=True
  2. 修改其中split_paragraph的token_max_n, token_min_n, merge_len为较小值,使文本切分更短
  3. 外层对每个text segmentation推理的音频yield抛出

image

image 在这里如何转换成音频的地方卡住了

xwang0415 commented 3 months ago
  1. 修改self.frontend.text_normalize,开启split=True
  2. 修改其中split_paragraph的token_max_n, token_min_n, merge_len为较小值,使文本切分更短
  3. 外层对每个text segmentation推理的音频yield抛出

image

image 在这里如何转换成音频的地方卡住了

wav格式不支持流式,可以采用pcm流式数据在接收端直接播放或保存 所以不需要通过torchaudio做save转换格式,直接发送生成的语音数据tts_speech

tiamohf commented 3 months ago
  1. 修改self.frontend.text_normalize,开启split=True
  2. 修改其中split_paragraph的token_max_n, token_min_n, merge_len为较小值,使文本切分更短
  3. 外层对每个text segmentation推理的音频yield抛出

目前token_max_n=80, token_min_n=60, merge_len=20,是都给调小吗

xwang0415 commented 3 months ago
  1. 修改self.frontend.text_normalize,开启split=True
  2. 修改其中split_paragraph的token_max_n, token_min_n, merge_len为较小值,使文本切分更短
  3. 外层对每个text segmentation推理的音频yield抛出

目前token_max_n=80, token_min_n=60, merge_len=20,是都给调小吗

根据自己需求来调,比如设置为10 值太小,根据标点符号切到比较细,太短的文本可能对生成的token韵律有负作用 值太大,切的句子会比较长(如现有代码中的80,60,20)

rogeryoungh commented 3 months ago

感谢 xwang0415 大哥,我根据他的讲解实现如下

https://gist.github.com/rogeryoungh/030b72596ed2ccaaf451db779ad29a11

有一个坑要注意,f32 是 4 字节,但是一段音频并不对应一次 reader.read(),不知道会断在哪里。我这里为了简单的能播放,只是存下来。

tiamohf commented 2 months ago

还是太慢了。。

hjj-lmx commented 2 months ago

还是太慢了。。

找到解决办法了吗?

tiamohf commented 2 months ago

改成流式运行,第一段话还是需要4s以上的

yangcunning1 commented 2 months ago

速度有提升吗

---原始邮件--- 发件人: @.> 发送时间: 2024年7月19日(周五) 下午4:27 收件人: @.>; 抄送: @.**@.>; 主题: Re: [FunAudioLLM/CosyVoice] 能否支持流式输出,当前生成的太慢了 (Issue #93)

image.png (view on web) 我自己写的一个,目前已经对接了大模型

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

shanhaidexiamo commented 2 months ago
  1. 修改self.frontend.text_normalize,开启split=True
  2. 修改其中split_paragraph的token_max_n, token_min_n, merge_len为较小值,使文本切分更短
  3. 外层对每个text segmentation推理的音频yield抛出

这样每个子句子都会再重新计算首包kv-cache,算是伪流式,可能还会有衔接不流畅的问题吧

0x5446 commented 2 months ago

推理是自回归架构的吧,这样不可能太快的,改成流式也只是改善一点点而已

luyibo20040205 commented 2 months ago

这个up讲的挺好,能成功实现流式输出。我用3070tiLAPTOP跑SFT语音基本能控制在大段文本开头延迟2s,合成速度和播放语音速度相同,上服务器应该效果更好。 https://www.bilibili.com/video/BV1BE421A7CG/?vd_source=f53fefac8e4868edbcb304aba351c1ec

kustcl commented 2 months ago

这个up讲的挺好,能成功实现流式输出。我用3070tiLAPTOP跑SFT语音基本能控制在大段文本开头延迟2s,合成速度和播放语音速度相同,上服务器应该效果更好。 https://www.bilibili.com/video/BV1BE421A7CG/?vd_source=f53fefac8e4868edbcb304aba351c1ec

大佬,这个原理是啥呢,能不能在python中通过创建gradio 界面中实现这个流式输出呢

luyibo20040205 commented 2 months ago

这个up讲的挺好,能成功实现流式输出。我用3070tiLAPTOP跑SFT语音基本能控制在大段文本开头延迟2s,合成速度和播放语音速度相同,上服务器应该效果更好。 https://www.bilibili.com/video/BV1BE421A7CG/?vd_source=f53fefac8e4868edbcb304aba351c1ec

大佬,这个原理是啥呢,能不能在python中通过创建gradio 界面中实现这个流式输出呢

利用内置的self.frontend.text_normalize把文本切成chunk后去推理,推理出的音频yield抛出。split_paragraph中的修改根据自己硬件实力走,大块感情丰富时间长,小块生成快但是没感情,控制在RTF小于1就可以。 不过个人感觉这个不算流式输出,如同上面大佬所说“推理是自回归架构的”,这些方法本质上都是切割文本、分段上传做的伪流式,cosyvoice的技能点都点在感情、断句上了,切成太小的段落后优势就体现不出来了。 (如果只追求速度,对其他需求不高的话为什么不去试试edge_tts呢XD

kustcl commented 2 months ago

这个up讲的挺好,能成功实现流式输出。我用3070tiLAPTOP跑SFT语音基本能控制在大段文本开头延迟2s,合成速度和播放语音速度相同,上服务器应该效果更好。 https://www.bilibili.com/video/BV1BE421A7CG/?vd_source=f53fefac8e4868edbcb304aba351c1ec

大佬,这个原理是啥呢,能不能在python中通过创建gradio 界面中实现这个流式输出呢

利用内置的self.frontend.text_normalize把文本切成chunk后去推理,推理出的音频yield抛出。split_paragraph中的修改根据自己硬件实力走,大块感情丰富时间长,小块生成快但是没感情,控制在RTF小于1就可以。 不过个人感觉这个不算流式输出,如同上面大佬所说“推理是自回归架构的”,这些方法本质上都是切割文本、分段上传做的伪流式,cosyvoice的技能点都点在感情、断句上了,切成太小的段落后优势就体现不出来了。 (如果只追求速度,对其他需求不高的话为什么不去试试edge_tts呢XD

那chatttsye也可以实现类似的伪流式输出吧,感觉综合下来,不做任何处理,chattts的速度更快一点,效果更好