Package lib :: Module fv200812align
[frames] | no frames]

Source Code for Module lib.fv200812align

  1  #!/usr/bin/env python 
  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) # Average over frequency. 35 assert neural_now.shape[0] == neural.shape[1] 36 neural_avg = Num.sum(neural_now**2)/Num.sum(neural_now) # Average over time. 37 # neural_avg is a scalar, grand average. 38 Num.divide(neural, neural_avg, neural) 39 # Now, we've normalized by an over-all average loudness. 40 Num.divide(neural_now, neural_avg, neural_now) 41 # Now, we've normalized by an over-all average loudness. 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 # print '# neural_avg=', neural_avg 51 o = [] 52 descr = [] 53 wset = set() 54 for vl in [0.06]: 55 # print 'vl=', vl, type(vl), 'LF=', LF, type(LF), 'DT=', DT, type(DT) 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