Я хочу визуализировать в графике HoloViews, где текущий звук находится на графике. Эта строка должна обновляться автоматически при изменении значения pn.pane.Audio.time
PyViz (при воспроизведении звука или изменении Audio.time
).
Моя попытка:
# Python 3.7 in JupyterLab
import numpy as np
import holoviews as hv # interactive plots
hv.notebook_extension("bokeh")
import panel as pn
pn.extension()
from holoviews.streams import Stream, param
# create sound
sps = 44100 # Samples per second
duration = 10 # Duration in seconds
modulator_frequency = 2.0
carrier_frequency = 120.0
modulation_index = 2.0
time = np.arange(sps*duration) / sps
modulator = np.sin(2.0 * np.pi * modulator_frequency * time) * modulation_index
carrier = np.sin(2.0 * np.pi * carrier_frequency * time)
waveform = np.sin(2. * np.pi * (carrier_frequency * time + modulator))
waveform_quiet = waveform * 0.3
waveform_int = np.int16(waveform_quiet * 32767)
# PyViz Panel's Audio widget to play sound
audio = pn.pane.Audio(waveform_int, sample_rate=sps)
# generated plotting data
x = np.arange(11.0)
y = np.arange(11.0, 0.0, -1) / 10
y[0::2] *= -1 # alternate positve-negative
# HoloViews line plot
line_plot = hv.Curve((x, y)).opts(width=500)
# should keep track of audio.time; DOES NOT WORK
Time = Stream.define('Time', t=param.Number(default=0.0, doc='A time parameter'))
time = Time(t=audio.time)
# callback to draw line when time value changes
def interactive_play(t):
return hv.VLine(t).opts(color='green')
# dynamic map plot of line for current audio time
dmap_time = hv.DynamicMap(interactive_play, streams=[time])
# display Audio pane
display(audio)
# combine plot with stream of audio.time
line_plot * dmap_time
Почему это не работает?
Поскольку время установлено как param.Number()
, я ожидаю, что это будет отслеживать audio.time
. Следовательно, при воспроизведении звука необходимо постоянно вызывать обратный вызов interactive_play()
, в результате чего линия перемещается по графику. Этого не происходит, и в строке остается только значение по умолчанию 0,0 (или любое другое значение, которое audio.time
имеет во время выполнения кода).
Как мне обновить VLine
, чтобы отслеживать audio.time
?