gpt4 book ai didi

python - 如何将标题信息添加到 wav 文件以获得与 ffmpeg 相同的结果?

转载 作者:行者123 更新时间:2023-12-04 23:01:35 25 4
gpt4 key购买 nike

我正在尝试使用 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)
我的数据是 float32 类型,所以它的 format_tag 应该是 3,而不是 1。

关于python - 如何将标题信息添加到 wav 文件以获得与 ffmpeg 相同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67317366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com