Finalize split_silence

This commit is contained in:
Karl Kroening 2018-01-07 03:43:20 -08:00
parent 4311e33859
commit ad58a38d59
2 changed files with 21 additions and 4 deletions

View File

@ -0,0 +1 @@
ffmpeg

View File

@ -2,13 +2,15 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import argparse import argparse
import errno
import ffmpeg import ffmpeg
import logging import logging
import os
import re import re
import subprocess import subprocess
import sys
logging.basicConfig(level=logging.INFO, format='%(message)s')
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__file__) logger = logging.getLogger(__file__)
logger.setLevel(logging.INFO) logger.setLevel(logging.INFO)
@ -17,7 +19,7 @@ DEFAULT_THRESHOLD = -60
parser = argparse.ArgumentParser(description='Split media into separate chunks wherever silence occurs') parser = argparse.ArgumentParser(description='Split media into separate chunks wherever silence occurs')
parser.add_argument('in_filename', help='Input filename (`-` for stdin)') parser.add_argument('in_filename', help='Input filename (`-` for stdin)')
parser.add_argument('out_pattern', help='Output filename pattern (e.g. `out/chunk_%%04d.wav`)') parser.add_argument('out_pattern', help='Output filename pattern (e.g. `out/chunk_{:04d}.wav`)')
parser.add_argument('--silence-threshold', default=DEFAULT_THRESHOLD, type=int, help='Silence threshold (in dB)') parser.add_argument('--silence-threshold', default=DEFAULT_THRESHOLD, type=int, help='Silence threshold (in dB)')
parser.add_argument('--silence-duration', default=DEFAULT_DURATION, type=float, help='Silence duration') parser.add_argument('--silence-duration', default=DEFAULT_DURATION, type=float, help='Silence duration')
parser.add_argument('--start-time', type=float, help='Start time (seconds)') 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
) )
p = subprocess.Popen(['ffmpeg'] + args, stderr=subprocess.PIPE) p = subprocess.Popen(['ffmpeg'] + args, stderr=subprocess.PIPE)
output = p.communicate()[1].decode('utf-8') output = p.communicate()[1].decode('utf-8')
if p.returncode != 0:
sys.stderr.write(output)
sys.exit(1)
lines = output.splitlines() lines = output.splitlines()
# Chunks start when silence ends, and chunks end when silence starts. # 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
return list(zip(chunk_starts, chunk_ends)) return list(zip(chunk_starts, chunk_ends))
def _makedirs(path):
"""Python2-compatible version of ``os.makedirs(path, exist_ok=True)``."""
try:
os.makedirs(path)
except OSError as exc:
if exc.errno != errno.EEXIST or not os.path.isdir(path):
raise
def split_audio( def split_audio(
in_filename, in_filename,
out_pattern, out_pattern,
@ -89,9 +102,12 @@ def split_audio(
end_time=None, end_time=None,
): ):
chunk_times = get_chunk_times(in_filename, silence_threshold, silence_duration, start_time, end_time) chunk_times = get_chunk_times(in_filename, silence_threshold, silence_duration, start_time, end_time)
for i, (start_time, end_time) in enumerate(chunk_times): for i, (start_time, end_time) in enumerate(chunk_times):
time = end_time - start_time time = end_time - start_time
out_filename = out_pattern % i out_filename = out_pattern.format(i, i=i)
_makedirs(os.path.dirname(out_filename))
logger.info('{}: start={:.02f}, end={:.02f}, duration={:.02f}'.format(out_filename, start_time, end_time, logger.info('{}: start={:.02f}, end={:.02f}, duration={:.02f}'.format(out_filename, start_time, end_time,
time)) time))
subprocess.Popen( subprocess.Popen(