首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >同步HoloViews VLine与PyViz Panel audio.time

同步HoloViews VLine与PyViz Panel audio.time
EN

Stack Overflow用户
提问于 2019-11-27 05:38:53
回答 1查看 391关注 0票数 2

我想在一个HoloViews图中可视化当前音频在图形中的位置。当PyViz的pn.pane.Audio.time值被更改时(当播放音频或更改Audio.time时),这一行应该自动更新。

我的尝试:

代码语言:javascript
运行
复制
# 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)
代码语言:javascript
运行
复制
# 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

绿线应与音频窗格的时间相匹配

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-28 18:17:04

由于

被设置为param.Number(),所以我希望它能够跟踪audio.time。

在您的示例中,您没有以任何方式将Panel Audio对象链接到流。当你这样做的时候你所做的一切

代码语言:javascript
运行
复制
time = Time(t=audio.time)

Time流的初始值设置为音频窗格的当前值。audio.time不是对参数的引用,它只是该参数的当前值。

HoloViews DynamicMaps支持其他对象的参数侦听功能已经有很长一段时间了。要做到这一点,主要有两种方法,一种是这样做:

代码语言:javascript
运行
复制
@pn.depends(t=audio.param.time)
def interactive_play(t):
    return hv.VLine(t).opts(color='green')

dmap_time = hv.DynamicMap(interactive_play)

在这里,您将interactive_play函数修饰为依赖于audio.time参数,因此每当它更改时,DynamicMap就会被更新。这样做的更明确的方式以及内部实际发生的情况是:

代码语言:javascript
运行
复制
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不断地创建新的音频窗格。这样,您也不必处理将流更新到不断更改的音频窗格的问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59063698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档