rlx-dac 0.2.11

Descript Audio Codec (DAC) neural audio codec for RLX
Documentation
use anyhow::{Context, Result, ensure};
use serde::{Deserialize, Serialize};
use std::path::Path;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DacConfig {
    pub model_type: String,
    pub sample_rate: u32,
    pub encoder_dim: usize,
    pub encoder_rates: Vec<usize>,
    pub decoder_dim: usize,
    pub decoder_rates: Vec<usize>,
    pub latent_dim: usize,
    pub n_codebooks: usize,
    pub codebook_size: usize,
    pub codebook_dim: usize,
    pub hop_length: usize,
}

impl DacConfig {
    pub fn load(path: &Path) -> Result<Self> {
        let text =
            std::fs::read_to_string(path).with_context(|| format!("read {}", path.display()))?;
        let cfg: Self = serde_json::from_str(&text).context("parse dac config.json")?;
        cfg.validate()?;
        Ok(cfg)
    }

    pub fn validate(&self) -> Result<()> {
        ensure!(self.encoder_dim > 0, "encoder_dim must be > 0");
        ensure!(!self.encoder_rates.is_empty(), "encoder_rates empty");
        ensure!(!self.decoder_rates.is_empty(), "decoder_rates empty");
        ensure!(self.latent_dim > 0, "latent_dim must be > 0");
        ensure!(self.n_codebooks > 0, "n_codebooks must be > 0");
        ensure!(self.codebook_size > 0, "codebook_size must be > 0");
        ensure!(self.codebook_dim > 0, "codebook_dim must be > 0");
        ensure!(self.hop_length > 0, "hop_length must be > 0");
        Ok(())
    }

    pub fn config_24khz() -> Self {
        Self {
            model_type: "24khz".into(),
            sample_rate: 24_000,
            encoder_dim: 64,
            encoder_rates: vec![2, 4, 5, 8],
            decoder_dim: 1536,
            decoder_rates: vec![8, 5, 4, 2],
            latent_dim: 1024,
            n_codebooks: 32,
            codebook_size: 1024,
            codebook_dim: 8,
            hop_length: 320,
        }
    }

    pub fn config_44khz() -> Self {
        Self {
            model_type: "44khz".into(),
            sample_rate: 44_100,
            encoder_dim: 64,
            encoder_rates: vec![2, 4, 8, 8],
            decoder_dim: 1536,
            decoder_rates: vec![8, 8, 4, 2],
            latent_dim: 1024,
            n_codebooks: 9,
            codebook_size: 1024,
            codebook_dim: 8,
            hop_length: 512,
        }
    }

    pub fn config_16khz() -> Self {
        Self {
            model_type: "16khz".into(),
            sample_rate: 16_000,
            encoder_dim: 64,
            encoder_rates: vec![2, 4, 5, 8],
            decoder_dim: 1536,
            decoder_rates: vec![8, 5, 4, 2],
            latent_dim: 512,
            n_codebooks: 32,
            codebook_size: 1024,
            codebook_dim: 8,
            hop_length: 320,
        }
    }
}