Skip to main content

voirs_cloning/
preprocessing.rs

1//! Audio preprocessing for voice cloning
2
3use crate::{types::VoiceSample, Result};
4
5/// Audio preprocessor for preparing samples
6#[derive(Debug, Clone)]
7pub struct AudioPreprocessor {
8    /// Target sample rate
9    pub target_sample_rate: u32,
10    /// Normalize audio
11    pub normalize: bool,
12}
13
14impl AudioPreprocessor {
15    /// Create new preprocessor
16    pub fn new(target_sample_rate: u32) -> Self {
17        Self {
18            target_sample_rate,
19            normalize: true,
20        }
21    }
22
23    /// Preprocess voice sample
24    pub async fn preprocess(&self, sample: &VoiceSample) -> Result<VoiceSample> {
25        let mut processed = sample.clone();
26
27        // Resample if needed
28        if sample.sample_rate != self.target_sample_rate {
29            processed = processed.resample(self.target_sample_rate)?;
30        }
31
32        // Normalize if enabled
33        if self.normalize {
34            processed.audio = processed.get_normalized_audio();
35        }
36
37        Ok(processed)
38    }
39}
40
41/// Preprocessing pipeline
42#[derive(Debug, Clone)]
43pub struct PreprocessingPipeline {
44    /// Individual preprocessors
45    pub processors: Vec<AudioPreprocessor>,
46}
47
48impl PreprocessingPipeline {
49    /// Create new pipeline
50    pub fn new() -> Self {
51        Self {
52            processors: vec![AudioPreprocessor::new(22050)],
53        }
54    }
55
56    /// Process sample through pipeline
57    pub async fn process(&self, sample: &VoiceSample) -> Result<VoiceSample> {
58        let mut result = sample.clone();
59        for processor in &self.processors {
60            result = processor.preprocess(&result).await?;
61        }
62        Ok(result)
63    }
64}
65
66impl Default for PreprocessingPipeline {
67    fn default() -> Self {
68        Self::new()
69    }
70}