Python 如何向wav文件添加头信息以获得与ffmpeg相同的结果?

Python 如何向wav文件添加头信息以获得与ffmpeg相同的结果?,python,ffmpeg,wav,Python,Ffmpeg,Wav,我正试图用Fastspeech生成一个.wav文件。当我将数据保存为.pcm文件,并通过ffmpeg将其传输到.wav时,效果很好。但当我只添加一个wav头信息并将其保存到.wav时,听起来非常嘈杂,我的代码怎么了 pcm的代码: wav = wav.astype(np.float32) wav = wav.tostring() with open('test.pcm', 'wb') as f: f.write(wav) ffmpeg命令: ffmpeg

我正试图用Fastspeech生成一个.wav文件。当我将数据保存为.pcm文件,并通过ffmpeg将其传输到.wav时,效果很好。但当我只添加一个wav头信息并将其保存到.wav时,听起来非常嘈杂,我的代码怎么了

pcm的代码:

    wav = wav.astype(np.float32)
    wav = wav.tostring()
    with open('test.pcm', 'wb') as f:
        f.write(wav)
ffmpeg命令:

ffmpeg -f f32le -ar 16000 -i test.pcm file.wav  # works well
直接写wav:

import struct

def pcm2wav(sample_rate, pcm_voice):
    if pcm_voice.startswith("RIFF".encode()):
        return pcm_voice
    else:
        sampleNum = len(pcm_voice)
        rHeaderInfo = "RIFF".encode()
        rHeaderInfo += struct.pack('i', sampleNum + 44)
        rHeaderInfo += 'WAVEfmt '.encode()
        rHeaderInfo += struct.pack('i', 16)
        rHeaderInfo += struct.pack('h', 1)
        rHeaderInfo += struct.pack('h', 1)
        rHeaderInfo += struct.pack('i', sample_rate)
        rHeaderInfo += struct.pack('i', sample_rate * int(32 / 8))
        rHeaderInfo += struct.pack("h", int(32 / 8))
        rHeaderInfo += struct.pack("h", 32)
        rHeaderInfo += "data".encode()
        rHeaderInfo += struct.pack('i', sampleNum)
        rHeaderInfo += pcm_voice
        return rHeaderInfo

# .......
# get data with FastSpeech model
wav = wav.astype(np.float32)
wav = wav.tostring()
wav = pcm2wav(16000, wav)
with open('test.wav', 'wb') as f:
    f.write(wav)   # many noisy sounds

我问了这个问题,终于解决了。我将第一个
struct.pack('h',1)
替换为
struct.pack('h',3)
,它可以工作

我发现
scipy.io.wavfile.write
可以生成一个好的wav文件。然后我在这个函数的源代码中得到了答案

if dkind == 'f':
    format_tag = WAVE_FORMAT_IEEE_FLOAT  # WAVE_FORMAT_IEEE_FLOAT=3
else:
    format_tag = WAVE_FORMAT_PCM  # WAVE_FORMAT_PCM=1
# ...
fmt_chunk_data = struct.pack('<HHIIHH', format_tag, channels, fs,
                                 bytes_per_second, block_align, bit_depth)
如果dkind==“f”:
格式\标签=波形\格式\ IEEE \浮点数\波形\格式\ IEEE \浮点数=3
其他:
格式标签=波形格式PCM#波形格式PCM=1
# ...
fmt\u chunk\u data=struct.pack('