You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将NumPy数组转换为pydub.AudioSegment以实现音频合并

将TTS输出的NumPy音频数组转换为pydub.AudioSegment格式

要完成这个转换,核心是把模型输出的归一化float32数组转成pydub能识别的PCM字节流格式,具体步骤和代码如下:

关键前提

你需要知道TTS模型输出音频的采样率(比如常见的22050Hz、44100Hz),以及声道数(大部分TTS模型默认单声道)。

转换代码实现

先导入依赖库:

import numpy as np
from pydub import AudioSegment
import io

然后写一个转换函数:

def numpy_to_audiosegment(audio_np, sample_rate=22050):
    # 先把float32数组(范围[-1,1])裁剪到合法范围,再转成int16格式
    # int16的最大值是32767,所以要做缩放
    audio_np = np.clip(audio_np, -1.0, 1.0)
    audio_int16 = (audio_np * 32767).astype(np.int16)
    
    # 将int16数组转成字节流
    byte_stream = io.BytesIO()
    audio_int16.tofile(byte_stream)
    byte_stream.seek(0)  # 重置流指针到开头
    
    # 用pydub的from_raw方法生成AudioSegment
    return AudioSegment.from_raw(
        byte_stream,
        sample_width=2,  # int16对应2字节的样本宽度
        frame_rate=sample_rate,
        channels=1  # 单声道,立体声的话改成2
    )

使用示例

假设audio[0].data.cpu().numpy()是你的TTS模型输出数组:

# 获取模型输出的numpy音频数组
tts_audio = audio[0].data.cpu().numpy()

# 转换为AudioSegment(记得替换成你的模型采样率)
audio_segment = numpy_to_audiosegment(tts_audio, sample_rate=22050)

# 现在就可以传入你的合并函数使用了
# merged_audio = your_merge_function([audio_segment, another_segment])

注意事项

  • 如果你的TTS模型输出是立体声,把channels参数改成2;
  • 采样率必须和模型输出一致,否则音频播放速度会异常;
  • 裁剪操作np.clip是为了防止数组里有超出[-1,1]的异常值,避免转换int16时溢出。

内容的提问来源于stack exchange,提问作者Max Melichov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 06:40:17