python - Jupyter 循环播放声音

每次满足特定条件时,我都想在 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)”。尽管如此,这仍然不是最佳选择,更重要的是,如果我想同时播放多个声音,这是行不通的。

最佳答案

刚好看到这个

存在更清洁的解决方案

  1. 定义一个输出小部件到您重定向所有音频输出的地方

output = widgets.Output()

  1. 每次都清除该小部件
   with output:
       clear_output()
       synth(f)
  1. 将输出小部件添加到布局

widgets.VBox([widgets.Box(buttons),output])

https://stackoverflow.com/questions/58784637/

相关文章:

python-3.x - 模块错误 : Rasterio has no attribute open

django - 重定向到 Django Admin 中的过滤列表

java - 如何禁用 Spring Actuators 的内容协商?

python - Jupyterhub-错误 :asyncio:Task exception was

postgresql - 通过 EC2 从 sqlalchemy 连接 AWS RDS

c# - .Net Core Linux 不支持 SecurityIdentifier?

typescript - 如何在 Visual Studio CE 2019 中使用#region/

amazon-web-services - Cloudwatch 中未显示 Cognito 的指标

python - 在 Python 中打印大型 JSON 文件的前几行

reactjs - react Apollo 测试 : MockProvider takes a l