介绍
如果你做一些相关AIGC相关项目或产品的时候,碰到了需要训练音频模型,提供需要采集的数据集,往往需要把长音频文件切割成差不多长度音频的短文件。传统的是用一些界面化工具进行切割,或者基于 ffmpeg 进行切割,但是如果想要融合到自己项目里,那界面化工具是肯定不行的,就要基于程序去写一些自动化工具,或者调用一些三方API进行处理。基于白嫖不掏钱的原则,自己动手,吃饱穿暖。下面会介绍基于python 和 shell 的两种方法进行音频段切割。
开搞
方式一:python
1:安装扩展库
pip install librosa
pip install soundfile
2:代码实现
import librosa
import soundfile
import random
import os
import sys
audio_dir=sys.argv[1] #我这里是用传参的方式动态处理不同文件下的音频文件,实际在你自己项目里可以自行设计或者写死等
# 获取当前工作目录
cwd = os.getcwd()
target_dir='data/'+ audio_dir #原始需要切割的音频文件所在目录
origin_dir="data/"+ audio_dir #分割后的文件保存的目录
min_seconds = 10 #最小片段时长
max_seconds = 15 #最大片段时长
# 设置原始音频文件所在目录和新文件保存目录
src_folder = os.path.join(cwd, origin_dir)
dst_folder = os.path.join(cwd, target_dir)
if not os.path.exists(dst_folder):
os.makedirs(dst_folder)
# 遍历源目录中的所有wav文件,有其他格式的,可自行加逻辑,目前默认需要切割的文件名为 vocals.wav
for filename in os.listdir(src_folder):
if filename.endswith("vocals.wav"):
audio_path = os.path.join(src_folder, filename)
audio, sr = librosa.load(audio_path, sr=None, mono=False)
# 音频文件中的静音部分剔除
audio_trimmed, index = librosa.effects.trim(audio, top_db=20, frame_length=2048, hop_length=512)
# 计算总时长和总采样点数
duration = len(str(audio_trimmed[0])) / sr
total_samples = audio_trimmed.shape[-1]
# 确定每个片段应该包含的采样点数
segment_duration = random.uniform(min_seconds, max_seconds) # 随机生成片段长度
segment_samples = int(segment_duration * sr)
# 循环遍历音频文件
for i in range(0, total_samples, segment_samples):
start = i
end = min(i + segment_samples, total_samples)
chunk = audio_trimmed[start:end]
if len(chunk.shape) > 1:
chunk = chunk.T
clip_filename = f"{os.path.splitext(filename)[0]}_{i//segment_samples}.wav"
clip_path = os.path.join(dst_folder, clip_filename)
# 保存切割后的音频
soundfile.write(clip_path, chunk, sr)
方式二:shell
1:安装 ffmpeg
apt install ffmpeg 或者 yum install ffmpeg
2:执行以下命令
ffmpeg -i chengdu.wav -ss 00:00:00 -t 00:00:50 cheng_0.wav #这个是从音频的0秒截取到50秒