data.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. """
  2. Data handling and preprocessing for voice recognition training.
  3. This module provides specialized data handling for speaker recognition tasks,
  4. including speaker enrollment, data augmentation, and balanced sampling.
  5. """
  6. import os
  7. import random
  8. from pathlib import Path
  9. from typing import Dict, List, Tuple, Optional
  10. import logging
  11. import torch
  12. from torch.utils.data import DataLoader
  13. from ..data_pipeline import (
  14. DatasetBuilder, DataPreprocessor, AudioDataset,
  15. AudioProcessor, AudioAugmentation, DataLoaderFactory
  16. )
  17. class VoiceRecognitionDataPreprocessor(DataPreprocessor):
  18. """Specialized data preprocessor for voice recognition tasks."""
  19. def __init__(self, audio_config, logger: Optional[logging.Logger] = None):
  20. """Initialize voice recognition data preprocessor."""
  21. super().__init__(audio_config, logger)
  22. def preprocess_voice_recognition_data(self, raw_data_dir: str, output_dir: str,
  23. target_chunk_length: float = 3.0) -> str:
  24. """
  25. Preprocess raw voice recognition data with speaker enrollment focus.
  26. Args:
  27. raw_data_dir: Directory containing raw speaker audio files
  28. output_dir: Output directory for processed data
  29. target_chunk_length: Target length for audio chunks (seconds)
  30. Returns:
  31. Path to processed data directory
  32. """
  33. return super().preprocess_voice_recognition_data(
  34. raw_data_dir, output_dir, target_chunk_length
  35. )
  36. def create_voice_recognition_dataloaders(data_dir: str,
  37. speaker_mapping: Dict[str, str],
  38. audio_config,
  39. batch_size: int = 32,
  40. num_workers: int = 4,
  41. augmentation_config: Optional[Dict[str, float]] = None,
  42. balance_speakers: bool = True) -> Tuple[DataLoader, DataLoader, DataLoader, Dict[str, str]]:
  43. """
  44. Create data loaders for voice recognition training.
  45. Args:
  46. data_dir: Directory containing processed voice recognition data
  47. speaker_mapping: Mapping of directory names to speaker names
  48. audio_config: Audio processing configuration
  49. batch_size: Batch size for training
  50. num_workers: Number of worker processes
  51. augmentation_config: Configuration for data augmentation
  52. balance_speakers: Whether to balance speakers in training batches
  53. Returns:
  54. Tuple of (train_loader, val_loader, test_loader, final_speaker_mapping)
  55. """
  56. logger = logging.getLogger(__name__)
  57. # Initialize components
  58. audio_processor = AudioProcessor(audio_config)
  59. dataset_builder = DatasetBuilder(logger)
  60. # Create datasets
  61. try:
  62. train_dataset, val_dataset, test_dataset, final_speaker_mapping = dataset_builder.create_voice_recognition_dataset(
  63. data_dir, audio_processor, speaker_mapping,
  64. augmentation_config=augmentation_config
  65. )
  66. except Exception as e:
  67. logger.error(f"Failed to create voice recognition datasets: {str(e)}")
  68. raise
  69. # Create data loaders with appropriate sampling
  70. train_loader = DataLoaderFactory.create_dataloader(
  71. train_dataset, batch_size, shuffle=True, num_workers=num_workers,
  72. balanced_sampling=balance_speakers
  73. )
  74. val_loader = DataLoaderFactory.create_dataloader(
  75. val_dataset, batch_size, shuffle=False, num_workers=num_workers
  76. )
  77. test_loader = DataLoaderFactory.create_dataloader(
  78. test_dataset, batch_size, shuffle=False, num_workers=num_workers
  79. )
  80. return train_loader, val_loader, test_loader, final_speaker_mapping