Как разбить звук на части? ⇐ Python

Программы на Python
Anonymous
Как разбить звук на части?

Сообщение Anonymous »

Я новичок в программировании и хочу разделить аудиофайл на фрагменты с помощью 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

Вернуться в «Python»