【问题标题】:how to add header info to a wav file to get a same result as ffmpeg?如何将标题信息添加到 wav 文件以获得与 ffmpeg 相同的结果?
【发布时间】:2021-07-22 19:42:54
【问题描述】:

我正在尝试使用 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

【问题讨论】:

    标签: python ffmpeg wav


    【解决方案1】:

    我问了这个问题,终于解决了。我将第一个 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)
    

    我的数据是float32类型,所以它的format_tag应该是3,而不是1。

    【讨论】:

      猜你喜欢
      • 2021-07-17
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 2021-11-06
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      相关资源
      最近更新 更多