Files
annescribe/transcription/audio_processing.py
T
2024-12-29 21:27:11 +01:00

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