Module audio_cat_normalize
[frames] | no frames]

Source Code for Module audio_cat_normalize

 1  #!/usr/bin/env python 
 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                  # Normalize amplitudes: 
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])      # Resample 
74                  elif q.d.shape[1] == 1:         # Mono->Stereo 
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:            # Stereo -> Mono 
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