Files
Mangio-RVC-Fork/my_utils.py
2023-07-30 16:00:56 +07:00

111 lines
4.2 KiB
Python

import ffmpeg
import numpy as np
import os
import sys
from shlex import quote as RQuote
import random
import csv
platform_stft_mapping = {
'linux': 'stftpitchshift',
'darwin': 'stftpitchshift',
'win32': 'stftpitchshift.exe',
}
stft = platform_stft_mapping.get(sys.platform)
def CSVutil(file, rw, type, *args):
if type == 'formanting':
if rw == 'r':
with open(file) as fileCSVread:
csv_reader = list(csv.reader(fileCSVread))
return (
csv_reader[0][0], csv_reader[0][1], csv_reader[0][2]
) if csv_reader is not None else (lambda: exec('raise ValueError("No data")'))()
else:
if args:
doformnt = args[0]
else:
doformnt = False
qfr = args[1] if len(args) > 1 else 1.0
tmb = args[2] if len(args) > 2 else 1.0
with open(file, rw, newline='') as fileCSVwrite:
csv_writer = csv.writer(fileCSVwrite, delimiter=',')
csv_writer.writerow([doformnt, qfr, tmb])
elif type == 'stop':
stop = args[0] if args else False
with open(file, rw, newline='') as fileCSVwrite:
csv_writer = csv.writer(fileCSVwrite, delimiter=',')
csv_writer.writerow([stop])
def load_audio(file, sr, DoFormant, Quefrency, Timbre):
converted = False
DoFormant, Quefrency, Timbre = CSVutil('csvdb/formanting.csv', 'r', 'formanting')
try:
file = (
file.strip(" ").strip('"').strip("\n").strip('"').strip(" ")
)
file_formanted = file.strip(" ").strip('"').strip("\n").strip('"').strip(" ")
if (DoFormant.lower() == 'true'):
numerator = round(random.uniform(1,4), 4)
if not file.endswith(".wav"):
if not os.path.isfile(f"{file_formanted}.wav"):
converted = True
#print(f"\nfile = {file}\n")
#print(f"\nfile_formanted = {file_formanted}\n")
converting = (
ffmpeg.input(file_formanted, threads = 0)
.output(f"{RQuote(file_formanted)}.wav")
.run(
cmd=["ffmpeg", "-nostdin"], capture_stdout=True, capture_stderr=True
)
)
else:
pass
file_formanted = f"{file_formanted}.wav" if not file_formanted.endswith(".wav") else file_formanted
print(f" · Formanting {file_formanted}...\n")
command = (
f'{RQuote(stft)} -i "{RQuote(file_formanted)}" -q "{RQuote(Quefrency)}" '
f'-t "{RQuote(Timbre)}" -o "{RQuote(file_formanted)}FORMANTED_{RQuote(str(numerator))}.wav"'
)
os.system(command)
print(f" · Formanted {file_formanted}!\n")
out, _ = (
ffmpeg.input(f"{file_formanted}FORMANTED_{str(numerator)}.wav", threads=0)
.output("-", format="f32le", acodec="pcm_f32le", ac=1, ar=sr)
.run(
cmd=["ffmpeg", "-nostdin"], capture_stdout=True, capture_stderr=True
)
)
try: os.remove(f"{file_formanted}FORMANTED_{str(numerator)}.wav")
except Exception as e: pass; print(f"couldn't remove formanted type of file due to {e}")
else:
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:
raise RuntimeError(f"Failed to load audio: {e}")
if converted:
try: os.remove(file_formanted)
except Exception as e: pass; print(f"Couldn't remove converted type of file due to {e}")
converted = False
return np.frombuffer(out, np.float32).flatten()