私は次のリンクを見ました: 開始時間と終了時間を使用してオーディオファイルをトリムします
しかし、これは私の質問に完全に答えるものではありません。私の問題は、abc.mp3
やabc.wav
などのオーディオファイルを持っていることです。また、開始と終了のタイムスタンプを含むテキストファイルがあります。
0.0 1.0 silence
1.0 5.0 music
6.0 8.0 speech
Pythonおよびsox
/ffmpeg
を使用してオーディオを3つの部分に分割し、結果として3つの別々のオーディオファイルを生成したい.
sox
またはffmpeg
を使用してこれを実現するにはどうすればよいですか?
後で、librosa
を使用してそれらの部分に対応する [〜#〜] mfcc [〜#〜] を計算したいと思います。
Ubuntu Linux16.04のインストールにPython 2.7
、ffmpeg
、およびsox
があります。
私はそれをすぐに試しましたが、テストの方法はほとんどないので、おそらくそれは助けになるでしょう。以下は ffmpeg-python に依存していますが、とにかく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()