使用PyAudio生成音调时为何会有点击声?

2 投票
1 回答
1577 浏览
提问于 2025-04-18 02:18

标题已经说明了问题是什么。我不知道该怎么解决这个问题。每次播放音调之间都会有咔嗒声。有些人听起来像是“啪”的一声。

import math
import pyaudio
import sys

PyAudio = pyaudio.PyAudio


def playTone(rate,wave,time,channel):
  data = ''.join([chr(int(math.sin(x/((rate/wave)/math.pi))*127+128)) for x in xrange(rate)])
  p = PyAudio()

  stream = p.open(format =
    p.get_format_from_width(1),
    channels = channel,
    rate = rate,
    output = True)
  for DISCARD in xrange(int(time)):
      stream.write(data)
  #stream.stop_stream()
  #stream.close()
  #p.terminate()


'''
playTone(88000,400,1,2)
playTone(88000,500,1,1)
playTone(88000,600,1,2)
playTone(88000,700,1,2)
'''

def scale(noteNumber):
  counter = 100
  while noteNumber*100 > counter:
    playTone(88000,100+counter,1,2)
    counter += 100

scale(10)

1 个回答

2

在构建 data = ''.join([... 和播放 stream.write(data) 之间,有一个时间间隔。

这个间隔会发出“咔嗒”的声音。

要找出原因,可以尝试把 data 输出出来,然后以 88000Hz、8位和2声道的原始数据格式播放。

一个简单的解决办法是,在播放之前先生成好所有的信号。

或者,可以使用不同的线程来同时生成和播放声音。

撰写回答