Spaces:
Runtime error
Runtime error
| 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) | |