开发者社区 > 百炼大模型 > 正文

使用 CosyVoice 遇到的一个音频头部问题

对于全双工返回的音频片段,如果做成实时服务,那么使用了 SSE 方式对音频片段进行了转发,实际在客户端发现:

  1. 第一个音频片段有音频头部信息(采样频率,格式等)
  2. 之后返回的音频片段没有头部信息
    所以这就要求音频必须是依赖第一个头部信息的,实际发现在各个客户端较难实现连续读出;搜集或者使用了一些类库比如 web 端:
  3. 使用audio实现,对于动态读+动态拼接难实现
  4. 使用了一些类库也都没达到效果
    所以进行了 hack 的方式:对每一段音频(除第一段)手动添加一个音频头部,但是这样引入了噪点,也就是开启或结束每一段音频都会产生一个噪音或破音。

问题:

  1. 是否有客户端实现连续音频播放的动态读+动态拼接音频片段(仅第一段含音频头)这种方式,类库方法都可以
  2. 是否可以提供连续音频均可单独播放的音频序列方式

展开
收起
游客ovl6ffihmaxge 2024-09-09 11:42:39 65 0
2 条回答
写回答
取消 提交回答
  • 确定是有噪音的,使用了多种方式:

    1. 使用这里的 demo:https://help.aliyun.com/zh/dashscope/developer-reference/cosyvoice-quick-start?spm=a2c4g.11186623.0.0.2bb47ff0fjPiLU
      使用逻辑,默认将 LLM 生成的增量字段通过全双工的方式传递,由 cosyVoice 判断返回时机,传递第一个音频片段,这种方式返回的音频片段经过使用发现,只有第一个音频片段带有音频头部,可以单独播放,之后的需要用动态添加的方式进行;可以看到的是 demo 中直接 java 调用的音频播放器SourceDataLine是可以按照这个逻辑的;但是在其他端的其他语言(JS,Swift)等,较难处理这种;一楼给的答案已经搜过了,我要是没用过,不会来提问题(强烈踩一楼这种直接把其他 AI 回答给出,然后每天刷赞的行为)
    2. 使用自己切片,不通过 demo 这种方式,而是将每句话单独合成,这样,仍然含有噪音(使用 cosyvoice,判断是模型问题),每句话都有音频头,这样完成了处理;所以,将音频格式改为 mp3+22050采样频率,发现噪音影响会降到最低;至此问题基本解决

    总结:

    1. cosyvoice +LLM 通过第一帧含音频头的方式在 web 端比较难处理
    2. cosyvoice 返回多短单独音频,在拼接时存在噪音问题
    2024-09-18 16:04:35
    赞同 35 展开评论 打赏
  • 解决方案建议:

    • 利用现有音频处理库: 尽管直接使用<audio>标签或某些通用类库难以实现无缝拼接,但市场上存在专为音频处理设计的高级库,如Web Audio API,它允许更细粒度的音频处理和流式操作。通过Web Audio API,您可以创建一个MediaSource Extensions (MSE)的AudioBufferSourceNode,用于动态加载和拼接音频片段,确保每个片段在播放前正确设置其格式信息,从而避免手动添加头部带来的噪音问题。

    • 音频片段预处理: 在客户端接收音频数据前,可以通过服务端或中间件预先处理音频片段,确保每个片段都携带完整头部信息。虽然这增加了处理步骤,但可以提升客户端播放的连贯性和质量。

    2. 提供连续音频均可单独播放的音频序列方式

    建议方案:

    • 封装音频头部: 对于需要独立播放的每个音频片段,可以在传输前将其封装为包含完整头部信息的小型音频文件(如.wav或.mp3格式)。这样,每个片段都是自包含的,可以独立解码和播放,无需依赖前一个片段的头部信息。

    • 采用分段传输协议: 利用诸如MPEG-DASH或HLS等自适应流媒体技术,它们天然支持将音频流分割为一系列小的、可独立解码的片段(称为分片),每个分片都包含自己的元数据。这种格式不仅支持连续播放,也便于实现暂停、快进等操作,且在不同网络条件下能提供更好的用户体验。

    2024-09-10 23:42:23
    赞同 56 展开评论 打赏
问答地址:

基于通义系列大模型和开源大模型的一站式大模型服务平台,提供「生成式大模型的全流程应用工具」和「企业大模型的全链路训练工具」。为大模型,也为小应用。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载