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@93
|
8 import numpy as np
|
Chris@93
|
9
|
Chris@94
|
10 def get_feature_step_time(sample_rate, step_size, output_desc):
|
Chris@94
|
11 if output_desc["sample_type"] == vampyhost.ONE_SAMPLE_PER_STEP:
|
Chris@94
|
12 return vampyhost.frame_to_realtime(step_size, sample_rate)
|
Chris@94
|
13 elif output_desc["sample_type"] == vampyhost.FIXED_SAMPLE_RATE:
|
Chris@94
|
14 return vampyhost.RealTime('seconds', 1.0 / output_desc["sample_rate"])
|
Chris@94
|
15 else:
|
Chris@94
|
16 return 1
|
Chris@72
|
17
|
Chris@85
|
18 def timestamp_features(sample_rate, step_size, output_desc, features):
|
Chris@85
|
19 n = -1
|
Chris@85
|
20 if output_desc["sample_type"] == vampyhost.ONE_SAMPLE_PER_STEP:
|
Chris@85
|
21 for f in features:
|
Chris@85
|
22 n = n + 1
|
Chris@85
|
23 t = vampyhost.frame_to_realtime(n * step_size, sample_rate)
|
Chris@85
|
24 f["timestamp"] = t
|
Chris@85
|
25 yield f
|
Chris@85
|
26 elif output_desc["sample_type"] == vampyhost.FIXED_SAMPLE_RATE:
|
Chris@85
|
27 output_rate = output_desc["sample_rate"]
|
Chris@85
|
28 for f in features:
|
Chris@85
|
29 if "has_timestamp" in f:
|
Chris@85
|
30 n = int(f["timestamp"].to_float() * output_rate + 0.5)
|
Chris@85
|
31 else:
|
Chris@85
|
32 n = n + 1
|
Chris@85
|
33 f["timestamp"] = vampyhost.RealTime('seconds', float(n) / output_rate)
|
Chris@85
|
34 yield f
|
Chris@85
|
35 else:
|
Chris@85
|
36 for f in features:
|
Chris@85
|
37 yield f
|
Chris@72
|
38
|
Chris@93
|
39 def fill_timestamps(results, sample_rate, step_size, output_desc):
|
Chris@93
|
40
|
Chris@93
|
41 output = output_desc["identifier"]
|
Chris@93
|
42
|
Chris@93
|
43 selected = [ r[output] for r in results ]
|
Chris@93
|
44
|
Chris@93
|
45 stamped = timestamp_features(sample_rate, step_size, output_desc, selected)
|
Chris@93
|
46
|
Chris@93
|
47 for s in stamped:
|
Chris@93
|
48 yield s
|
Chris@93
|
49
|
Chris@93
|
50 def deduce_shape(output_desc):
|
Chris@93
|
51 if output_desc["has_duration"]:
|
Chris@93
|
52 return "individual"
|
Chris@93
|
53 if output_desc["sample_type"] == vampyhost.VARIABLE_SAMPLE_RATE:
|
Chris@93
|
54 return "individual"
|
Chris@93
|
55 if not output_desc["has_fixed_bin_count"]:
|
Chris@93
|
56 return "individual"
|
Chris@93
|
57 if output_desc["bin_count"] == 0:
|
Chris@93
|
58 return "individual"
|
Chris@94
|
59 if output_desc["bin_count"] == 1:
|
Chris@94
|
60 return "vector"
|
Chris@94
|
61 return "matrix"
|
Chris@93
|
62
|
Chris@93
|
63 def process_and_reshape(data, sample_rate, key, output, parameters = {}):
|
Chris@88
|
64
|
Chris@89
|
65 plugin, step_size, block_size = load.load_and_configure(data, sample_rate, key, parameters)
|
Chris@71
|
66
|
Chris@88
|
67 if output == "":
|
Chris@89
|
68 output_desc = plugin.get_output(0)
|
Chris@89
|
69 output = output_desc["identifier"]
|
Chris@88
|
70 else:
|
Chris@89
|
71 output_desc = plugin.get_output(output)
|
Chris@71
|
72
|
Chris@89
|
73 ff = frames.frames_from_array(data, step_size, block_size)
|
Chris@89
|
74
|
Chris@89
|
75 results = process.process_frames_with_plugin(ff, sample_rate, step_size, plugin, [output])
|
Chris@89
|
76
|
Chris@93
|
77 shape = deduce_shape(output_desc)
|
Chris@94
|
78 out_step = get_feature_step_time(sample_rate, step_size, output_desc)
|
Chris@89
|
79
|
Chris@93
|
80 if shape == "vector":
|
Chris@94
|
81 rv = ( out_step,
|
Chris@94
|
82 np.array([r[output]["values"][0] for r in results]) )
|
Chris@93
|
83 elif shape == "matrix":
|
Chris@94
|
84 rv = ( out_step,
|
Chris@94
|
85 np.array(
|
Chris@94
|
86 [[r[output]["values"][i] for r in results]
|
Chris@94
|
87 for i in range(0, output_desc["bin_count"])]) )
|
Chris@93
|
88 else:
|
Chris@93
|
89 rv = list(fill_timestamps(results, sample_rate, step_size, output_desc))
|
Chris@89
|
90
|
Chris@89
|
91 plugin.unload()
|
Chris@93
|
92 return rv
|
Chris@93
|
93
|
Chris@71
|
94
|
Chris@89
|
95 def collect(data, sample_rate, key, output, parameters = {}):
|
Chris@93
|
96 return process_and_reshape(data, sample_rate, key, output, parameters)
|