python - 使用 PyAudio 作为振荡器删除/控制点击声音

标签 python audio signal-processing pyaudio portaudio

运行时,音调之间会发出咔哒声。我不介意太多的咔哒声——它的节奏很悦耳。也就是说……

  • 我希望能够在我不想要时摆脱这种咔哒声。
  • 更好的是,如果能够控制点击声音就好了 以某种方式 - 音量等。

我看过这个帖子,但还不知道如何将它应用到我的问题中: How to remove pops from concatented sound data in PyAudio

有什么想法吗?感谢您的宝贵时间!

import numpy
import pyaudio
import math
import random


def sine(frequency, length, rate):
    length = int(length * rate)
    factor = float(frequency) * (math.pi * 2) / rate
    waveform = numpy.sin(numpy.arange(length) * factor)
    return waveform


def play_tone(stream, frequency, length, rate=44100):
    chunks = []
    chunks.append(sine(frequency, length, rate))

    chunk = numpy.concatenate(chunks) * .25

    stream.write(chunk.astype(numpy.float32).tostring())


def bassline():
        frequency = 300
        for i in range(1000000):
            play_tone(stream, frequency, .15)
            change = random.choice([-75, -75, -10, 10, 2, 3, 100, -125])
            print (frequency)
            if frequency < 0:
                frequency = random.choice([100, 200, 250, 300])
            else:
                frequency = frequency + change 

if __name__ == '__main__':
    p = pyaudio.PyAudio()
    stream = p.open(format=pyaudio.paFloat32,
                    channels=1, rate=44100, output=4)

bassline()

/编辑

我绘制了音调,看起来不连续性存在于每个音调的开始和结束阶段之间的关系中。

First tone

Second tone

有什么办法可以解决这个问题吗?

最佳答案

如两个波形图像所示,当您在频率之间切换时,由于波形振幅的快速变化,您会听到咔嗒声。为了解决这个问题,您需要在更改频率时保持波形的相位。我认为最简单的方法是添加一个变量来记录每次正弦调用后波形周期中的最后位置。结束位置可以用作下一个正弦调用的开始位置。

类似于:

phase_start = phase_position
phase_end = phase_start + length
waveform = numpy.sin(numpy.arange(phase_start, phase_end) * factor)
phase_position = phase_end

Pitch shift maintaining cycle position

注意:我认为这是可行的最简单的答案,但我建议使用您引用的问题中的信息。您应该以弧度为单位保持播放的正弦波的相位。 How to remove pops from concatented sound data in PyAudio

关于python - 使用 PyAudio 作为振荡器删除/控制点击声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42192239/

相关文章:

python - 尝试弄清楚如何将命令的输出保存到文件路径

python - 为什么在 MacOS 中启动 Django 服务器时出现错误?

c# - 如何连接到 Windows 7 音频

python - 滑动邻域操作 PYTHON

Python scipy.fftpack.rfft 频点映射

python - 使用 Python 读取大文件

python - 如何在 Python 中生成 JSON 格式的 Kafka 消息

react-native - 如何在UI react native Flatlist中显示音频播放器

python - 使用Python的音频处理服务器工作流程

python - 从原始WAV音频中获取信号的正负分量