在寂静时刻将大音频文件批量分割成固定长度的小音频文件

问题描述 投票:0回答:0

为了训练 SO-VITS-SVC 神经网络,我们需要 10-14 秒的语音文件。作为材料,假设我使用某个游戏中的短语。我已经制作了一个用于将不同文件解码为一种工作格式的批处理脚本,另一个用于消除静音的批处理脚本,以及一个用于将小音频文件组合成 13-14 秒的文件的批处理脚本(我使用了 Python、pydub 和 FFmpeg) 。要成功自动创建训练数据集,只需制作一个批处理脚本即可 - 将持续超过 14 秒的音频文件切割成持续 10-14 秒的单独文件,最好在安静或接近安静的地方进行切割。

所以,需要将大的音频文件(20秒,70秒,可能几百秒)批量切割成大约10-14秒的片段,但主要任务是寻找切割区域中最安静的地方,以便不要在单词中间剪切短语(这对于模型训练来说不是很好)。那么,是否真的可以以一种非常优化的方式做到这一点,使得处理 30 秒的文件不需要 15 秒,而是很快呢?仅在剪切区域需要静区检测,即从文件开头算起的 10-14 秒。

如果有任何帮助,我将非常感激。

我尝试与 ChatGPT 一起编写一个脚本,但所有选项都给出了完全不可预测的结果,甚至与我需要的不接近......我不得不在该选项处停止,并在 14000 毫秒内急剧剪切文件。然而,我希望有机会制作一个变体,在安静的区域精确切割。

import os
from pydub import AudioSegment

input_directory = ".../RemSilence/"
output_directory = ".../Split/"
max_duration = 14000

def split_audio_by_duration(input_file, duration):
    audio = AudioSegment.from_file(input_file)
    segments = []
    for i in range(0, len(audio), duration):
        segment = audio[i:i + duration]
        segments.append(segment)
    return segments

if __name__ == "__main__":
    os.makedirs(output_directory, exist_ok=True)
    audio_files = [os.path.join(input_directory, file) for file in os.listdir(input_directory) if file.endswith(".wav")]
    audio_files.sort(key=lambda file: len(AudioSegment.from_file(file)))
    for file in audio_files:
        audio = AudioSegment.from_file(file)
        if len(audio) > max_duration:
            segments = split_audio_by_duration(file, max_duration)
            for i, segment in enumerate(segments):
                output_filename = f"output_{len(os.listdir(output_directory))+1}.wav"
                output_file_path = os.path.join(output_directory, output_filename)
                segment.export(output_file_path, format="wav")
        else:
            output_filename = f"output_{len(os.listdir(output_directory))+1}.wav"
            output_file_path = os.path.join(output_directory, output_filename)
            audio.export(output_file_path, format="wav")
python audio ffmpeg split dataset
© www.soinside.com 2019 - 2024. All rights reserved.