2
2
from __future__ import unicode_literals
3
3
4
4
import argparse
5
+ import errno
5
6
import ffmpeg
6
7
import logging
8
+ import os
7
9
import re
8
10
import subprocess
11
+ import sys
9
12
10
-
11
- logging .basicConfig (level = logging .INFO )
13
+ logging .basicConfig (level = logging .INFO , format = '%(message)s' )
12
14
logger = logging .getLogger (__file__ )
13
15
logger .setLevel (logging .INFO )
14
16
17
19
18
20
parser = argparse .ArgumentParser (description = 'Split media into separate chunks wherever silence occurs' )
19
21
parser .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`)' )
21
23
parser .add_argument ('--silence-threshold' , default = DEFAULT_THRESHOLD , type = int , help = 'Silence threshold (in dB)' )
22
24
parser .add_argument ('--silence-duration' , default = DEFAULT_DURATION , type = float , help = 'Silence duration' )
23
25
parser .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
47
49
)
48
50
p = subprocess .Popen (['ffmpeg' ] + args , stderr = subprocess .PIPE )
49
51
output = p .communicate ()[1 ].decode ('utf-8' )
52
+ if p .returncode != 0 :
53
+ sys .stderr .write (output )
54
+ sys .exit (1 )
50
55
lines = output .splitlines ()
51
56
52
57
# 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
80
85
return list (zip (chunk_starts , chunk_ends ))
81
86
82
87
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
+
83
96
def split_audio (
84
97
in_filename ,
85
98
out_pattern ,
@@ -89,9 +102,12 @@ def split_audio(
89
102
end_time = None ,
90
103
):
91
104
chunk_times = get_chunk_times (in_filename , silence_threshold , silence_duration , start_time , end_time )
105
+
92
106
for i , (start_time , end_time ) in enumerate (chunk_times ):
93
107
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
+
95
111
logger .info ('{}: start={:.02f}, end={:.02f}, duration={:.02f}' .format (out_filename , start_time , end_time ,
96
112
time ))
97
113
subprocess .Popen (
0 commit comments