【发布时间】:2016-07-26 03:09:03
【问题描述】:
如何去除由音调声音片段连接在一起构成的音频中的“爆裂声”和“咔嗒声”?
我有这个 PyAudio 代码用于生成一系列音调:
import time
import math
import pyaudio
class Beeper(object):
def __init__(self, **kwargs):
self.bitrate = kwargs.pop('bitrate', 16000)
self.channels = kwargs.pop('channels', 1)
self._p = pyaudio.PyAudio()
self.stream = self._p.open(
format = self._p.get_format_from_width(1),
channels = self.channels,
rate = self.bitrate,
output = True,
)
self._queue = []
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.stream.stop_stream()
self.stream.close()
def tone(self, frequency, length=1000, play=False, **kwargs):
number_of_frames = int(self.bitrate * length/1000.)
##TODO:fix pops?
g = get_generator()
for x in xrange(number_of_frames):
self._queue.append(chr(int(math.sin(x/((self.bitrate/float(frequency))/math.pi))*127+128)))
def play(self):
sound = ''.join(self._queue)
self.stream.write(sound)
time.sleep(0.1)
with Beeper(bitrate=88000, channels=2) as beeper:
i = 0
for f in xrange(1000, 800-1, int(round(-25/2.))):
i += 1
length = log(i+1) * 250/2./2.
beeper.tone(frequency=f, length=length)
beeper.play()
但是当音调发生变化时,音频中有一种独特的“砰砰”声,我不知道如何消除它。
起初,我认为弹出是因为我正在立即播放每个剪辑,并且在我生成剪辑时每次播放之间的时间足以导致音频平坦化。但是,当我将所有剪辑连接成一个字符串并播放时,流行音乐仍然存在。
然后,我认为正弦波在每个剪辑的边界处不匹配,所以我尝试将当前音频剪辑的前 N 帧与前一个剪辑的最后 N 帧进行平均,但这也有没有效果。
我做错了什么?我该如何解决这个问题?
【问题讨论】:
-
你看过波形了吗?
-
在这里猜测.. 可能会分离出一个简单而单一的哔哔声。声音就像放大器正在打开和关闭。此外,88000 似乎是哔哔声的高比特率。这是唧唧喳喳吗?比特率编码电压幅度,其中频率带宽用于保真度。