Spaces:
Running
Running
# cloud_server_audio_loader.py | |
import io | |
import requests | |
import numpy as np | |
from pydub import AudioSegment | |
class CloudServerAudioLoader: | |
def __init__(self, base_url: str) -> None: | |
if not base_url.endswith("/"): | |
base_url += "/" | |
self.base_url = base_url | |
def _download_to_buf(self, filename: str) -> io.BytesIO: | |
url = self.base_url + filename | |
print("url:", url) # Debugging line to check the URL | |
resp = requests.get(url, stream=True) | |
if resp.status_code != 200: | |
raise FileNotFoundError(f"'{filename}' not found. HTTP {resp.status_code}") | |
buf = io.BytesIO(resp.content) | |
buf.seek(0) | |
return buf | |
def load_audio(self, filename: str) -> tuple[int, np.ndarray]: | |
buf = self._download_to_buf(filename) | |
seg = AudioSegment.from_file(buf) | |
samples = np.array(seg.get_array_of_samples()) | |
if seg.channels > 1: | |
samples = samples.reshape(-1, seg.channels) | |
if np.issubdtype(samples.dtype, np.integer): | |
max_int = np.iinfo(samples.dtype).max | |
samples = samples.astype(np.float32) | |
samples /= max_int | |
else: | |
max_val = np.abs(samples).max() | |
if max_val > 1: | |
samples = samples / max_val | |
samples = samples.astype(np.float32) | |
# -------------------------------------------------------- | |
return seg.frame_rate, samples |