分离切割音频成小段

介绍

如果你做一些相关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秒

其他方式也能实现,不过用的最多的还是这两种方式,这两种里,ffmpeg 又是不太好用的,因为这种格式需要拼接时间,没有 python 的方法来的便捷。两种方式各有各自的使用场景,适合的才是最好的。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值