gpt4 book ai didi

python - pyaudio 中的破解声音正弦音调

转载 作者:太空宇宙 更新时间:2023-11-04 03:03:01 24 4
gpt4 key购买 nike

我正在使用 python 和 pyaudio 使用回调方法流式传输纯正弦音,以便稍后通过用户输入调制声音。一切都很好,除了当我运行代码时,我收到 1-2 秒的与警告消息相关的爆裂声ALSA lib pcm.c:7339:(snd_pcm_recover) underrun occurred之后,正弦音被正确传输。关于如何消除初始爆裂声的任何提示?这是流式传输一秒钟声音的代码

import pyaudio
import time
import numpy as np

CHANNELS = 1
RATE = 44100
freq = 600
CHUNK = 1024
lastchunk = 0
def sine(current_time):
global freq,lastchunk
length = CHUNK
factor = float(freq)*2*np.pi/RATE
this_chunk = np.arange(length)+lastchunk
lastchunk = this_chunk[-1]
return np.sin(this_chunk*factor)

def get_chunk():
data = sine(time.time())
return data * 0.1


def callback(in_data, frame_count, time_info, status):
chunk = get_chunk() * 0.25
data = chunk.astype(np.float32).tostring()
return (data, pyaudio.paContinue)

p = pyaudio.PyAudio()

stream = p.open(format=pyaudio.paFloat32,
channels=CHANNELS,
rate=RATE,
output=True,
stream_callback=callback)

stream.start_stream()
time.sleep(1)




stream.stop_stream()
stream.close()

干杯

最佳答案

PortAudio(PyAudio 背后的库)允许您指定 block 大小,在 PyAudio 示例中通常称为 CHUNK。如果您不指定,默认值为 0,在 PortAudio 术语中这意味着 block 大小将自动选择,甚至会在回调之间变化!

要检查这一点,请尝试在回调中打印 frame_count(这是 block 大小的另一个名称)。我怀疑 PortAudio 一开始选择的 block 大小太小,当这导致欠载时,它会增加 block 大小。我说得对吗?

为避免这种情况,您应该从一开始就指定一个固定的 block 大小,使用:

stream = p.open(..., frames_per_buffer=CHUNK, ...)

... 其中 frames_per_buffer 是 block 大小的另一个名称。

这也更有意义,因为到目前为止,您在不知道实际 block 大小的情况下在代码中使用 length = CHUNK!

如果这仍然导致数据不足,您可以尝试将 block 大小进一步增加到 2048

最后,让我冒昧地为我自己的 PortAudio 包装器制作一个不要脸的插件,sounddevice模块。它与 PyAudio 的功能基本相同,但更易于安装,恕我直言,它具有更好的 API,并且它直接支持 NumPy,无需您进行手动转换。

关于python - pyaudio 中的破解声音正弦音调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40378640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com