Open smallpize opened 1 month ago
找到问题了,修改webUI:
原代码:audio_output = gr.Audio(label="合成音频", autoplay=True, streaming=True)
修改为:audio_output = gr.Audio(label="合成音频", autoplay=True, streaming=False)
gr.Audio
组件的 streaming=True
时,通常会导致无法下载音频文件。这是由于以下原因:流式音频的工作原理:
当 streaming=True
时,音频数据是以小块(chunks)的形式逐步传输的,而不是作为一个完整的文件。这种方式允许音频在生成的同时就开始播放,提供了更快的响应体验。
缺少完整文件: 由于音频是流式传输的,在播放过程中并没有生成一个完整的音频文件。这就意味着没有一个单一的、完整的文件可供下载。
Gradio 的限制: Gradio 的 Audio 组件在流式模式下主要是为了实时播放而设计的,而不是为了提供下载功能。
浏览器限制: 浏览器通常需要完整的音频文件才能提供下载功能。
解决方案:
禁用流式传输:
如果下载功能对您的应用很重要,可以将 streaming
设置为 False
:
audio_output = gr.Audio(label="合成音频", autoplay=True, streaming=False)
这样会生成一个完整的音频文件,可以下载,但可能会增加首次播放的延迟。
双重输出: 您可以考虑使用两个音频输出组件,一个用于流式播放,另一个用于下载:
audio_stream = gr.Audio(label="合成音频(流式播放)", autoplay=True, streaming=True)
audio_download = gr.Audio(label="下载音频", streaming=False)
自定义下载按钮: 您可以实现一个自定义的下载功能,在流式传输完成后生成一个可下载的文件。
使用其他组件:
考虑使用 gr.File
组件来提供下载功能,同时保留 gr.Audio
用于流式播放。
后端处理: 在后端完成音频生成后,将完整的音频文件保存下来,然后提供一个下载链接。
选择哪种方法取决于您的具体需求和应用场景。如果即时播放和下载都很重要,可能需要结合使用上述的一些方法。
这个问题实际上不是由 generate_audio
函数的实现有关:
生成器函数的影响:
您的 generate_audio
函数是一个生成器函数(使用 yield
语句)。这意味着它不是一次性返回完整的音频,而是分段返回音频数据。
Gradio的处理方式: 当 Gradio 处理一个生成器函数的输出时,它会为每个 yield 的值创建一个单独的输出。在 API 调用中,这表现为多个文件地址。
streaming=False
的影响:
即使设置了 streaming=False
,Gradio 仍然会处理生成器函数的每个输出。这就是为什么会返回多个文件地址。
API 调用的行为: 在 API 调用中,Gradio 会返回函数每次 yield 的结果,而不是等待所有数据生成后合并为一个文件。
解决方案:
修改生成函数:
如果您希望在 API 调用中只返回一个完整的音频文件,您需要修改 generate_audio
函数,使其一次性返回完整的音频数据,而不是使用 yield。例如:
def generate_audio(...):
# ... 前面的代码保持不变 ...
full_audio = []
if mode_checkbox_group == '预训练音色':
for i in cosyvoice.inference_sft(...):
full_audio.append(i['tts_speech'].numpy().flatten())
# ... 其他模式同理 ...
return (target_sr, np.concatenate(full_audio))
使用两个不同的函数: 一个用于 Web 界面的流式输出,另一个用于 API 调用的完整输出。
在 API 端合并音频: 如果您需要保持当前的生成器函数不变,可以考虑在 API 调用端合并接收到的多个音频片段。
使用自定义组件: 创建一个自定义的 Gradio 组件,专门处理您的音频生成方式。
后处理: 在生成完所有音频片段后,将它们合并成一个文件,然后返回这个合并后的文件。
选择哪种方法取决于您的具体需求和应用场景。如果您主要关注 API 调用的行为,修改 generate_audio
函数以一次性返回完整音频可能是最直接的解决方案。如果您需要同时支持流式 Web 界面和单一文件 API 输出,可能需要实现两个不同的处理路径。
This issue is stale because it has been open for 30 days with no activity.
Describe the bug 更新版本后,调用 gradio api 报错:httpx.HTTPStatusError: Client error '403 Forbidden' 在 webUI 上,合成声音后,点击下载无反应
编写一个简短的脚本:
执行报错: