Torchaudio.save() .wav文件比原来的.wav文件大两倍



我对pytorch和torchaudio真的很陌生。我发现它保存的文件比原始文件大两倍。但我只是加载一个。wav文件,并立即将音频保存到另一个。wav文件。为什么它会变大?

我检查了位深度(?),采样率都是相同的。是什么使保存的文件比原始文件大两倍?此外,它也不是完全两倍大。它稍微小一点。我找不到和我有同样情况的人。我猜原件是压缩文件吧?因为resave_audio的保存文件保持不变。

谁能给我一个提示或关键词关于什么情况?
import os
import torchaudio
ori_audio, ori_sr = torchaudio.load('LJ037-0171.wav')
torchaudio.save('LJ037-0171_resave.wav', ori_audio, ori_sr)
resave_audio, resave_sr = torchaudio.load('LJ037-0171_resave.wav')
print(f'Original sr: {ori_sr}, Resaved sr: {resave_sr}')
print(f'Audio tensor equal: {torch.equal(ori_audio, resave_audio)}')
print(f'datatype of ori_audio: {ori_audio[0, 1].dtype}')
print(f'datatype of ori_audio: {resave_audio[0, 1].dtype}')
print(f'Shape of ori: {ori_audio.shape}')
print(f'Shape of resave: {ori_audio.shape}')
print(f'File size of original wav: {os.path.getsize("LJ037-0171.wav")}')
print(f'File size of resaved wav: {os.path.getsize("LJ037-0171_resave.wav")}')

输出:

Original sr: 22050, Resaved sr: 22050
Audio tensor equal: True
datatype of ori_audio: torch.float32
datatype of ori_audio: torch.float32
Shape of ori: torch.Size([1, 167226])
Shape of resave: torch.Size([1, 167226])
File size of original wav: 334496
File size of resaved wav: 668962

我能够复制它,感谢您提供的代码的清晰度。区别来自于torchaudio,如果没有指定,它使用默认编码设置。我猜你的原始样本来自LJSpeech,在这个数据集样本被编码为16位有符号整数PCM,这意味着每个音频样本需要从-32767到+32768的整数值,所以每个样本需要16位。

torchaudio.load默认使用32位浮点PCM,这意味着每个样本都是一个浮点数,在32位上,浮点值从-1.0到+1.0。由于您没有在torchaudio.load中指定编码,因此它将其更改为默认值,现在每个样本都以32位编码。当您保存结果时,使用的是这个32位版本,因此文件的大小几乎是原来的两倍。您可以使用soxi LJ037-0171_resave.wav

检查编码。如果你想指定编码和每个样本的位,你可以根据Torchaudio后端文档,并指定bits_per_sampleencoding在你的torchaudio.loadtorchaudio.save函数。如果您使用bits_per_sample=16encoding=PCM_S(对于已签名的PCM),您应该有完全相同的文件。

相关内容