首页 > 解决方案 > 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)”。尽管如此,这并不是最佳选择,更重要的是,如果我想同时播放多个声音,这将不起作用。

标签: pythonaudiojupyter-notebook

解决方案


刚好读到这个

更清洁的解决方案存在于

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

输出 = 小部件。输出()

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

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


推荐阅读