import os import random from pydub import AudioSegment from pydub.silence import split_on_silence def split_audio(audio_file_path: str, chunk_folder: str, max_num_chunks: int, min_silence_level: int, min_silence_length: int, keep_silence: int) -> list: """ Split the audio file into chunks. :param audio_file_path: path to the audio file :param chunk_folder: path to the chunk folder :param max_num_chunks: number of chunks to split the audio file into :param min_silence_level: minimum silence level :param min_silence_length: minimum silence length :param keep_silence: whether to keep silence :return: list of chunked audio file paths """ # create the chunk folder if not os.path.exists(chunk_folder): os.makedirs(chunk_folder) # load audio file audio = AudioSegment.from_file(audio_file_path) audio_name = os.path.basename(audio_file_path).split('.')[0] # split audio file into chunks chunks = split_on_silence(audio, silence_thresh=min_silence_level, min_silence_len=min_silence_length, keep_silence=keep_silence) if len(chunks) > max_num_chunks: # randomly combine chunks while len(chunks) > max_num_chunks: random_chunk_index = random.randint(0, len(chunks) - 2) chunks[random_chunk_index] += chunks[random_chunk_index + 1] chunks.pop(random_chunk_index + 1) # save chunks chunked_audio_files = [] for i, chunk in enumerate(chunks): chunk_file_path = os.path.join(chunk_folder, f'{audio_name}_{i}.wav') chunk.export(chunk_file_path, format='wav') chunked_audio_files.append(chunk_file_path) return chunked_audio_files def convert_to_wav(audio_file_path: str, output_file_path: str) -> str: """ Convert an audio file to wav format. :param audio_file_path: path to the audio file :param output_folder_path: path to the output folder :return: path to the converted audio file """ input_audio = AudioSegment.from_file(audio_file_path) if ".wav" in output_file_path: new_audio_file_path = output_file_path else: new_audio_file_path = output_file_path + ".wav" input_audio.export(new_audio_file_path, format='wav') return new_audio_file_path