我正在尝试绘制声音流。我已经将变量total_data定义为固定长度的数组,然后使用索引在每个循环中对其进行更新。我曾在循环中尝试过show(p)
,但这一直在浏览器中打开新标签页。我正在尝试更新每个循环的图,而不是创建一个新的图。
任何建议都将受到高度赞赏,任何想法都将以更有效的方式做到这一点。
这是我的代码的副本:
#imports
import pyaudio
import numpy as np
from bokeh.plotting import figure, output_file, show
#defining required parameters
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 5
MAX_PLOT_SIZE = CHUNK * 6
WAVE_OUTPUT_FILENAME = "VR_11.wav"
#create a variable of the class pyaudio
audio = pyaudio.PyAudio()
#allow user to choose which input to use
chosen_index=input('Insert index of required device:')
print('')
chosen_device=audio.get_device_info_by_index(int(chosen_index))
print('Chosen device is:', chosen_device)
# start Recording
stream = audio.open(format=FORMAT, channels=CHANNELS,
rate=RATE, input=True,
frames_per_buffer=CHUNK,input_device_index=int(chosen_index))
print("recording...")
#create fixed length array
total_data=np.zeros(MAX_PLOT_SIZE,dtype=np.int16)
output_file("VR_11.html")
x=np.linspace(0,MAX_PLOT_SIZE,MAX_PLOT_SIZE)
# create a new plot with a title and axis labels
p = figure(title="Live Voltage Plot", x_axis_label='', y_axis_label='Voltage
Amplitude')
while True:
data = stream.read(CHUNK)
data_sample = np.frombuffer(data, dtype=np.int16)
total_data[:(-CHUNK)] = total_data[CHUNK:]
total_data[-CHUNK:] = data_sample
p.line(x, total_data, legend="Sound Live Plot",line_color="navy",
line_width=2)
#p.show()- hashed to stop infinite plots from showing up
# stop Recording
stream.stop_stream()
stream.close()
audio.terminate()
答案 0 :(得分:0)
show
将始终打开新的标签页或浏览器窗口,这是其明确的目的。如果要保持单个页面的打开和更新,基本上只有几个选项:
您可以创建和部署Bokeh Server application。您正在使用stream
的事实已经指出了这一点-stream
仅在Bokeh服务器应用程序的上下文中有效。您可以在此处查看示例流应用程序:Streaming OHLC demo。您可以通过执行
bokeh serve ohlc
您可以选择添加--show
参数,以在服务器启动时直接向应用程序打开浏览器窗口。重要说明:在这种情况下,您 不使用无限循环 。如该示例所示,您将需要设置一个定期回调。
如果要通过定期轮询的REST API获得要用于更新绘图的数据,则可以使用AjaxDataSource
。这将允许您创建一个连续更新的独立HTML文档(即不是Bokeh服务器应用程序)。您可以在此处查看使用它的示例:ajax_source.py
。您可以将其作为标准python脚本运行以生成HTML文件:
python ajax_source.py
在这种情况下,Python中没有无限循环。在浏览器中查看HTML文件后,其中的JavaScript代码将开始以您配置的间隔从您配置的REST端点中提取数据。
如果要像上面一样在自己的进程中运行无限循环,可以调用save
而不是show
来将HTML文件保存到磁盘。或者,您可以使用bokeh.embed
中的嵌入功能之一来生成嵌入输出。无论哪种方式,您都必须想出其他方法来使页面定期刷新(上面介绍了Bokeh可以使内容自动更新的方法)。