Python 如何在wav文件前添加静音

Python 如何在wav文件前添加静音,python,audio,wav,Python,Audio,Wav,我是python新手。我正在做一个利用音频(WAV)文件的实验。我有100多个不同长度的音频文件。最长的是10秒。但是对于我的实验,我需要所有文件都有相同的长度,即10秒。所以我想在这些文件前面加上几秒钟的沉默,长度不到10秒 那么,如何使用python为WAV文件的开头添加静默呢?使用可变静默长度我编写了一个小脚本,它允许您使用静默预加信号,以获得以秒为单位的目标持续时间。它使用scipy函数读取wav文件 #!/usr/bin/env python from __future__ impo

我是python新手。我正在做一个利用音频(WAV)文件的实验。我有100多个不同长度的音频文件。最长的是10秒。但是对于我的实验,我需要所有文件都有相同的长度,即10秒。所以我想在这些文件前面加上几秒钟的沉默,长度不到10秒


那么,如何使用python为WAV文件的开头添加静默呢?使用可变静默长度

我编写了一个小脚本,它允许您使用静默预加信号,以获得以秒为单位的目标持续时间。它使用scipy函数读取wav文件

#!/usr/bin/env python

from __future__ import print_function, division
import scipy.io.wavfile as wavf
import numpy as np
from sys import argv

def pad_audio(data, fs, T):
    # Calculate target number of samples
    N_tar = int(fs * T)
    # Calculate number of zero samples to append
    shape = data.shape
    # Create the target shape    
    N_pad = N_tar - shape[0]
    print("Padding with %s seconds of silence" % str(N_pad/fs) )
    shape = (N_pad,) + shape[1:]
    # Stack only if there is something to append    
    if shape[0] > 0:                
        if len(shape) > 1:
            return np.vstack((np.zeros(shape),
                              data))
        else:
            return np.hstack((np.zeros(shape),
                              data))
    else:
        return data

if __name__ == "__main__":
    if len(argv) != 4:
        print("Wrong arguments.")
        print("Use: %s in.wav out.wav target_time_s" % argv[0])
    else:
        in_wav = argv[1]
        out_wav = argv[2]
        T = float(argv[3])        
        # Read the wav file
        fs, in_data = wavf.read(in_wav)
        # Prepend with zeros
        out_data = pad_audio(in_data, fs, T)
        # Save the output file
        wavf.write(out_wav, fs, out_data)

如果您想在结尾附加静默,这非常简单

仅在
'r+'
模式下,使用移动到文件末尾,并使用写入必要数量的零帧。 最后,不要忘记保存文件(或用作上下文管理器)

这将更改文件的位置


如果你想在开头添加沉默,你必须复制@jojek显示的现有内容(但如果你愿意,你仍然可以使用PySoundFile)。

正如@Same的评论中所指出的,这两种方法都导致了我的质量大幅下降。相反,我最终使用这个包来解决我的问题(对我来说,我准备了一个固定的持续时间,但是你可以围绕上面的用例扩展这个答案)。请注意,可以在上找到更好的文档


我认为最好是结束沉默,否则听众必须忍受一段未知的沉默时间,然后才会对实际的声音感到惊讶。无论如何,您可以尝试通过创建/播放一个WAV文件来实现这一点,该文件具有足够的采样率,无论您使用的采样率如何,都可以持续(10-L)秒,其中L是实际音频文件的持续时间。你试过什么?PS有一个名为wave的Python标准库包,您可能会感兴趣。我通过搜索:pythonwav音频找到了它。您尝试过搜索吗?变量T是什么?如所述:
target\u time\s
。在您的情况下是10秒。我运行您的代码,在使用vstack时收到以下错误消息。valueError:除连接轴外,所有输入数组维度必须完全匹配。我认为这是因为零填充的维度和数据是不同的。但我不知道如何修复它。代码现在运行良好。但音频质量下降太多。你甚至不能在这里说一句话。你有什么要说的吗?我不知道,因为我们没有你的信号。与我的信号没有什么不同,只是开始时的数字零。
import sox
tfm = sox.Transformer()
tfm.pad(start_duration=prepend_duration)
tfm.build(in_wav, out_wav)