Module audio_cat_normalize
|
|
1
2
3 import os
4 import sys
5 import math
6 import gpkimgclass
7 from gmisclib import Num
8 from gmisclib import wavio
9 from gmisclib import gpkmisc
10 from gmisclib import die
11 from gpk_voicing import emphasis
12
13 DT = 0.03
14 R = 1
15 D = 1
16
17 if __name__ == '__main__':
18 import sys
19 arglist = sys.argv[1:]
20 outfile = 'foo.wav'
21 while arglist and arglist[0].startswith('-'):
22 arg = arglist.pop(0)
23 if arg == '--':
24 break
25 elif arg == '-stereo':
26 D = 2
27 elif arg == '-mono':
28 D = 1
29 elif arg == '-resample':
30 R = int(arglist.pop(0))
31 elif arg == '-o':
32 outfile = arglist.pop(0)
33 else:
34 die.die('Unrecognized flag: %s' % arg)
35
36 normfacs = []
37 data = []
38 for f in arglist:
39 gotit = False
40 try:
41 q = gpkimgclass.read(f)
42 gotit = True
43 except gpkimgclass.CannotReadDataFile, x:
44 die.info('File %s unreadable: %s' % (f, str(x)))
45 if not gotit:
46 q = wavio.read(f)
47
48 n = 0
49 s = 0.0
50 for c in range(q.d.shape[1]):
51 tmp = emphasis.simple_emphasis(q.column(c), q.dt(), DT)
52 tt = Num.sort(Num.ravel(tmp))
53 assert len(tt.shape) == 1
54 if tt.shape[0] > 0:
55 s += tt[int(tt.shape[0]*0.9)]
56 n += 1
57 assert n > 0
58
59 print "Loudness=", s/n
60 normfac = math.pow(n/s, 1.5)
61 q.d = q.d * normfac
62 data.append(q)
63 normfacs.append(normfac)
64
65 normfac = gpkmisc.median(normfacs)
66 for q in data:
67 q.d /= normfac
68
69 o = []
70 for q in data:
71 assert abs(math.log(q.dt()/data[0].dt())) < 0.0001
72 if q.d.shape[1] == D:
73 o.append(q.d[::R])
74 elif q.d.shape[1] == 1:
75 tmp = Num.transpose(Num.array([q.d[::R,0]]*D))
76 print "ts=", tmp.shape, "qds=", q.d.shape
77 assert tmp.shape[0] == (q.d.shape[0]+R-1)/R
78 assert tmp.shape[1] == D
79 o.append(tmp)
80 elif D == 1:
81 die.die('Unimplemented')
82 da = Num.concatenate(o, axis=0)
83
84 header = {'CDELT2': R*data[0].dt(), 'CRPIX2':0, 'CRVAL2':0.0}
85 if outfile.endswith('.wav'):
86 unwritten = True
87 while unwritten:
88 try:
89 wavio.write(gpkimgclass.gpk_img(header, da), outfile)
90 unwritten = False
91 except ValueError, x:
92 assert 'overflow' in str(x)
93 Num.divide(da, 1.5, da)
94 die.warn("Overflow on writing to .wav file. Scaling down by factor of 1.5.")
95 else:
96 gpkimgclass.gpk_img(header, da).write(outfile)
97