easyGUI / infer /lib /audio.py
Blane187's picture
Update infer/lib/audio.py
64490ae verified
Raw
History Blame Contribute Delete
1.86 kB
import platform
import os
import ffmpeg
import numpy as np
import av
import traceback
from io import BytesIO
def wav2(i, o, format):
inp = av.open(i, "rb")
if format == "m4a":
format = "mp4"
out = av.open(o, "wb", format=format)
if format == "ogg":
format = "libvorbis"
elif format == "mp4":
format = "aac"
ostream = out.add_stream(format)
for frame in inp.decode(audio=0):
for p in ostream.encode(frame):
out.mux(p)
for p in ostream.encode(None):
out.mux(p)
out.close()
inp.close()
def load_audio(file, sr):
try:
# Clean the file path
file = clean_path(file)
if not os.path.exists(file):
raise RuntimeError(
"You input a wrong audio path that does not exist, please fix it!"
)
out, _ = (
ffmpeg.input(file, threads=0)
.output("-", format="f32le", acodec="pcm_f32le", ac=1, ar=sr)
.run(cmd=["ffmpeg", "-nostdin"], capture_stdout=True, capture_stderr=True)
)
except Exception as e:
traceback.print_exc()
raise RuntimeError(f"Failed to load audio: {e}")
audio_data = np.frombuffer(out, np.float32).flatten()
# Ensure the function always returns a numpy array, even if it's empty
if audio_data is None or len(audio_data) == 0:
raise RuntimeError("Failed to load audio: no data returned.")
return audio_data
def clean_path(path_str):
if platform.system() == "Windows":
path_str = path_str.replace("/", "\\")
return path_str.strip().strip('"').strip("\n").strip('"').strip()
# Example usage
if __name__ == "__main__":
try:
audio_data = load_audio("example.wav", 16000)
print("Audio data loaded successfully")
except RuntimeError as e:
print(e)