我想用 python 生成音频背景噪音并将其保存在 mp3 中。理想情况下,我还可以调整幅度和频率。有我可以使用的软件包吗?
谢谢 拉兹鲁
使用 scipy,您可以将 numpy 数组保存为
.wav
文件。您只需要从均值为零的正态分布生成一系列随机样本。 truncnorm
是截断正态分布,确保样本值不会太大或太小(+- 2^16
如果是 16 位 .wav
文件)
from scipy.io import wavfile
from scipy import stats
import numpy as np
sample_rate = 44100
length_in_seconds = 3
amplitude = 11
noise = stats.truncnorm(-1, 1, scale=min(2**16, 2**amplitude)).rvs(sample_rate * length_in_seconds)
wavfile.write('noise.wav', sample_rate, noise.astype(np.int16))
我认为这是对马克 2021 年 2 月 10 日的答案的轻微改进:
from scipy.io import wavfile
from scipy import stats
sample_rate = 44100
length_in_seconds = 3
noise = stats.truncnorm(-3, 3, scale = 0.3).rvs(size = sample_rate * length_in_seconds)
wavfile.write('noise float64 -3 +3 0.3).wav', sample_rate, noise)
改进之处在于我将 float64 样本保存到 WAV 文件中,而不是 int16。这提供了更好的分辨率,但文件也增大了 4 倍。 :-) 你可以选择 float32 作为妥协。
我个人使用scale = 0.2,因为在生成噪声文件后,我将其导入Audacity并使用高通和低通滤波器,并且出于某种原因 - 在https://forum.audacityteam.org/t中提到/extracting-Frequency-ranges-without-causing-amplification/42073/1 - 这会放大信号。因此,如果我使用scale = 0.3,我会得到裁剪。
3月17日补充:
我又改进了一点。如果您使用这个新版本,结果会好一点,因为每个频率的信号量变化会稍微小一些:
from scipy.io import wavfile
from scipy import stats
import numpy
sample_rate = 44100
length_in_seconds = 3
no_of_repetitions = 10
noise = numpy.array( stats.truncnorm(-1, 1, loc=0, scale=1).rvs(size = sample_rate * length_in_seconds * no_of_repetitions) )
if no_of_repetitions > 1:
slices = []
for i in range(no_of_repetitions):
slices.append(
numpy.array(noise[i * sample_rate * length_in_seconds:(i + 1) * sample_rate * length_in_seconds - 1]))
added_up = numpy.zeros(len(slices[0]))
for i in range(no_of_repetitions):
added_up = added_up + slices[i]
else:
added_up = noise
peak_value = numpy.max(numpy.abs(added_up))
numpy.abs(peak_value2))
added_up /= peak_value
wavfile.write('Quick noise float64 -1 +1 scale 1 rep 10.wav', sample_rate, added_up)
但是我发现了另一种更复杂的方法来创建“噪声”,该方法使每个频率的信号“量”变化稍小一些 - 请参阅如何使用 numpy 在频率范围内生成噪声?