Я хотел бы воспроизводить звук в блокноте Jupyter каждый раз, когда выполняется определенное условие. После просмотра аналогичных вопросов по stackoverflow, мне удалось почти достичь этого, особенно благодаря этой теме: Воспроизведение аудио в jupyter, в цикле for . Записная книжка выглядела бы примерно так:
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)» после отображения на дисплее вида работ для коротких звуков. Тем не менее, это не оптимально и, что более важно, не работает, если я хочу, чтобы несколько звуков воспроизводились одновременно.