0

在这里,我正在练习分析音频(wav 格式),以消除给定范围内的低音量并导出到新音频。它被格式化为 int16 数组,最大值给出 +(某个数字),最小值给出 -(某个数字)。现在结果是输出音频太小了,我认为问题出在错误的范围内。那么如何选择合适的范围呢?我在 min/2 和 max/2 之间给出了它。

from pydub import AudioSegment
import io
import scipy.io.wavfile
import IPython
import numpy as np

w = AudioSegment.from_file("input.wav", format="wav")
a = w.get_array_of_samples()

fp_arr = np.array(a).T.astype(np.int16)
avg = (max(fp_arr)/2).astype(np.int16)
avg2= (min(fp_arr)/2).astype(np.int16)

b=[]

for d in a:
   if d not in range(avg2,avg) :#d<avg2 and d>avg:
      b.append(d)

myarray = np.asarray(b)
wav_io = io.BytesIO()
scipy.io.wavfile.write(wav_io, 16000, myarray)
wav_io.seek(0)

sound = AudioSegment.from_wav(wav_io)
file_handle = sound.export("output.wav", format="wav")
4

1 回答 1

1

如果您拒绝某些样本而不用某些东西替换它们,那么生成的波较短是正常的。如果你打算做的是一种噪音门,你应该用沉默代替消除的样本。

但是,与任何动态处理器一样,真正的噪声门的工作方式略有不同。首先,如果遵循信号的包络线,这意味着它不考虑围绕轴的每次振荡(如果这样做,您将在每个振荡内切割一些样本,这意味着每秒几十次,这可能不是你想做什么)。取而代之的是噪音门分析最高时间水平的幅度变化。在该步骤之后,生成的信封不再包含负值。当这个包络低于定义的阈值时(假设功率为 0.125,或 16 位或 24 位的等效整数值),需要几毫秒才能稍微淡出(这意味着它将幅度乘以一个因子逐渐从 1 到 0)。相反,当信号再次超过阈值时,它会以少许淡入重新打开门。

如果您绕过这些小淡入/淡出,则生成的波形将包含令人不快的数字点击。如果您绕过用于平滑幅度的包络跟随器,您将过于频繁地关闭门。

于 2020-12-01T20:37:50.773 回答