如何在wav文件前添加静音
How to add silence in front of a wav file
我是 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)
如果你想在末尾附加静音,这很简单PySoundFile。
只需open the file in 'r+'
mode, use seek(0, sf.SEEK_END) to move to the end of the file and use write()写入必要数量的零帧。
最后别忘了close() the file (or use SoundFile作为上下文管理器)。
这会就地更改文件。
如果您想在开头添加静音,您必须复制现有内容,如@jojek 所示(但如果需要,您仍然可以为此使用 PySoundFile)。
如@Same 的评论所述,这两种方法都导致我的质量大幅下降。相反,我最终使用了 pysox package to solve my problem (for me, I was prepending a set duration, but you could extend this answer around the use case above). Note that better documentation can be found at 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)
我是 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)
如果你想在末尾附加静音,这很简单PySoundFile。
只需open the file in 'r+'
mode, use seek(0, sf.SEEK_END) to move to the end of the file and use write()写入必要数量的零帧。
最后别忘了close() the file (or use SoundFile作为上下文管理器)。
这会就地更改文件。
如果您想在开头添加静音,您必须复制现有内容,如@jojek 所示(但如果需要,您仍然可以为此使用 PySoundFile)。
如@Same 的评论所述,这两种方法都导致我的质量大幅下降。相反,我最终使用了 pysox package to solve my problem (for me, I was prepending a set duration, but you could extend this answer around the use case above). Note that better documentation can be found at 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)