gpt4 book ai didi

减少 "breaks"或在应该连续的进程中暂停的 Python 方法,特别是音频?

转载 作者:行者123 更新时间:2023-12-04 11:43:54 27 4
gpt4 key购买 nike

我正在尝试在歌曲播放时编辑歌曲。到目前为止,我已经成功地创建了一个几乎可以满足我想要的流程。我将分享它是如何工作的以及将我带到这里寻求建议的问题。
我将一首歌曲作为数组 y 和采样率 sr。然后,每 5 秒提供一次新 ping 的数据馈送(在下面表示为参数 = [])。我在播放过程中使用该 ping 来编辑我的歌曲。然后,每 5 秒重复一次。

import librosa as lr
y, sr = lr.load(song)
arguments=[] # Populated from external source.
for arg in arguments:
end += some_interval
if end > y.size: ... # breaks out of the loop if the song is over.
x, sr = song_edit(y[front:end],sr, arg)
sd.play(x, sr, blocking=True)
front=end
问题:
  • 在一个 5 秒的音乐剪辑和下一个剪辑结束时会出现轻微的延迟。在音乐中,这从根本上是有问题的。

  • 我考虑过的解决方案:
  • 由于 sd.play 中的 blocks=True,代码在整个剪辑播放时停止。因此,延迟必须是可解的。
  • 我考虑过线程或多处理。这是最好的方法吗?我的理解是线程不会起作用,因为我的论点不是预先确定的。
  • 我错过了什么?

  • 编辑:
    我测试了这个:
    #x, sr = song_edit(y[front:end],sr, arg)
    sd.play(y[front:end], sr, blocking=True)
    延迟还在!因此,延迟一定是循环的迭代或sd.play中固有的延迟造成的。

    最佳答案

    更接近答案:典型的 play(song) 函数,如 librosa、pyaudio、sounddevice 和许多其他函数,主要是为 jupyter notebooks 和简单实现而设计的。 (忘记来源)。我提到的每个库(我确定 pyaudio 和 sd)都有一个 Stream 类,它比简单的播放函数更适合分析。
    音频:
    Stream 对象的一个​​可选参数是回调。随着流恢复,流通过回调函数循环,该函数向流提供数据。

        # define callback (2)
    def callback(in_data, frame_count, time_info, status):
    data = wf.readframes(frame_count)
    print('We Done it!')
    return (data, pyaudio.paContinue)


    # open stream using callback (3)
    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
    channels=wf.getnchannels(),
    rate=wf.getframerate(),
    output=True,
    stream_callback=callback)
    这段代码来自 PyAudio 文档,但我做了一个小改动:回调函数中的打印语句。此代码的输出(以及其他一些行,如实例化对象)将是音频输出 +“我们完成了!”每秒打印多次。
    我仍然不完全理解回调是如何工作的,但这有助于插入我在我的旅程中前进。

    关于减少 "breaks"或在应该连续的进程中暂停的 Python 方法,特别是音频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67814864/

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