sox 또는 ffmpeg를 사용하여 텍스트 파일의 타임스탬프를 기반으로 오디오를 세그먼트로 분할

sox 또는 ffmpeg를 사용하여 텍스트 파일의 타임스탬프를 기반으로 오디오를 세그먼트로 분할

다음 링크를 확인했습니다.시작 및 중지 시간을 사용하여 오디오 파일 다듬기

그러나 이것은 내 질문에 완전히 대답하지 않습니다. 내 문제는 abc.mp3다음과 같은 오디오 파일이 있습니다 abc.wav. 시작 및 종료 타임스탬프가 포함된 텍스트 파일도 있습니다.

0.0 1.0 silence  
1.0 5.0 music  
6.0 8.0 speech    

soxffmpegPython을 사용하거나 오디오를 세 부분으로 분할하여 세 개의 개별 오디오 파일을 만들고 싶습니다 .

또는를 사용하여 어떻게 sox이를 달성 할 수 있습니까 ffmpeg?

나중에 계산하고 싶었는데미세유체 촉매 분해사용된 부품에 해당합니다 librosa.

Ubuntu Linux 16.04 설치에 Python 2.7, ffmpeg, 및 .을 설치했습니다.sox

답변1

방금 잠깐 살펴보고 거의 테스트해 본 적이 없으니 도움이 될 것 같습니다. 다음 종속성ffmpeg 파이썬하지만 그것으로 글을 쓰는 것은 어쨌든 어려운 일이 아닙니다 subprocess.

현재 시간 입력 파일은 시간 쌍, 시작 및 끝, 출력 이름으로만 처리됩니다. 누락된 이름은 다음으로 대체됩니다.linecount.wav

import ffmpeg
from sys import argv

""" split_wav `audio file` `time listing`

    `audio file` is any file known by local FFmpeg
    `time listing` is a file containing multiple lines of format:
        `start time` `end time` output name 

    times can be either MM:SS or S*
"""

_in_file = argv[1]

def make_time(elem):
    # allow user to enter times on CLI
    t = elem.split(':')
    try:
        # will fail if no ':' in time, otherwise add together for total seconds
        return int(t[0]) * 60 + float(t[1])
    except IndexError:
        return float(t[0])

def collect_from_file():
    """user can save times in a file, with start and end time on a line"""

    time_pairs = []
    with open(argv[2]) as in_times:
        for l, line in enumerate(in_times):
            tp = line.split()
            tp[0] = make_time(tp[0])
            tp[1] = make_time(tp[1]) - tp[0]
            # if no name given, append line count
            if len(tp) < 3:
                tp.append(str(l) + '.wav')
            time_pairs.append(tp)
    return time_pairs

def main():
    for i, tp in enumerate(collect_from_file()):
        # open a file, from `ss`, for duration `t`
        stream = ffmpeg.input(_in_file, ss=tp[0], t=tp[1])
        # output to named file
        stream = ffmpeg.output(stream, tp[2])
        # this was to make trial and error easier
        stream = ffmpeg.overwrite_output(stream)

        # and actually run
        ffmpeg.run(stream)

if __name__ == '__main__':
    main()

관련 정보