| import requests |
| import os |
| import ffmpeg |
| import numpy as np |
| import random |
| import shutil |
| import torchaudio |
| from pydub import AudioSegment |
| import tempfile |
|
|
| class Audio: |
|
|
| audio_path = "./audios" |
|
|
| def __init__(self, name, url): |
| self._name = name |
| self._url = url |
|
|
| if not os.path.exists(Audio.audio_path): |
| os.mkdir(Audio.audio_path) |
|
|
| @property |
| def name(self): |
| return self._name |
|
|
| @name.setter |
| def name(self, name): |
| self._name = name |
|
|
| @property |
| def url(self): |
| return self._url |
|
|
| @url.setter |
| def url(self, url): |
| self._url = url |
|
|
| def __str__(self): |
| return f'Audio: {self._name} {self._url}' |
|
|
| @classmethod |
| def load_audio(cls, file, sr): |
| try: |
| file = file.strip(' "\n') |
| |
| if not file.endswith(".wav"): |
| file_formanted = f"{file}.wav" |
| if not os.path.isfile(file_formanted): |
| ( |
| ffmpeg.input(file) |
| .output(file_formanted, format="wav") |
| .run(cmd=["ffmpeg", "-nostdin"], capture_stdout=True, capture_stderr=True) |
| ) |
| else: |
| file_formanted = file |
|
|
| |
| out, _ = ( |
| ffmpeg.input(file_formanted) |
| .output("-", format="f32le", acodec="pcm_f32le", ac=1, ar=sr) |
| .run(cmd=["ffmpeg", "-nostdin"], capture_stdout=True, capture_stderr=True) |
| ) |
|
|
| |
| os.remove(file_formanted) |
| except Exception as e: |
| raise RuntimeError(f"Failed to load audio: {e}") |
|
|
| return np.frombuffer(out, np.float32).flatten() |
|
|
| @classmethod |
| def dowload_from_url(self, url = None, output = "./audios/file.wav"): |
| """ |
| Descarga un aduio desde una url |
| Args: |
| path: Folder where the audio will be downloaded |
| Returns: |
| return: the path of the downloaded audio |
| """ |
| request = requests.get(url, allow_redirects=True) |
| open(output, 'wb').write(request.content) |
|
|
| return output |
|
|
|
|
| def delete_files(paths): |
| for path in paths: |
| if os.path.exists(path): |
| if os.path.isdir(path): |
| shutil.rmtree(path, ignore_errors=True) |
| if os.path.isfile(path): |
| os.remove(path) |