|
| 1 | +import argparse |
| 2 | +from service.commands import EnrollSpeakerCommand, RecognizeSpeakerCommand, ListSpeakersCommand, DeleteSpeakerCommand, CommandHandler |
| 3 | +from bst import BinarySearchTree |
| 4 | + |
| 5 | +def main(): |
| 6 | + """CLI entry point.""" |
| 7 | + # Initialize Argument Parser |
| 8 | + parser = argparse.ArgumentParser(description="Speaker Recognition CLI Tool") |
| 9 | + |
| 10 | + # Create subparsers for different commands |
| 11 | + subparsers = parser.add_subparsers(dest='command') |
| 12 | + |
| 13 | + # Enroll Command with optional parameters for customization |
| 14 | + enroll_parser = subparsers.add_parser('enroll', help='Enroll a new speaker') |
| 15 | + enroll_parser.add_argument('speaker_name', type=str, help='Name of the speaker') |
| 16 | + enroll_parser.add_argument('audio_file', type=str, help='Path to the speaker audio file') |
| 17 | + |
| 18 | + # Optional arguments for speaker enrollment |
| 19 | + enroll_parser.add_argument('--sample_rate', type=int, default=16000, help='Sample rate of the audio file') |
| 20 | + enroll_parser.add_argument('--num_filters', type=int, default=26, help='Number of Mel filters') |
| 21 | + enroll_parser.add_argument('--num_ceps', type=int, default=13, help='Number of MFCC coefficients') |
| 22 | + enroll_parser.add_argument('--n_fft', type=int, default=512, help='FFT size for audio processing') |
| 23 | + enroll_parser.add_argument('--frame_size', type=float, default=0.025, help='Frame size in seconds') |
| 24 | + enroll_parser.add_argument('--frame_step', type=float, default=0.01, help='Frame step (overlap) in seconds') |
| 25 | + enroll_parser.add_argument('--n_mixtures', type=int, default=8, help='Number of Gaussian mixtures in GMM') |
| 26 | + |
| 27 | + # Recognize Command |
| 28 | + recognize_parser = subparsers.add_parser('recognize', help='Recognize a speaker from an audio file') |
| 29 | + recognize_parser.add_argument('audio_file', type=str, help='Path to the audio file') |
| 30 | + |
| 31 | + # List Speakers Command |
| 32 | + subparsers.add_parser('list_speakers', help='List all enrolled speakers') |
| 33 | + |
| 34 | + # Delete Speaker Command |
| 35 | + delete_parser = subparsers.add_parser('delete_speaker', help='Delete a speaker by name') |
| 36 | + delete_parser.add_argument('speaker_name', type=str, help='Name of the speaker to delete') |
| 37 | + |
| 38 | + # Parse the arguments |
| 39 | + args = parser.parse_args() |
| 40 | + |
| 41 | + # Initialize the command handler |
| 42 | + handler = CommandHandler() |
| 43 | + |
| 44 | + # Binary Search Tree and base directory |
| 45 | + bst = BinarySearchTree() # Placeholder for actual binary search tree |
| 46 | + base_directory = "models/" # Placeholder for actual base directory |
| 47 | + |
| 48 | + # Process the command based on the parsed arguments |
| 49 | + if args.command == 'enroll': |
| 50 | + command = EnrollSpeakerCommand( |
| 51 | + speaker_name=args.speaker_name, |
| 52 | + audio_file=args.audio_file, |
| 53 | + bst=bst, |
| 54 | + base_directory=base_directory, |
| 55 | + sample_rate=args.sample_rate, |
| 56 | + num_filters=args.num_filters, |
| 57 | + num_ceps=args.num_ceps, |
| 58 | + n_fft=args.n_fft, |
| 59 | + frame_size=args.frame_size, |
| 60 | + frame_step=args.frame_step, |
| 61 | + n_mixtures=args.n_mixtures |
| 62 | + ) |
| 63 | + handler.run(command) |
| 64 | + |
| 65 | + elif args.command == 'recognize': |
| 66 | + command = RecognizeSpeakerCommand(args.audio_file) |
| 67 | + handler.run(command) |
| 68 | + |
| 69 | + elif args.command == 'list_speakers': |
| 70 | + command = ListSpeakersCommand() |
| 71 | + handler.run(command) |
| 72 | + |
| 73 | + elif args.command == 'delete_speaker': |
| 74 | + command = DeleteSpeakerCommand(args.speaker_name) |
| 75 | + handler.run(command) |
| 76 | + |
| 77 | + else: |
| 78 | + parser.print_help() |
| 79 | + |
| 80 | +if __name__ == "__main__": |
| 81 | + main() |
0 commit comments