Python 方法来减少 "breaks" 或应该连续的过程中的暂停,特别是音频?
Python methods to reduce "breaks" or pauses in processes that should continuous, specifically audio?
我正在尝试在歌曲播放时对其进行编辑。到目前为止,我已经成功地创建了一个流程,它 几乎 我想要的。我将分享它的工作原理以及让我来这里寻求建议的问题。
我将歌曲作为数组 y 和采样率 sr。然后,每 5 秒提供一次新 ping 的数据馈送(在下面表示为 arguments=[])。我在 播放期间使用该 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 中的 blocking=True,代码在播放整个剪辑时停止。所以延迟一定是可以解决的。
- 我考虑过线程或多处理。这是最好的方法吗?我的理解是线程不起作用,因为我的论点不是预先确定的。
- 我错过了什么?
编辑:
我测试了这个:
#x, sr = song_edit(y[front:end],sr, arg)
sd.play(y[front:end], sr, blocking=True)
延迟依然存在!因此,延迟一定是由循环的迭代或sd.play.
中固有的延迟引起的
接近答案:典型的播放(歌曲)功能,如 librosa、pyaudio、sounddevice 和许多其他功能,主要是为 jupyter 笔记本和简单实现而设计的。 (忘了来源)。我提到的每个库(我确定 pyaudio 和 sd)都有一个 Stream class,它比简单的播放功能更适合分析。
PyAudio:
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 文档,但我做了一个小改动:回调函数中的打印语句。此代码的输出(连同其他一些行,例如实例化对象)将是音频输出 +“We Done it!”每秒打印多次。
我仍然不完全理解回调的工作原理,但这有助于推动我的旅程。
我正在尝试在歌曲播放时对其进行编辑。到目前为止,我已经成功地创建了一个流程,它 几乎 我想要的。我将分享它的工作原理以及让我来这里寻求建议的问题。
我将歌曲作为数组 y 和采样率 sr。然后,每 5 秒提供一次新 ping 的数据馈送(在下面表示为 arguments=[])。我在 播放期间使用该 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 中的 blocking=True,代码在播放整个剪辑时停止。所以延迟一定是可以解决的。
- 我考虑过线程或多处理。这是最好的方法吗?我的理解是线程不起作用,因为我的论点不是预先确定的。
- 我错过了什么?
编辑: 我测试了这个:
#x, sr = song_edit(y[front:end],sr, arg)
sd.play(y[front:end], sr, blocking=True)
延迟依然存在!因此,延迟一定是由循环的迭代或sd.play.
中固有的延迟引起的接近答案:典型的播放(歌曲)功能,如 librosa、pyaudio、sounddevice 和许多其他功能,主要是为 jupyter 笔记本和简单实现而设计的。 (忘了来源)。我提到的每个库(我确定 pyaudio 和 sd)都有一个 Stream class,它比简单的播放功能更适合分析。
PyAudio: 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 文档,但我做了一个小改动:回调函数中的打印语句。此代码的输出(连同其他一些行,例如实例化对象)将是音频输出 +“We Done it!”每秒打印多次。
我仍然不完全理解回调的工作原理,但这有助于推动我的旅程。