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 load
|
Chris@88
|
5 import process
|
Chris@89
|
6 import frames
|
Chris@89
|
7
|
Chris@72
|
8
|
Chris@85
|
9 def timestamp_features(sample_rate, step_size, output_desc, features):
|
Chris@85
|
10 n = -1
|
Chris@85
|
11 if output_desc["sample_type"] == vampyhost.ONE_SAMPLE_PER_STEP:
|
Chris@85
|
12 for f in features:
|
Chris@85
|
13 n = n + 1
|
Chris@85
|
14 t = vampyhost.frame_to_realtime(n * step_size, sample_rate)
|
Chris@85
|
15 f["timestamp"] = t
|
Chris@85
|
16 yield f
|
Chris@85
|
17 elif output_desc["sample_type"] == vampyhost.FIXED_SAMPLE_RATE:
|
Chris@85
|
18 output_rate = output_desc["sample_rate"]
|
Chris@85
|
19 for f in features:
|
Chris@85
|
20 if "has_timestamp" in f:
|
Chris@85
|
21 n = int(f["timestamp"].to_float() * output_rate + 0.5)
|
Chris@85
|
22 else:
|
Chris@85
|
23 n = n + 1
|
Chris@85
|
24 f["timestamp"] = vampyhost.RealTime('seconds', float(n) / output_rate)
|
Chris@85
|
25 yield f
|
Chris@85
|
26 else:
|
Chris@85
|
27 for f in features:
|
Chris@85
|
28 yield f
|
Chris@72
|
29
|
Chris@74
|
30
|
Chris@89
|
31 def process_and_fill_timestamps(data, sample_rate, key, output, parameters = {}):
|
Chris@88
|
32
|
Chris@89
|
33 plugin, step_size, block_size = load.load_and_configure(data, sample_rate, key, parameters)
|
Chris@71
|
34
|
Chris@88
|
35 if output == "":
|
Chris@89
|
36 output_desc = plugin.get_output(0)
|
Chris@89
|
37 output = output_desc["identifier"]
|
Chris@88
|
38 else:
|
Chris@89
|
39 output_desc = plugin.get_output(output)
|
Chris@71
|
40
|
Chris@89
|
41 ff = frames.frames_from_array(data, step_size, block_size)
|
Chris@89
|
42
|
Chris@89
|
43 results = process.process_frames_with_plugin(ff, sample_rate, step_size, plugin, [output])
|
Chris@89
|
44
|
Chris@89
|
45 selected = [ r[output] for r in results ]
|
Chris@89
|
46
|
Chris@89
|
47 stamped = timestamp_features(sample_rate, step_size, output_desc, selected)
|
Chris@89
|
48
|
Chris@89
|
49 for s in stamped:
|
Chris@89
|
50 yield s
|
Chris@89
|
51
|
Chris@89
|
52 plugin.unload()
|
Chris@88
|
53
|
Chris@71
|
54
|
Chris@89
|
55 def collect(data, sample_rate, key, output, parameters = {}):
|
Chris@89
|
56 return process_and_fill_timestamps(data, sample_rate, key, output, parameters)
|