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()”,但这样做太早会中断当前正在播放的任何声音,而且无论如何我想它需要资源来不断清除和重新加载小部件,所以如果以这种方式使用它不是一个解决方案。有没有办法只更新小部件以便只显示一个?是否可以在没有小部件的情况下完成这项工作?
PS:最后我想通过MyBinder提供一个在线版本的笔记本,所以它应该也可以在那里工作。
编辑:在显示短声音的显示类型后使用“clear_output(wait=True)”。尽管如此,这并不是最佳选择,更重要的是,如果我想同时播放多个声音,这将不起作用。
解决方案
刚好读到这个
更清洁的解决方案存在于
- 定义一个输出小部件到您将所有音频输出重定向到的位置
输出 = 小部件。输出()
- 每次清除那个小部件
with output: clear_output() synth(f)
- 将输出小部件添加到布局
widgets.VBox([widgets.Box(buttons),output])
推荐阅读
- google-apps-script - 尝试获取两个不同的图像并将它们插入文档时,“TypeError:无法读取未定义的属性'getBlob'”
- watchkit - iPhone断开连接时如何在Watchkit中检测
- azure-active-directory - Azure B2C - 自定义策略 - 连接身份提供者时出错
- python - Python regex - 将名称与合法形式匹配
- java - 地图结构
/到 / 映射 - c++ - 移动智能指针两次与复制
- cybersource - 无法从沙盒复制支付工具令牌创建操作,出现“无效的配置文件所有者”错误
- javascript - 在饼图上显示标签而不是数据值 Chart.js
- python - teensy bord 与系统之间使用 python 进行串行通信
- mysql - 优化运行时间更长的mysql查询