use serde::{Deserialize, Serialize};
use crate::error::Result;
use crate::latent::{KindTag, Metadata};
use crate::manifest::SourceKind;
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawExperimentConfig {
pub project: String,
pub experiment_name: String,
pub sample_rate: u32,
pub clip_duration_seconds: f32,
pub source_data: RawSourceData,
pub target_audio: RawTargetAudio,
pub data_encoder: RawDataEncoder,
pub audio_codec: RawAudioCodec,
pub conditional_generator: RawGenerator,
pub training: RawTraining,
#[serde(default)]
pub generation: RawGeneration,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Alignment {
Paired,
WeaklyPaired,
Unpaired,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawSourceData {
#[serde(rename = "type")]
pub kind: SourceKind,
pub path: String,
#[serde(default = "default_alignment")]
pub alignment: Alignment,
}
fn default_alignment() -> Alignment {
Alignment::Paired
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawTargetAudio {
pub path: String,
#[serde(default)]
pub segmentation: RawSegmentation,
}
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawSegmentation {
pub window_seconds: f32,
#[serde(default)]
pub overlap_seconds: f32,
}
impl Default for RawSegmentation {
fn default() -> Self {
Self {
window_seconds: 10.0,
overlap_seconds: 0.0,
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct RawDataEncoder {
#[serde(rename = "type")]
pub kind: String,
pub latent_dim: usize,
#[serde(flatten, default)]
pub extra: Metadata,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct RawAudioCodec {
#[serde(rename = "type")]
pub kind: String,
pub latent_type: KindTag,
#[serde(default = "default_true")]
pub freeze: bool,
#[serde(flatten, default)]
pub extra: Metadata,
}
fn default_true() -> bool {
true
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct RawGenerator {
#[serde(rename = "type")]
pub kind: String,
#[serde(flatten, default)]
pub extra: Metadata,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawTraining {
pub batch_size: usize,
pub learning_rate: f64,
pub max_steps: u64,
#[serde(default)]
pub seed: u64,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawGeneration {
pub temperature: f32,
pub guidance_scale: f32,
pub num_candidates: u32,
}
impl Default for RawGeneration {
fn default() -> Self {
Self {
temperature: 1.0,
guidance_scale: 1.0,
num_candidates: 1,
}
}
}
impl RawExperimentConfig {
pub fn from_json_str(s: &str) -> Result<Self> {
Ok(serde_json::from_str(s)?)
}
pub fn from_toml_str(s: &str) -> Result<Self> {
Ok(toml::from_str(s)?)
}
pub fn to_json_string(&self) -> Result<String> {
Ok(serde_json::to_string_pretty(self)?)
}
}