Coverage for src/blob_dict/blob/audio.py: 0%
21 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-03-29 08:37 -0700
« prev ^ index » next coverage.py v7.7.1, created at 2025-03-29 08:37 -0700
1from __future__ import annotations
3from io import BytesIO
4from typing import NamedTuple, override
6import numpy
7import soundfile
9from . import BytesBlob
12class AudioData(NamedTuple):
13 data: numpy.ndarray
14 sample_rate: int
17class AudioBlob(BytesBlob):
18 def __init__(self, blob: bytes | AudioData) -> None:
19 if isinstance(blob, AudioData):
20 bio = BytesIO()
21 soundfile.write(bio, AudioData.data, AudioData.sample_rate)
22 blob = bio.getvalue()
24 super().__init__(blob)
26 def as_audio(self) -> AudioData:
27 return AudioData(*soundfile.read(BytesIO(self._blob_bytes)))
29 @override
30 def __repr__(self) -> str:
31 return f"{self.__class__.__name__}(...)"