Chris@56
|
1 '''A high-level interface to the vampyhost extension module, for quickly and easily running Vamp audio analysis plugins on audio files and buffers.'''
|
Chris@56
|
2
|
Chris@56
|
3 import vampyhost
|
Chris@75
|
4 import frames
|
Chris@75
|
5 import load
|
Chris@68
|
6
|
Chris@89
|
7
|
Chris@89
|
8 def process_frames_with_plugin(ff, sample_rate, step_size, plugin, outputs):
|
Chris@89
|
9
|
Chris@89
|
10 out_indices = dict([(id, plugin.get_output(id)["output_index"]) for id in outputs])
|
Chris@89
|
11 plugin.reset()
|
Chris@89
|
12 fi = 0
|
Chris@89
|
13
|
Chris@89
|
14 for f in ff:
|
Chris@89
|
15 timestamp = vampyhost.frame_to_realtime(fi, sample_rate)
|
Chris@89
|
16 results = plugin.process_block(f, timestamp)
|
Chris@89
|
17 # results is a dict mapping output number -> list of feature dicts
|
Chris@89
|
18 for o in outputs:
|
Chris@89
|
19 ix = out_indices[o]
|
Chris@89
|
20 if ix in results:
|
Chris@89
|
21 for r in results[ix]:
|
Chris@89
|
22 yield { o: r }
|
Chris@89
|
23 fi = fi + step_size
|
Chris@89
|
24
|
Chris@89
|
25 results = plugin.get_remaining_features()
|
Chris@89
|
26 for o in outputs:
|
Chris@89
|
27 ix = out_indices[o]
|
Chris@89
|
28 if ix in results:
|
Chris@89
|
29 for r in results[ix]:
|
Chris@89
|
30 yield { o: r }
|
Chris@89
|
31
|
Chris@89
|
32
|
Chris@89
|
33 def process(data, sample_rate, key, output = "", parameters = {}):
|
Chris@89
|
34 #!!! docstring
|
Chris@89
|
35
|
Chris@89
|
36 plugin, step_size, block_size = load.load_and_configure(data, sample_rate, key, parameters)
|
Chris@89
|
37
|
Chris@89
|
38 if output == "":
|
Chris@89
|
39 output = plugin.get_output(0)["identifier"]
|
Chris@89
|
40
|
Chris@89
|
41 ff = frames.frames_from_array(data, step_size, block_size)
|
Chris@89
|
42
|
Chris@89
|
43 for r in process_frames_with_plugin(ff, sample_rate, step_size, plugin, [output]):
|
Chris@89
|
44 yield r[output]
|
Chris@76
|
45
|
Chris@89
|
46 plugin.unload()
|
Chris@89
|
47
|
Chris@76
|
48
|
Chris@84
|
49 def process_multiple_outputs(data, sample_rate, key, outputs, parameters = {}):
|
Chris@68
|
50 #!!! docstring
|
Chris@68
|
51
|
Chris@89
|
52 plugin, step_size, block_size = load.load_and_configure(data, sample_rate, key, parameters)
|
Chris@64
|
53
|
Chris@84
|
54 ff = frames.frames_from_array(data, step_size, block_size)
|
Chris@64
|
55
|
Chris@89
|
56 for r in process_frames_with_plugin(ff, sample_rate, step_size, plugin, outputs):
|
Chris@89
|
57 yield r
|
Chris@61
|
58
|
Chris@89
|
59 plugin.unload()
|
Chris@66
|
60
|