import argparse import os import time from typing import Dict, Union import soundfile as sf def parse_args(dict_args: Union[Dict, None]) -> argparse.Namespace: """ Parse command-line arguments for configuring the model, dataset, and training parameters. Args: dict_args: Dict of command-line arguments. If None, arguments will be parsed from sys.argv. Returns: Namespace object containing parsed arguments and their values. """ parser = argparse.ArgumentParser() parser.add_argument( "--input_directory", type=str, help="Path to the input directory." ) parser.add_argument( "--output_directory", type=str, help="Path to the output directory." ) parser.add_argument("--start_sec", type=float, default=20.0) parser.add_argument("--end_sec", type=float, default=30.0) parser.add_argument("--codec", type=str, default="wav") parser.add_argument( "--max_folders", type=int, default=float("inf"), help="Maximum number of folders to process.", ) if dict_args is not None: args = parser.parse_args([]) args_dict = vars(args) args_dict.update(dict_args) args = argparse.Namespace(**args_dict) else: args = parser.parse_args() if not args.output_directory: original_dir = os.path.dirname(args.input_directory) tests_dir = os.path.join("tests", original_dir) os.makedirs(tests_dir, exist_ok=True) args.output_directory = os.path.join( tests_dir, os.path.basename(args.input_directory) ) return args def trim_wav( input_file: str, output_file: str, start_sec: float, end_sec: float, codec: str ): data, samplerate = sf.read(input_file) start_sample = int(start_sec * samplerate) end_sample = int(end_sec * samplerate) trimmed_data = data[start_sample:end_sample] sf.write(output_file, trimmed_data, samplerate, format=codec) def trim_directory(args): args = parse_args(args) input_directory = args.input_directory output_directory = args.output_directory start_sec = args.start_sec end_sec = args.end_sec codec = args.codec max_folder = args.max_folders folder_count = 0 start_time = time.time() for root, dirs, files in os.walk(input_directory): if folder_count >= max_folder: break if os.path.relpath(root, input_directory) != ".": print(f"Processing folder: {os.path.relpath(root, input_directory)}") relative_path = os.path.relpath(root, input_directory) target_folder = os.path.join(output_directory, relative_path) os.makedirs(target_folder, exist_ok=True) for filename in files: if filename.endswith(f".{codec}"): input_file = os.path.join(root, filename) output_file = os.path.join( target_folder, filename.replace(f".{codec}", f".{codec}") ) try: trim_wav(input_file, output_file, start_sec, end_sec, codec) except Exception as e: print(f"Error processing {filename} in folder {root}: {e}") folder_count += 1 end_time = time.time() total_time = end_time - start_time print(f"Processing complete. Total time: {total_time:.2f} seconds.") return output_directory if __name__ == "__main__": trim_directory(None)