22from  __future__ import  unicode_literals 
33
44import  argparse 
5+ import  errno 
56import  ffmpeg 
67import  logging 
8+ import  os 
79import  re 
810import  subprocess 
11+ import  sys 
912
10- 
11- logging .basicConfig (level = logging .INFO )
13+ logging .basicConfig (level = logging .INFO , format = '%(message)s' )
1214logger  =  logging .getLogger (__file__ )
1315logger .setLevel (logging .INFO )
1416
1719
1820parser  =  argparse .ArgumentParser (description = 'Split media into separate chunks wherever silence occurs' )
1921parser .add_argument ('in_filename' , help = 'Input filename (`-` for stdin)' )
20- parser .add_argument ('out_pattern' , help = 'Output filename pattern (e.g. `out/chunk_%% 04d.wav`)' )
22+ parser .add_argument ('out_pattern' , help = 'Output filename pattern (e.g. `out/chunk_{: 04d} .wav`)' )
2123parser .add_argument ('--silence-threshold' , default = DEFAULT_THRESHOLD , type = int , help = 'Silence threshold (in dB)' )
2224parser .add_argument ('--silence-duration' , default = DEFAULT_DURATION , type = float , help = 'Silence duration' )
2325parser .add_argument ('--start-time' , type = float , help = 'Start time (seconds)' )
@@ -47,6 +49,9 @@ def get_chunk_times(in_filename, silence_threshold, silence_duration, start_time
4749    )
4850    p  =  subprocess .Popen (['ffmpeg' ] +  args , stderr = subprocess .PIPE )
4951    output  =  p .communicate ()[1 ].decode ('utf-8' )
52+     if  p .returncode  !=  0 :
53+         sys .stderr .write (output )
54+         sys .exit (1 )
5055    lines  =  output .splitlines ()
5156
5257    # Chunks start when silence ends, and chunks end when silence starts. 
@@ -80,6 +85,14 @@ def get_chunk_times(in_filename, silence_threshold, silence_duration, start_time
8085    return  list (zip (chunk_starts , chunk_ends ))
8186
8287
88+ def  _makedirs (path ):
89+     """Python2-compatible version of ``os.makedirs(path, exist_ok=True)``.""" 
90+     try :
91+         os .makedirs (path )
92+     except  OSError  as  exc :
93+         if  exc .errno  !=  errno .EEXIST  or  not  os .path .isdir (path ):
94+             raise 
95+ 
8396def  split_audio (
8497    in_filename ,
8598    out_pattern ,
@@ -89,9 +102,12 @@ def split_audio(
89102    end_time = None ,
90103):
91104    chunk_times  =  get_chunk_times (in_filename , silence_threshold , silence_duration , start_time , end_time )
105+ 
92106    for  i , (start_time , end_time ) in  enumerate (chunk_times ):
93107        time  =  end_time  -  start_time 
94-         out_filename  =  out_pattern  %  i 
108+         out_filename  =  out_pattern .format (i , i = i )
109+         _makedirs (os .path .dirname (out_filename ))
110+ 
95111        logger .info ('{}: start={:.02f}, end={:.02f}, duration={:.02f}' .format (out_filename , start_time , end_time ,
96112            time ))
97113        subprocess .Popen (
0 commit comments