ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-26 07:58:43  阅读:325  来源: 互联网

标签:pyaudio portaudio audio python signal-processing


运行时,音高之间会发出喀哒声.我不太介意点击声-令人愉快的节奏感.那个…

>我想在不需要的时候摆脱这种咔嗒声.
>更好的是,能够控制点击声音会很好
以某种方式-音量等

我已经看到了这个线程,但是还没有弄清楚如何将其应用于我的问题:
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

标签:pyaudio,portaudio,audio,python,signal-processing
来源: https://codeday.me/bug/20191026/1935073.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有