Coverage for src/blob_dict/blob/audio.py: 0%
25 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-03-31 18:44 -0700
« prev ^ index » next coverage.py v7.7.1, created at 2025-03-31 18:44 -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 __IN_MEMORY_FILE_NAME: str = "file.mp3"
20 def __init__(self, blob: bytes | AudioData) -> None:
21 if isinstance(blob, AudioData):
22 bio = BytesIO()
23 bio.name = AudioBlob.__IN_MEMORY_FILE_NAME
24 soundfile.write(bio, AudioData.data, AudioData.sample_rate)
25 blob = bio.getvalue()
27 super().__init__(blob)
29 def as_audio(self) -> AudioData:
30 bio = BytesIO(self._blob_bytes)
31 bio.name = AudioBlob.__IN_MEMORY_FILE_NAME
32 return AudioData(*soundfile.read(bio))
34 @override
35 def __repr__(self) -> str:
36 return f"{self.__class__.__name__}(...)"