Я новичок в программировании и хочу разделить аудиофайл на фрагменты с помощью VAD следующим образом: начиная с агрессивности VAD 0. Если какой-либо фрагмент длиннее 50 секунд, разбейте этот фрагмент на агрессивность 1 и так далее до агрессивности 3. Также сохраните все действительные пути к чанкам вместе с частями, которые пытались разделить, но при агрессивном VAD, равном 3, это снова дольше, чем 50 секунд.
Как я могу сделать это в Python самым продвинутым способом?
def Split_audio(audio_path, chunk_max_dur, vad_aggressiveness=0, chunk_index=''):
# Read the input audio file
with wave.open(audio_path, 'rb') as wf:
audio_data = wf.readframes(wf.getnframes())
is_finished = True
splited_audio_paths = []
# Try splitting the audio with the current vad_aggressiveness level
for vad_level in range(vad_aggressiveness, 4): # Loop through levels 0 to 3
vad = webrtcvad.Vad(vad_level)
frames = list(frame_generator(10, audio_data, WAV_CONFIGS['SAMPLE_RATE'])) # 10 ms frames
segments = vad_collector(10, 100, vad, frames) # 10 ms frame, 100 ms padding
output_path = os.path.dirname(audio_path)
bytes_per_sample = WAV_CONFIGS['SAMPLE_RATE'] * 2 # 2 bytes per sample (16-bit audio)
for i, segment in enumerate(segments):
segment_duration = len(segment) / bytes_per_sample
# Check if the segment exceeds the max duration
if segment_duration > chunk_max_dur:
# If it exceeds the max duration, try a more aggressive VAD
if vad_level < 3:
# Recursively try to split this segment with a more aggressive level
new_chunk_paths = split_audio(
audio_path,
chunk_max_dur,
vad_aggressiveness=vad_level + 1,
chunk_index=f"{chunk_index}{i:04d}_"
)
splited_audio_paths.extend(new_chunk_paths)
else:
# If we're at max aggressiveness (3), save the chunk and stop splitting
chunk_name = f"{chunk_index}{i:04d}_aggressive_{vad_level}.wav"
path = os.path.join(output_path, chunk_name)
with wave.open(path, 'wb') as wf:
wf.setnchannels(WAV_CONFIGS['SAMPLE_CHANNELS'])
wf.setsampwidth(WAV_CONFIGS['SAMPLE_WIDTH'])
wf.setframerate(WAV_CONFIGS['SAMPLE_RATE'])
wf.writeframes(segment)
splited_audio_paths.append(path)
else:
# Save the chunk if it's within the allowed duration
chunk_name = f"{chunk_index}{i:04d}_aggressive_{vad_level}.wav"
path = os.path.join(output_path, chunk_name)
with wave.open(path, 'wb') as wf:
wf.setnchannels(WAV_CONFIGS['SAMPLE_CHANNELS'])
wf.setsampwidth(WAV_CONFIGS['SAMPLE_WIDTH'])
wf.setframerate(WAV_CONFIGS['SAMPLE_RATE'])
wf.writeframes(segment)
splited_audio_paths.append(path)
# If the split succeeded and no segment exceeded the limit, mark as finished
is_finished = all(len(segment) / bytes_per_sample
Подробнее здесь: https://stackoverflow.com/questions/790 ... nto-chunks