动机
想要用pydub切割音频来制作数据集,结果发现ffmpeg不支持m4a格式的数据输出。
from pydub import AudioSegment
path = r"D:\data\upload"
save_path = r"D:\data\train\upload"
files = os.listdir(path)
for file in files:
audio = AudioSegment.from_file(path+'\\'+file, "flac")
size = 2000 # 切割的毫秒数 60s=60000
chunks = make_chunks(audio, size)
for i, chunk in enumerate(chunks):
chunk_name = file.split('.')[0] + f"_{i}.flac"
print(chunk_name)
chunk.export(save_path+'\\'+chunk_name, format="flac")
报错信息:
Input #0, wav, from 'C:\Users\AAA\AppData\Local\Temp\tmp_g6wtefp':Duration: 00:00:02.00, bitrate: 512 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 32000 Hz, 1 channels, s16, 512 kb/s [AVFormatContext @ 0000027c7f0bb680] Requested output format 'm4a' is not known.
解决办法
参考了大佬的使用 ffmpeg 来对音频文件(mp3、m4a 等)进行分割 方法,但是一条一条输命令太麻烦了,所以用python的os.system来试着自动化。这里记录一下方便以后使用。
files = os.listdir(path)
for file in files:
# audio = AudioSegment.from_file(path+'\\'+file, "m4a")
cmd = f"ffmpeg -i {path}\{file} -f segment -segment_time 2 -write_xing 0 -c copy {save_path}\{file.split('.')[0]}_%d.m4a"
os.system(cmd)
ffmpeg -i file.m4a -f segment -segment_time 900 -write_xing 0 -c copy out%03d.m4a
- -i:输入文件;
- -f:强制格式,即目标格式,这里指定为 segment,即分割;
- -segment_time:每段的时长,单位为秒,示例是按每 5 分钟来切割;
- -c:指定编码名称(codec),这里我们不打算重新编码,于是用 copy,非常快;
- write_xing 0:参数指示禁用Xing头部信息的写入