【发布时间】:2019-11-09 23:58:07
【问题描述】:
每次满足特定条件时,我想在 jupyter notebook 中播放声音。 在浏览了关于 stackoverflow 的类似问题后,我几乎成功地做到了这一点,特别感谢这个线程:Playing audio in jupyter, in a for loop。 笔记本看起来像这样:
import IPython.display as ipd
import ipywidgets as widgets
import numpy as np
output = widgets.Output()
display(output)
# Define sinewave to produce sound
sr = 44100
T = 2 # seconds
t = np.linspace(0, T, int(T*sr), endpoint=False) # sample sine wave
freqs = [329.63,440.0,466.16,554.37,587.33]
for i in range(0,len(freqs)):
if (i<2):
x = 0.5*np.sin(2*np.pi*freqs[i]*t)
with output:
ipd.display(ipd.Audio(x, rate=sr,autoplay=True))
然而一个主要问题仍然存在:每次满足条件时,在显示输出的单元格中就会出现一个新的小部件;鉴于一个声音可能会播放数百次,这会在一段时间后导致速度大幅下降。此外,我根本不需要显示任何小部件,因为我只想自动播放声音。我曾尝试使用“output.clear_output()”,但这样做太早会中断当前播放的任何声音,而且无论如何我想它需要资源来不断清除和重新加载小部件,所以如果以这种方式使用它不是一个解决方案。 有没有办法只更新小部件以便只显示一个?是否可以在没有小部件的情况下完成这项工作?
P.S:最后我想通过 MyBinder 提供一个在线版本的笔记本,所以它应该也可以在那里工作。
编辑:使用“clear_output(wait=True)”后显示的显示类型适用于短音。尽管如此,这并不是最佳选择,更重要的是,如果我想同时播放多个声音,这将不起作用。
【问题讨论】:
-
我还发现了以下笔记本:github.com/ipython-books/cookbook-2nd-code/blob/master/… 这是一个虚拟合成器,基本上可以做我想做的事。然而,虽然它似乎在过去的某个时候有效,但现在不是,所以我猜 jupyter 的版本发生了一些变化。有人知道吗?
-
对于您说的那个虚拟合成器目前无法正常工作,删除
with widgets.Output():行并将synth(f)移动到它缩进正确的位置。我想在 Jupyter 中使用上下文管理协议工作的输出小部件的细节已经发生了微妙的变化,因为该笔记本是编写的,或者可能简化了the documentation。 -
按照您对合成器的建议,它确实可以工作,但是每次按下按钮时它都会显示一个新的输出,所以它不能解决我最初的问题。我认为如果我有办法在声音播放完毕后立即删除输出小部件,同时保持其他实例运行(希望我足够清楚),事情就会解决。我真的不太了解(阅读:“任何东西”:D)关于协议等,所以我很难弄清楚小部件发生了什么。
-
您似乎需要先捕获每一个,然后您可以使用
with上下文引用每个以清除特定输出,例如here。
标签: python audio jupyter-notebook