Data contract
What the code expects on disk and what reaches the model. All defaults below are read from
kirad/datasets_and_dataloaders.py and kirad/constants.py.
One CSV per split: with a CSV path, dataset_splits, data_sources and dataset_fold are
ignored (load_dataset), so set df_or_dataset_version in the train: and val_test: (or
val:/test:) sections of the config.
| Column |
Needed for |
Used by |
Notes |
uuid |
always |
row index, sampler, W&B score tables |
unique per recording |
filename |
always |
load_relative_dataset |
→ <audio_root>/<filename>.wav, <text_root>/<filename>.json |
phq |
depression task |
label_column.depression |
PHQ-9 total, 0–27 (raw score, not a class) |
gad |
anxiety task |
label_column.anxiety |
GAD-7 total, 0–21 |
| duration column |
always |
num_windows, min/max filter |
seconds after VAD; name set by duration_column (configs: prompt_vad_trimmed_duration train, prompt_vad_cut_duration val/test) |
asr_output_id |
text runs: DAM 2 (DAM 3 only indirectly, via the cached DAM 2 embeddings; config_llma_dam3.0.yaml reads text directly) |
KintsugiTextDataset.__getitem__ |
must exist; value is not used for the path |
user (+ demographics) |
merge_rows_by_subject only |
merge_df_rows_by_subject |
rows merge when all present Kintsugi columns match |
scores_<task> |
knowledge distillation only |
KintsugiMetadata.__getitem__ → label.<task>.kd |
from score_targets_csv (uuid, scores_depression, scores_anxiety); teacher-model scores, not human ratings |
File layout
<audio_root>/<filename>.wav 16 kHz (not resampled: only a warning), channel 0 used, VAD already applied
<text_root>/<filename>.json whisper_timestamped output; only its "text" field is read
train.csv val.csv test.csv metadata above (paths relative to the config folder or cwd)
audio_root / text_root are KintsugiMetadata params (default: current directory). VAD is
not in this repo; recordings shorter than min_duration (30 s) are dropped.
Windows (30 s)
| Quantity |
Value |
Where |
| Window length |
30 s = 480,000 samples at 16 kHz |
INFERENCE_WINDOW_SIZE, EXPECTED_SAMPLE_RATE |
| Encoder positions per window |
1500 × 320 samples |
mar_2024/model.py (self.padding) |
| Log-mel per window |
80 bins × 3000 frames (hop 160, n_fft 400) |
WhisperTorchFeatureExtractor |
Windows per recording (all, overlap 0) |
⌊duration / 30⌋, spread from start to end (leftover audio falls between windows) |
get_window_starts |
… with pad_last_chunk_to_full: true |
⌈duration / 30⌉ (last one zero-padded) |
get_preprocessor_with_audio_normalization |
window_method: all (every window; val/test), single_random (1 random), single_start
(first 30 s), random_adjacent_pair (2 consecutive; DAM 1 train, feeds the variance loss).
Batch
broadcast_collate concatenates the windows of all B recordings; length[i] = windows of
recording i, so ΣW = length.sum().
| Key |
Shape |
Content |
uuid |
[B] |
recording ids |
features.audio |
[ΣW, 480000] |
raw waveform (preprocessor: false, DAM 1 current config) |
features.audio |
[ΣW, 80, 3000] |
HF log-mel (preprocessor: openai/whisper-small.en, DAM 2/3) |
features.text.input_ids, .attention_mask |
[ΣW, L] |
tokens, tiled to every window; L = 512 for BERT |
features.backbone_cache |
[ΣW, D] |
cached embeddings, tiled like the other modalities (DAM 3 phase 1 target) |
label.<task>.primary |
[B] |
raw PHQ / GAD score |
label.<task>.kd |
[B] |
teacher score (only with score_targets_csv) |
length |
[B] |
windows per recording |
batch_size in the config counts recordings, not windows.
Data parameters and defaults
KintsugiMetadata (config key metadata=kirad.datasets_and_dataloaders.KintsugiMetadata):
| Param |
Default |
Notes |
df_or_dataset_version |
required |
CSV path, DataFrame, {metadata, audio_root, text_root} or a private Kintsugi version name |
label_column |
{depression: phq, anxiety: gad} |
task → CSV column |
duration_column |
None |
effectively required (used for num_windows) |
min_duration / max_duration |
30 / None s |
inclusive filters |
window_duration |
30 s |
keep equal to the audio dataset's |
max_overlap_frac |
0.0 |
keep equal to the audio dataset's |
fraction |
1.0 |
subsample, random_state=1 |
merge_rows_by_subject |
False |
many_to_one / many_to_many concatenate a subject's audio |
score_targets_csv |
None |
KD targets |
audio_root / text_root |
None (cwd) |
|
KintsugiAudioDataset (audio=...):
| Param |
Default |
Current configs |
preprocessor |
openai/whisper-small.en |
DAM 1: false (log-mel on GPU in the model) |
normalize_audio |
False |
true (DC removal + peak scale to [-1, 1]) |
normalize_features |
False |
true in DAM 2/3 |
window_method |
all |
train random_adjacent_pair (DAM 1) / single_random (DAM 2) |
window_duration, max_overlap_frac |
30, 0.0 |
|
ideal_logmel_energies |
None |
DAM 2/3: logmel_energies.npy (not in repo) |
pad_last_chunk_to_full |
False |
true in DAM 3 |
augmentations |
() |
[{class_name, params, aug_prob}], e.g. RawBoost |
KintsugiTextDataset (text=...): preprocessor google-bert/bert-base-uncased,
text_output_per_sample merge, prompt None (LLaMA only), max_tokens None
(tokenizer max). KintsugiCacheDataset (backbone_cache=...): backbone_cache required,
feat_start_idx 0, feat_end_idx None.
Per-split merge order: default < val_test (val and test) < train/val/test
(LauncherConfig.get_params_by_split).
2 · Data
The metadata CSV says which WAV files to open and what their labels are. Audio is cut into 30 s windows and turned into features; windows of all recordings in a batch are concatenated and length remembers where each recording ends.
Main path: steps 15–24 of a train run (walkthrough). Gold boxes open the step; grey boxes are side paths and open the code.
flowchart LR
subgraph kirad_datasets_and_dataloaders_py___box["datasets_and_dataloaders.py"]
direction TB
kirad_datasets_and_dataloaders_py__KintsugiMetadata["<b>15 · KintsugiMetadata()</b><br/>Metadata table indexed by UUID:<br/>loads CSV, merges KD scores,<br/>filters by duration."]
class kirad_datasets_and_dataloaders_py__KintsugiMetadata main
click kirad_datasets_and_dataloaders_py__KintsugiMetadata "../walkthrough/#step-15"
kirad_datasets_and_dataloaders_py__KintsugiMetadata_preprocess_metadata["<b>17 · KintsugiMetadata.preprocess_metadata()</b><br/>Join KD score targets, optionally<br/>merge rows per subject, count<br/>windows per recording."]
class kirad_datasets_and_dataloaders_py__KintsugiMetadata_preprocess_metadata main
click kirad_datasets_and_dataloaders_py__KintsugiMetadata_preprocess_metadata "../walkthrough/#step-17"
kirad_datasets_and_dataloaders_py__KintsugiMetadata_filter_metadata["<b>18 · KintsugiMetadata.filter_metadata()</b><br/>Subsample `fraction` of rows, then<br/>drop recordings outside min/max<br/>duration (s)."]
class kirad_datasets_and_dataloaders_py__KintsugiMetadata_filter_metadata main
click kirad_datasets_and_dataloaders_py__KintsugiMetadata_filter_metadata "../walkthrough/#step-18"
kirad_datasets_and_dataloaders_py__KintsugiMetadata___getitem__["<b>21 · KintsugiMetadata.__getitem__()</b><br/>Return {uuid, label: {task:<br/>{primary: raw score, kd: teacher<br/>score}}} for one UUID."]
class kirad_datasets_and_dataloaders_py__KintsugiMetadata___getitem__ main
click kirad_datasets_and_dataloaders_py__KintsugiMetadata___getitem__ "../walkthrough/#step-21"
kirad_datasets_and_dataloaders_py__KintsugiAudioDataset___getitem__["<b>22 · KintsugiAudioDataset.__getitem__()</b><br/>Load, concatenate (channel 0),<br/>augment and window one recording's<br/>audio."]
class kirad_datasets_and_dataloaders_py__KintsugiAudioDataset___getitem__ main
click kirad_datasets_and_dataloaders_py__KintsugiAudioDataset___getitem__ "../walkthrough/#step-22"
kirad_datasets_and_dataloaders_py__get_preprocessor_with_audio_normalization["<b>19 · get_preprocessor_with_audio_normalization()</b><br/>Build the function audio [T] -›<br/>windows -› features used by<br/>KintsugiAudioDataset."]
class kirad_datasets_and_dataloaders_py__get_preprocessor_with_audio_normalization main
click kirad_datasets_and_dataloaders_py__get_preprocessor_with_audio_normalization "../walkthrough/#step-19"
kirad_datasets_and_dataloaders_py__get_window_starts["<b>23 · get_window_starts()</b><br/>Start sample(s) of the windows cut<br/>from one recording, by<br/>window_method."]
class kirad_datasets_and_dataloaders_py__get_window_starts main
click kirad_datasets_and_dataloaders_py__get_window_starts "../walkthrough/#step-23"
kirad_datasets_and_dataloaders_py__KintsugiTextDataset___getitem__["<b>KintsugiTextDataset.__getitem__()</b><br/>Read the transcript JSON(s) of one<br/>recording and tokenize them."]
class kirad_datasets_and_dataloaders_py__KintsugiTextDataset___getitem__ opt
click kirad_datasets_and_dataloaders_py__KintsugiTextDataset___getitem__ "https://github.com/Pipotheavenger/kintsugi-rad-docs/blob/main/kirad/datasets_and_dataloaders.py#L572" _blank
kirad_datasets_and_dataloaders_py__KintsugiCacheDataset["<b>KintsugiCacheDataset()</b><br/>Precomputed backbone features by<br/>UUID (DAM 3 teacher cache),<br/>optional dim slice."]
class kirad_datasets_and_dataloaders_py__KintsugiCacheDataset opt
click kirad_datasets_and_dataloaders_py__KintsugiCacheDataset "https://github.com/Pipotheavenger/kintsugi-rad-docs/blob/main/kirad/datasets_and_dataloaders.py#L628" _blank
kirad_datasets_and_dataloaders_py__UuidSampler["<b>20 · UuidSampler()</b><br/>Yields metadata UUIDs (shuffled<br/>for train, sequential for<br/>val/test) for the loader."]
class kirad_datasets_and_dataloaders_py__UuidSampler main
click kirad_datasets_and_dataloaders_py__UuidSampler "../walkthrough/#step-20"
end
subgraph kirad_dataset_utils_py___box["dataset_utils.py"]
direction TB
kirad_dataset_utils_py__load_relative_dataset["<b>16 · load_relative_dataset()</b><br/>Load metadata and add<br/>audio_filename / text_filename<br/>paths from the filename column."]
class kirad_dataset_utils_py__load_relative_dataset main
click kirad_dataset_utils_py__load_relative_dataset "../walkthrough/#step-16"
kirad_dataset_utils_py__load_dataset["<b>load_dataset()</b><br/>Return metadata as a DataFrame:<br/>pass-through, read a CSV path, or<br/>a Kintsugi version."]
class kirad_dataset_utils_py__load_dataset opt
click kirad_dataset_utils_py__load_dataset "https://github.com/Pipotheavenger/kintsugi-rad-docs/blob/main/kirad/dataset_utils.py#L49" _blank
kirad_dataset_utils_py__merge_df_rows_by_subject["<b>merge_df_rows_by_subject()</b><br/>Merge rows sharing user + labels +<br/>demographics into one row per<br/>subject."]
class kirad_dataset_utils_py__merge_df_rows_by_subject opt
click kirad_dataset_utils_py__merge_df_rows_by_subject "https://github.com/Pipotheavenger/kintsugi-rad-docs/blob/main/kirad/dataset_utils.py#L651" _blank
kirad_dataset_utils_py__broadcast_collate["<b>24 · broadcast_collate()</b><br/>DataLoader collate: concat windows<br/>of all recordings; length =<br/>windows per recording."]
class kirad_dataset_utils_py__broadcast_collate main
click kirad_dataset_utils_py__broadcast_collate "../walkthrough/#step-24"
end
subgraph kirad_augmentations_py___box["augmentations.py"]
direction TB
kirad_augmentations_py__RawBoost["<b>RawBoost()</b><br/>RawBoost waveform augmentation<br/>(LnL/ISD/SSI noise); default algo<br/>4 = all three."]
class kirad_augmentations_py__RawBoost opt
click kirad_augmentations_py__RawBoost "https://github.com/Pipotheavenger/kintsugi-rad-docs/blob/main/kirad/augmentations.py#L166" _blank
end
subgraph kirad_constants_py___box["constants.py"]
direction TB
kirad_constants_py__DatasetFields["<b>DatasetFields()</b><br/>Key names of a batch dict: uuid,<br/>features, label.‹task›.primary/kd,<br/>length, loss."]
class kirad_constants_py__DatasetFields opt
click kirad_constants_py__DatasetFields "https://github.com/Pipotheavenger/kintsugi-rad-docs/blob/main/kirad/constants.py#L154" _blank
end
from_prev(["◀ from step 14: LauncherConfig.get_dataset()"])
class from_prev edge
from_prev ==> kirad_datasets_and_dataloaders_py__KintsugiMetadata
click from_prev "#stage-launch"
kirad_datasets_and_dataloaders_py__KintsugiMetadata ==> kirad_dataset_utils_py__load_relative_dataset
kirad_dataset_utils_py__load_relative_dataset ==> kirad_datasets_and_dataloaders_py__KintsugiMetadata_preprocess_metadata
kirad_datasets_and_dataloaders_py__KintsugiMetadata_preprocess_metadata ==> kirad_datasets_and_dataloaders_py__KintsugiMetadata_filter_metadata
kirad_datasets_and_dataloaders_py__KintsugiMetadata_filter_metadata ==> kirad_datasets_and_dataloaders_py__get_preprocessor_with_audio_normalization
kirad_datasets_and_dataloaders_py__get_preprocessor_with_audio_normalization ==> kirad_datasets_and_dataloaders_py__UuidSampler
kirad_datasets_and_dataloaders_py__UuidSampler ==> kirad_datasets_and_dataloaders_py__KintsugiMetadata___getitem__
kirad_datasets_and_dataloaders_py__KintsugiMetadata___getitem__ ==> kirad_datasets_and_dataloaders_py__KintsugiAudioDataset___getitem__
kirad_datasets_and_dataloaders_py__KintsugiAudioDataset___getitem__ ==> kirad_datasets_and_dataloaders_py__get_window_starts
kirad_datasets_and_dataloaders_py__get_window_starts ==> kirad_dataset_utils_py__broadcast_collate
to_next(["▶ next, step 25: MultiTaskOrdinalRegressionPLModule.training_step()"])
class to_next edge
kirad_dataset_utils_py__broadcast_collate ==> to_next
click to_next "#stage-model"
kirad_dataset_utils_py__load_relative_dataset -.-> kirad_dataset_utils_py__load_dataset
kirad_datasets_and_dataloaders_py__KintsugiMetadata -.-> kirad_datasets_and_dataloaders_py__KintsugiMetadata_preprocess_metadata
kirad_datasets_and_dataloaders_py__KintsugiMetadata_preprocess_metadata -.->|"train only"| kirad_dataset_utils_py__merge_df_rows_by_subject
kirad_datasets_and_dataloaders_py__KintsugiMetadata_preprocess_metadata -.->|"count windows"| kirad_datasets_and_dataloaders_py__get_window_starts
kirad_datasets_and_dataloaders_py__KintsugiMetadata -.-> kirad_datasets_and_dataloaders_py__KintsugiMetadata_filter_metadata
kirad_datasets_and_dataloaders_py__UuidSampler -.->|"uuid"| kirad_datasets_and_dataloaders_py__KintsugiAudioDataset___getitem__
kirad_datasets_and_dataloaders_py__KintsugiAudioDataset___getitem__ -.->|"optional"| kirad_augmentations_py__RawBoost
kirad_datasets_and_dataloaders_py__KintsugiAudioDataset___getitem__ -.-> kirad_datasets_and_dataloaders_py__get_preprocessor_with_audio_normalization
kirad_datasets_and_dataloaders_py__get_preprocessor_with_audio_normalization -.->|"cut"| kirad_datasets_and_dataloaders_py__get_window_starts
kirad_datasets_and_dataloaders_py__KintsugiAudioDataset___getitem__ -.-> kirad_dataset_utils_py__broadcast_collate
kirad_datasets_and_dataloaders_py__KintsugiTextDataset___getitem__ -.-> kirad_dataset_utils_py__broadcast_collate
kirad_datasets_and_dataloaders_py__KintsugiMetadata___getitem__ -.->|"labels"| kirad_dataset_utils_py__broadcast_collate
kirad_dataset_utils_py__broadcast_collate -.->|"batch keys"| kirad_constants_py__DatasetFields
classDef main fill:#FFF4DC,stroke:#A67C1B,stroke-width:2px,color:#1A1A1A
classDef opt fill:#F3F4F6,stroke:#B8BEC7,color:#555,stroke-dasharray:4 3
classDef edge fill:#FFFFFF,stroke:#1F7A5C,color:#1F7A5C,stroke-width:1.5px
| Step |
Function |
File |
What it does |
| 15 |
KintsugiMetadata |
kirad/datasets_and_dataloaders.py:71 |
Metadata table indexed by UUID: loads CSV, merges KD scores, filters by duration. |
| 17 |
KintsugiMetadata.preprocess_metadata |
kirad/datasets_and_dataloaders.py:210 |
Join KD score targets, optionally merge rows per subject, count windows per recording. |
| 18 |
KintsugiMetadata.filter_metadata |
kirad/datasets_and_dataloaders.py:257 |
Subsample fraction of rows, then drop recordings outside min/max duration (s). |
| 21 |
KintsugiMetadata.__getitem__ |
kirad/datasets_and_dataloaders.py:293 |
Return {uuid, label: {task: {primary: raw score, kd: teacher score}}} for one UUID. |
| 22 |
KintsugiAudioDataset.__getitem__ |
kirad/datasets_and_dataloaders.py:439 |
Load, concatenate (channel 0), augment and window one recording's audio. |
| 19 |
get_preprocessor_with_audio_normalization |
kirad/datasets_and_dataloaders.py:790 |
Build the function audio [T] -> windows -> features used by KintsugiAudioDataset. |
| 23 |
get_window_starts |
kirad/datasets_and_dataloaders.py:738 |
Start sample(s) of the windows cut from one recording, by window_method. |
| — |
KintsugiTextDataset.__getitem__ |
kirad/datasets_and_dataloaders.py:572 |
Read the transcript JSON(s) of one recording and tokenize them. |
| — |
KintsugiCacheDataset |
kirad/datasets_and_dataloaders.py:628 |
Precomputed backbone features by UUID (DAM 3 teacher cache), optional dim slice. |
| 20 |
UuidSampler |
kirad/datasets_and_dataloaders.py:703 |
Yields metadata UUIDs (shuffled for train, sequential for val/test) for the loader. |
| 16 |
load_relative_dataset |
kirad/dataset_utils.py:97 |
Load metadata and add audio_filename / text_filename paths from the filename column. |
| — |
load_dataset |
kirad/dataset_utils.py:49 |
Return metadata as a DataFrame: pass-through, read a CSV path, or a Kintsugi version. |
| — |
merge_df_rows_by_subject |
kirad/dataset_utils.py:651 |
Merge rows sharing user + labels + demographics into one row per subject. |
| 24 |
broadcast_collate |
kirad/dataset_utils.py:830 |
DataLoader collate: concat windows of all recordings; length = windows per recording. |
| — |
RawBoost |
kirad/augmentations.py:166 |
RawBoost waveform augmentation (LnL/ISD/SSI noise); default algo 4 = all three. |
| — |
DatasetFields |
kirad/constants.py:154 |
Key names of a batch dict: uuid, features, label.<task>.primary/kd, length, loss. |