1
2
3
4 from gmisclib import erb_scale
5 from gmisclib import Num
6 from gpk_voicing import percep_spec
7 from gpk_voicing import fv_misc as M
8 SillyWidthException = M.SillyWidthException
9
10
11 -def feature_vec(data, dt, DT,
12 LF=1.0, Nsv=M.NSV, ELF=1.0,
13 do_voicing=1, do_dissonance=True,
14 PlompBouman=False, do_pdur=True):
15 FORMANT_LOW = erb_scale.f_to_erb(200.0)
16 FORMANT_HIGH = erb_scale.f_to_erb(4000.0)
17 assert DT > 0.0 and float(DT)>0.0
18 assert LF==1.0
19 assert ELF==1.0
20 assert not PlompBouman
21 bmin = erb_scale.f_to_erb(80.0)
22 bmax = erb_scale.f_to_erb(6000.0)
23 ectrs, neural, t0 = percep_spec.perceptual_spec(data, dt, DT,
24 bmin, bmax, M.DB,
25 do_mod=do_voicing,
26 do_dissonance=do_dissonance,
27 PlompBouman=PlompBouman
28 )
29
30 band_indices = [i for (i,ec) in enumerate(ectrs) if ec['type']=='band']
31 neural_b = neural.take(band_indices, axis=0)
32 assert neural.shape[1]==neural.shape[1]
33
34 neural_now = Num.average(neural_b, axis=0)
35 assert neural_now.shape[0] == neural.shape[1]
36 neural_avg = Num.sum(neural_now**2)/Num.sum(neural_now)
37
38 Num.divide(neural, neural_avg, neural)
39
40 Num.divide(neural_now, neural_avg, neural_now)
41
42
43 assert neural_b.shape[0] <= neural.shape[1]
44 for (i,e) in enumerate(ectrs):
45 if e['type'] == 'haspitch':
46 Num.divide(neural[i,:], neural_avg, neural[i,:])
47 if e['type'] == 'dissonance':
48 Num.divide(neural[i,:], neural_avg, neural[i,:])
49
50
51 o = []
52 descr = []
53 wset = set()
54 for vl in [0.06]:
55
56 w = int(round(vl*LF/DT))
57 if not w in wset:
58 tmpo, tmpd = M.vowel(w, ectrs, neural, neural_now, Nsv,
59 formant_low=FORMANT_LOW,
60 formant_high=FORMANT_HIGH
61 )
62 o.extend(tmpo)
63 descr.extend(tmpd)
64 wset.add(w)
65 assert len(descr)==len(o), "Descriptor mismatch"
66
67 wset = set()
68 for fl in [0.02]:
69 w = int(round(fl*ELF/DT))
70 if not w in wset:
71 tmpo, tmpd = M.fricative(w, ectrs, neural, neural_now, Nsv)
72 o.extend(tmpo)
73 descr.extend(tmpd)
74 wset.add(w)
75 assert len(descr)==len(o), "Descriptor mismatch"
76
77 wset = set()
78 for fel in [0.04]:
79 w = int(round(fel*ELF/DT))
80 if not w in wset:
81 tmpo, tmpd = M.fricative_edge(w, ectrs, neural, neural_now, Nsv,
82 do_abs=False
83 )
84 o.extend(tmpo)
85 descr.extend(tmpd)
86 wset.add(w)
87 assert len(descr)==len(o), "Descriptor mismatch"
88
89 wset = set()
90 for sel in [0.03]:
91 w = int(round(sel*LF/DT))
92 if not w in wset:
93 tmpo, tmpd = M.spectral_entropy(w, ectrs, neural, neural_now, Nsv)
94 o.extend(tmpo)
95 descr.extend(tmpd)
96 wset.add(w)
97 assert len(descr)==len(o), "Descriptor mismatch"
98 assert len(descr)==len(o), "Descriptor mismatch"
99 wset = set()
100 for sel in [0.07]:
101 w = int(round(sel*LF/DT))
102 if not w in wset:
103 tmpo, tmpd = M.space_time_entropy(w, ectrs, neural, neural_now, Nsv)
104 o.extend(tmpo)
105 descr.extend(tmpd)
106 wset.add(w)
107 assert len(descr)==len(o), "Descriptor mismatch"
108 assert len(descr)==len(o), "Descriptor mismatch"
109
110
111 if do_voicing:
112 wset = set()
113 for hpl in [0.02]:
114 w = int(round(hpl*LF/DT))
115 if not w in wset:
116 tmpo, tmpd = M.haspitch(w, ectrs, neural, neural_now, Nsv)
117 o.extend(tmpo)
118 descr.extend(tmpd)
119 wset.add(w)
120 assert len(descr)==len(o), "Descriptor mismatch"
121
122 if do_dissonance:
123 wset = set()
124 for dsl in [0.06]:
125 w = int(round(dsl*LF/DT))
126 if not w in wset:
127 tmpo, tmpd = M.dissonance(w, ectrs, neural, neural_now, Nsv)
128 o.extend(tmpo)
129 descr.extend(tmpd)
130 wset.add(w)
131
132 assert len(descr)==len(o), "Descriptor mismatch"
133 if do_pdur:
134 tmpo, tmpd = M.pdur(ectrs, neural, neural_now, DT)
135 o.extend(tmpo)
136 descr.extend(tmpd)
137
138 assert len(descr)==len(o), "Descriptor mismatch"
139 N = neural[0].shape[0]
140 for (i, (tmp, dsc)) in enumerate(zip(o, descr)):
141 assert tmp.shape == (N,), "Wrong size: %d, %s = %d vs. %d" % (i, str(dsc), tmp.shape[0], N)
142
143 return (o, descr, DT, t0)
144