gpt4 book ai didi

python - python音频播放器经过过滤而没有抖动

转载 作者:行者123 更新时间:2023-12-03 02:08:46 26 4
gpt4 key购买 nike

对于一个项目,我需要

  • 读取WAV文件
  • 过滤器
  • 播放WAV文件

  • 下面的代码是“有效的”,除了声音嘶哑,这是因为我不能保证继续向音频输出发送数据。过滤需要一些时间,因此声音会在很短的时间内冻结。

    将来,我想对原始音频数据进行一些额外的计算。我想知道哪种方法最适合保持声音流畅。

    import pyaudio  
    import wave
    from scipy import signal
    from struct import *

    chunk = 1024

    f = wave.open("sample.wav","rb")
    p = pyaudio.PyAudio()

    stream = p.open(format = p.get_format_from_width(f.getsampwidth()),
    channels = f.getnchannels(),
    rate = f.getframerate(),
    output = True)

    data = f.readframes(chunk)
    b, a = signal.butter(2, 0.01)

    tmp = len(data)/2
    s = '<'
    for i in range(0,tmp):
    s = s + 'h'

    while data != '':
    sig = signal.filtfilt(b, a, unpack(s,data))

    output_signal = pack(s,*sig)
    stream.write(output_signal)
    data = f.readframes(chunk)

    stream.stop_stream()
    stream.close()
    p.terminate()

    提前致谢!

    最佳答案

    您可以尝试将数据的生产者和使用者(即pyaudio)分成两个程序,并使用常规的Unix管道将它们连接起来。 Unix管道扮演缓冲的角色。例:

    在producer.py中:

    while data != '':
    sig = signal.filtfilt(b, a, unpack(s,data))
    output_signal = pack(s,*sig)
    sys.stdout.write(output_signal) # <===
    data = f.readframes(chunk)

    在Consumer.py中:
    while 1:
    data = sys.stdin.read(1024)
    if not data: break
    stream.write(data)

    命令行调用:
    python producer.py | python consumer.py

    如果可行,那么您也可以使用 python consumer.py从其他程序内部运行 os.popen()

    关于python - python音频播放器经过过滤而没有抖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26004480/

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