Python 将HoloViews VLine与PyViz Panel audio.time同步
我想在HoloViews图中显示当前音频在图形中的位置。当PyViz的Python 将HoloViews VLine与PyViz Panel audio.time同步,python,audio,holoviews,pyviz,panel-pyviz,Python,Audio,Holoviews,Pyviz,Panel Pyviz,我想在HoloViews图中显示当前音频在图形中的位置。当PyViz的pn.pane.Audio.time值更改时(当播放音频或Audio.time更改时),此行应自动更新 我的尝试: JupyterLab中的Python 3.7 将numpy作为np导入 将全息视图导入为hv#交互式绘图 高压笔记本_扩展(“bokeh”) 作为pn导入面板 请注意:扩展部分() 从holoviews.streams导入流,参数 #创造声音 sps=每秒44100个样本 持续时间=10#持续时间(秒) 调制器_
pn.pane.Audio.time
值更改时(当播放音频或Audio.time
更改时),此行应自动更新
我的尝试:
JupyterLab中的Python 3.7
将numpy作为np导入
将全息视图导入为hv#交互式绘图
高压笔记本_扩展(“bokeh”)
作为pn导入面板
请注意:扩展部分()
从holoviews.streams导入流,参数
#创造声音
sps=每秒44100个样本
持续时间=10#持续时间(秒)
调制器_频率=2.0
载波频率=120.0
调制指数=2.0
时间=np.arange(sps*持续时间)/sps
调制器=np.sin(2.0*np.pi*调制器频率*时间)*调制指数
载波=np.sin(2.0*np.pi*载波频率*时间)
波形=np.sin(2.*np.pi*(载波频率*时间+调制器))
波形=波形*0.3
波形int=np.int16(波形int*32767)
#PyViz面板的音频小部件,用于播放声音
音频=pn.pane.audio(波形整数,采样率=sps)
#生成的绘图数据
x=np.arange(11.0)
y=np.arange(11.0,0.0,-1)/10
y[0::2]*=-1#交替正负
#全息线图
线图=高压曲线((x,y)).opts(宽度=500)
#应记录音频、时间;不起作用
Time=Stream.define('Time',t=param.Number(默认值=0.0,doc='A Time参数'))
时间=时间(t=音频时间)
#时间值更改时绘制线的回调
def交互式_播放(t):
返回hv.VLine(t.opts)(颜色为绿色)
#当前音频时间线的动态地图绘制
dmap\u time=hv.DynamicMap(交互式播放,流=[time])
#显示音频窗格
显示器(音频)
#将绘图与音频流相结合。时间
测线图*dmap\U时间
为什么这不起作用?
由于时间被设置为参数号()
,我希望它能跟踪音频.time
。因此,在播放音频时,应不断调用对interactive_play()
的回调,从而导致一条线在绘图上移动。
这不会发生,并且该行仅保持默认值0.0(或任何其他值audio.time
在代码执行时的值)
如何更新VLine
以保持跟踪音频.time
绿线应与音频窗格的时间相匹配
由于time被设置为param.Number(),我希望它能够跟踪audio.time
在您的示例中,您没有以任何方式将Panel Audio对象链接到流。当你这样做时,你所做的一切:
time = Time(t=audio.time)
将时间流的初始值设置为音频窗格的当前值audio.time
不是对参数的引用,它只是该参数的当前值
HoloViews DynamicMaps支持侦听其他对象上的参数已有相当一段时间了。有两种主要的方法来实现这一点,或者通过这样做:
@pn.depends(t=audio.param.time)
def interactive_play(t):
return hv.VLine(t).opts(color='green')
dmap_time = hv.DynamicMap(interactive_play)
在这里,您将使用对audio.time
参数的依赖性来装饰interactive_play
函数,因此每当它更改DynamicMap时,就会更新它。更明确的方法是这样做,以及内部实际发生的情况是:
from holoviews.streams import Params
def interactive_play(t):
return hv.VLine(t).opts(color='green')
stream = Params(parameters=[audio.param.time], rename={'time': 't'})
dmap_time = hv.DynamicMap(interactive_play, streams=[stream])
如果您需要使用新文件更新音频窗格,我强烈建议您使用回调,而不是使用交互或反应式API不断创建新的音频窗格。这样,您也不必将流更新为不断变化的音频窗格。它可以工作,谢谢!更新现有的音频窗格确实听起来更好。如何更新此窗格中的音频?类似于audio.object=waveform\u int)
(如果更改某些值以生成waveform\u int
)的内容不起作用。