Source code for medkit.core.audio.annotation_container
__all__ = ["AudioAnnotationContainer"]
from typing import List, Optional
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:
raise RuntimeError(
f"Cannot add annotation with reserved label {self.raw_segment.label}"
)
super().add(ann)
[docs] def get(
self, *, label: Optional[str] = None, key: Optional[str] = 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)