Source code for medkit.core.audio.annotation_container

from __future__ import annotations

__all__ = ["AudioAnnotationContainer"]

from medkit.core.annotation_container import AnnotationContainer
from medkit.core.audio.annotation import Segment


[docs] class AudioAnnotationContainer(AnnotationContainer[Segment]): """Manage a list of audio annotations belonging to an audio document. This behaves more or less like a list: calling `len()` and iterating are supported. Additional filtering is available through the `get()` method. Also provides handling of raw segment. """ def __init__(self, doc_id: str, raw_segment: Segment): super().__init__(doc_id=doc_id) # auto-generated RAW_AUDIO segment # not stored with other annotations but injected in calls to get() # and get_by_id() self.raw_segment = raw_segment
[docs] def add(self, ann: Segment): if ann.label == self.raw_segment.label: msg = f"Cannot add annotation with reserved label {self.raw_segment.label}" raise RuntimeError(msg) super().add(ann)
[docs] def get(self, *, label: str | None = None, key: str | None = None) -> list[Segment]: # inject raw segment if label == self.raw_segment.label and key is None: return [self.raw_segment] return super().get(label=label, key=key)
[docs] def get_by_id(self, uid) -> Segment: # inject raw segment if uid == self.raw_segment.uid: return self.raw_segment return super().get_by_id(uid)