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