73 lines
2.4 KiB
Python
73 lines
2.4 KiB
Python
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
|