保存音频文件——torchaudio.save 与其他格式
波形数组格式
chat.infer() 返回的每条音频都是一个一维 numpy 数组:
- float32 类型
- 采样率固定 24000 Hz
- 数值范围 -1.0 ~ 1.0
- 长度 = 时长(秒)× 24000
用 torchaudio 保存 WAV
import torch
import torchaudio
wav = wavs[0] # 取第一条
tensor = torch.from_numpy(wav) # numpy → tensor
if tensor.dim() == 1:
tensor = tensor.unsqueeze(0) # 单声道需要加 batch 维度
torchaudio.save("output.wav", tensor, 24000)
注意 unsqueeze(0)——torchaudio.save 期望输入是 (channels, samples) 二维张量,单声道就是 (1, samples)。
用 soundfile 保存
import soundfile as sf
sf.write("output.wav", wavs[0], 24000)
soundfile 库对一维数组直接支持,不需要手动加维度。
在 Notebook 里直接播放
from IPython.display import Audio
Audio(wavs[0], rate=24000, autoplay=True)
转成 MP3
ChatTTS 原生只生成 WAV。转 MP3 需要额外工具:
pip install pydub
from pydub import AudioSegment
import io
wav_bytes = io.BytesIO()
torchaudio.save(wav_bytes, tensor, 24000, format="wav")
wav_bytes.seek(0)
audio = AudioSegment.from_wav(wav_bytes)
audio.export("output.mp3", format="mp3")
保存多条音频的批量写法
for i, wav in enumerate(wavs):
tensor = torch.from_numpy(wav).unsqueeze(0)
torchaudio.save(f"output_{i}.wav", tensor, 24000)
常见报错
| 错误 | 原因 | 修复 |
|---|---|---|
torchaudio.save dimension error | 没加 unsqueeze(0) | 手动把一维转二维 |
soundfile.LibsndfileError | 格式不支持 | 用 .wav 后缀 |
| WAV 文件无法播放 | 采样率或字节序问题 | 确认第三个参数传了 24000 |