| """Data model. FROZEN — do not modify in the autoresearch loop.""" | |
| from dataclasses import dataclass, field | |
| from typing import List | |
| class Option: | |
| letter: str # 'A' | 'B' | 'C' | |
| wav: str # absolute path to the 24 kHz candidate | |
| feats: dict = field(default_factory=dict) | |
| class Question: | |
| subset: str # 'gigaspeech' | 'meld' | 'emovdb' | |
| qid: str # e.g. 'meld_183_2' | |
| group: str # e.g. 'meld_183' | |
| utterance_text: str # transcript (given) — context only, never a match target | |
| utterance_wav: str # the anchor: speaker emotion is read from here | |
| context: str | |
| reference: str # intended response TEXT (given) — context only | |
| options: List[Option] | |
| def is_tone_variant(self) -> bool: | |
| return self.subset == "emovdb" | |
| class TrainItem: | |
| """One labelled (utterance, good, bad) triple from the training set.""" | |
| dialogue_id: str # group for CV (e.g. 'hit_10040_conv_20080') | |
| subset: str # 'multi_context' | 'multi_emotion' | |
| variant: str # context index '1'/'2' or emotion name | |
| utterance_wav: str | |
| good_wav: str | |
| bad_wav: str | |
| context: str | |
| reference: str | |
| emotion: str # the labelled speaker emotion (when known) | |