| import base64 |
| import io |
| from typing import Generator |
|
|
| import numpy as np |
| import soundfile as sf |
|
|
| from modules.api import utils as api_utils |
| from modules.api.impl.model.audio_model import AudioFormat |
|
|
|
|
| class AudioHandler: |
| def enqueue(self) -> tuple[np.ndarray, int]: |
| raise NotImplementedError("Method 'enqueue' must be implemented by subclass") |
|
|
| def enqueue_stream(self) -> Generator[tuple[np.ndarray, int], None, None]: |
| raise NotImplementedError( |
| "Method 'enqueue_stream' must be implemented by subclass" |
| ) |
|
|
| def enqueue_to_stream(self, format: AudioFormat) -> Generator[bytes, None, None]: |
| for audio_data, sample_rate in self.enqueue_stream(): |
| buffer = io.BytesIO() |
| sf.write(buffer, audio_data, sample_rate, format="wav") |
| buffer.seek(0) |
|
|
| if format == AudioFormat.mp3: |
| buffer = api_utils.wav_to_mp3(buffer) |
|
|
| binary = buffer.read() |
| yield binary |
|
|
| def enqueue_to_buffer(self, format: AudioFormat) -> io.BytesIO: |
| audio_data, sample_rate = self.enqueue() |
|
|
| buffer = io.BytesIO() |
| sf.write(buffer, audio_data, sample_rate, format="wav") |
| buffer.seek(0) |
|
|
| if format == AudioFormat.mp3: |
| buffer = api_utils.wav_to_mp3(buffer) |
|
|
| return buffer |
|
|
| def enqueue_to_bytes(self, format: AudioFormat) -> bytes: |
| buffer = self.enqueue_to_buffer(format=format) |
| binary = buffer.read() |
| return binary |
|
|
| def enqueue_to_base64(self, format: AudioFormat) -> str: |
| binary = self.enqueue_to_bytes(format=format) |
|
|
| base64_encoded = base64.b64encode(binary) |
| base64_string = base64_encoded.decode("utf-8") |
|
|
| return base64_string |
|
|