Coverage for src/blob_dict/blob/audio.py: 0%

25 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-04-09 03:05 -0700

1from __future__ import annotations 

2 

3from io import BytesIO 

4from typing import NamedTuple, override 

5 

6import numpy 

7import soundfile 

8 

9from . import BytesBlob 

10 

11 

12class AudioData(NamedTuple): 

13 data: numpy.ndarray 

14 sample_rate: int 

15 

16 

17class AudioBlob(BytesBlob): 

18 __IN_MEMORY_FILE_NAME: str = "file.mp3" 

19 

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() 

26 

27 super().__init__(blob) 

28 

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)) 

33 

34 @override 

35 def __repr__(self) -> str: 

36 return f"{self.__class__.__name__}(...)"