如何在wav文件前添加静音

时间:2015-09-08 22:37:58

标签: python audio wav

我是python的新手。我正在进行一项利用音频(WAV)文件的实验。我有超过100个可变长度的音频文件。其中最长的是10秒。但是对于我的实验,我需要所有文件具有相同的长度,即10秒。所以我想在这些文件前面加上几秒钟的静音,长度不到10秒。

那么如何使用python将静音添加到WAV文件的开头呢?可变长度的沉默

3 个答案:

答案 0 :(得分:2)

我做了一个小脚本,它允许你以沉默为前置信号,以便以秒为单位获得目标持续时间。它使用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)

答案 1 :(得分:0)

如果你想在最后添加沉默,PySoundFile就很简单了。

'r+'模式下只需open the file,使用seek(0, sf.SEEK_END)移动到文件末尾并使用write()写入必要数量的零帧。 最后,不要忘记close()文件(或使用SoundFile作为上下文管理器)。

这会就地更改文件。

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

答案 2 :(得分:0)

正如@Same的评论中所述,这两种方法都对我造成了巨大的质量下降。相反,我最终还是使用pysox包解决了我的问题(对我来说,我正在预先设定一个持续时间,但是您可以围绕上述用例扩展此答案)。请注意,可以在https://buildmedia.readthedocs.org/media/pdf/pysox/latest/pysox.pdf上找到更好的文档。

import sox
tfm = sox.Transformer()
tfm.pad(start_duration=prepend_duration)
tfm.build(in_wav, out_wav)