Files
Mangio-RVC-Fork/my_utils.py

152 lines
5.6 KiB
Python
Raw Normal View History

import ffmpeg
import numpy as np
2023-07-23 03:47:53 +00:00
# import praatio
# import praatio.praat_scripts
2023-07-21 20:36:54 +07:00
import os
2023-07-27 11:04:45 +07:00
import sys
import random
2023-07-29 00:23:52 +07:00
import csv
2023-07-27 11:04:45 +07:00
platform_stft_mapping = {
2023-07-28 23:45:47 +00:00
"linux": "stftpitchshift",
"darwin": "stftpitchshift",
"win32": "stftpitchshift.exe",
2023-07-27 11:04:45 +07:00
}
2023-07-27 11:04:45 +07:00
stft = platform_stft_mapping.get(sys.platform)
2023-07-23 03:47:53 +00:00
# praatEXE = join('.',os.path.abspath(os.getcwd()) + r"\Praat.exe")
2023-07-28 23:45:47 +00:00
2023-07-29 00:23:52 +07:00
def CSVutil(file, rw, type, *args):
2023-07-28 23:45:47 +00:00
if type == "formanting":
if rw == "r":
2023-07-29 00:23:52 +07:00
with open(file) as fileCSVread:
csv_reader = list(csv.reader(fileCSVread))
return (
2023-07-28 23:45:47 +00:00
(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")'))()
)
2023-07-29 00:23:52 +07:00
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
2023-07-28 23:45:47 +00:00
with open(file, rw, newline="") as fileCSVwrite:
csv_writer = csv.writer(fileCSVwrite, delimiter=",")
2023-07-29 00:23:52 +07:00
csv_writer.writerow([doformnt, qfr, tmb])
2023-07-28 23:45:47 +00:00
elif type == "stop":
2023-07-29 00:23:52 +07:00
stop = args[0] if args else False
2023-07-28 23:45:47 +00:00
with open(file, rw, newline="") as fileCSVwrite:
csv_writer = csv.writer(fileCSVwrite, delimiter=",")
2023-07-29 00:23:52 +07:00
csv_writer.writerow([stop])
2023-07-28 23:45:47 +00:00
2023-07-21 20:36:54 +07:00
def load_audio(file, sr, DoFormant, Quefrency, Timbre):
2023-07-26 23:01:10 +07:00
converted = False
2023-07-28 23:45:47 +00:00
DoFormant, Quefrency, Timbre = CSVutil("csvdb/formanting.csv", "r", "formanting")
2023-03-31 17:54:38 +08:00
try:
# https://github.com/openai/whisper/blob/main/whisper/audio.py#L26
# This launches a subprocess to decode audio while down-mixing and resampling as necessary.
# Requires the ffmpeg CLI and `ffmpeg-python` package to be installed.
file = (
file.strip(" ").strip('"').strip("\n").strip('"').strip(" ")
) # 防止小白拷路径头尾带了空格和"和回车
2023-07-23 03:47:53 +00:00
file_formanted = file.strip(" ").strip('"').strip("\n").strip('"').strip(" ")
2023-07-28 23:45:47 +00:00
# print(f"dofor={bool(DoFormant)} timbr={Timbre} quef={Quefrency}\n")
if (
lambda DoFormant: True
if DoFormant.lower() == "true"
else (False if DoFormant.lower() == "false" else DoFormant)
)(DoFormant):
numerator = round(random.uniform(1, 4), 4)
2023-07-23 03:47:53 +00:00
# os.system(f"stftpitchshift -i {file} -q {Quefrency} -t {Timbre} -o {file_formanted}")
# print('stftpitchshift -i "%s" -p 1.0 --rms -w 128 -v 8 -q %s -t %s -o "%s"' % (file, Quefrency, Timbre, file_formanted))
2023-07-28 23:45:47 +00:00
if not file.endswith(".wav"):
if not os.path.isfile(f"{file_formanted}.wav"):
2023-07-26 23:01:10 +07:00
converted = True
2023-07-28 23:45:47 +00:00
# print(f"\nfile = {file}\n")
# print(f"\nfile_formanted = {file_formanted}\n")
converting = (
2023-07-28 23:45:47 +00:00
ffmpeg.input(file_formanted, threads=0)
.output(f"{file_formanted}.wav")
.run(
2023-07-28 23:45:47 +00:00
cmd=["ffmpeg", "-nostdin"],
capture_stdout=True,
capture_stderr=True,
)
)
else:
pass
2023-07-28 23:45:47 +00:00
file_formanted = (
f"{file_formanted}.wav"
if not file_formanted.endswith(".wav")
else file_formanted
)
print(f" · Formanting {file_formanted}...\n")
2023-07-28 23:45:47 +00:00
2023-07-23 03:47:53 +00:00
os.system(
2023-07-27 11:04:45 +07:00
'%s -i "%s" -q "%s" -t "%s" -o "%sFORMANTED_%s.wav"'
2023-07-28 23:45:47 +00:00
% (
stft,
file_formanted,
Quefrency,
Timbre,
file_formanted,
str(numerator),
)
2023-07-23 03:47:53 +00:00
)
2023-07-28 23:45:47 +00:00
print(f" · Formanted {file_formanted}!\n")
2023-07-28 23:45:47 +00:00
2023-07-23 03:47:53 +00:00
# filepraat = (os.path.abspath(os.getcwd()) + '\\' + file).replace('/','\\')
# file_formantedpraat = ('"' + os.path.abspath(os.getcwd()) + '/' + 'formanted'.join(file_formanted) + '"').replace('/','\\')
2023-07-28 23:45:47 +00:00
# print("%sFORMANTED_%s.wav" % (file_formanted, str(numerator)))
2023-07-21 20:36:54 +07:00
out, _ = (
2023-07-28 23:45:47 +00:00
ffmpeg.input(
"%sFORMANTED_%s.wav" % (file_formanted, str(numerator)), threads=0
)
2023-07-21 20:36:54 +07:00
.output("-", format="f32le", acodec="pcm_f32le", ac=1, ar=sr)
2023-07-23 03:47:53 +00:00
.run(
cmd=["ffmpeg", "-nostdin"], capture_stdout=True, capture_stderr=True
)
2023-07-21 20:36:54 +07:00
)
2023-07-23 03:47:53 +00:00
2023-07-28 23:45:47 +00:00
try:
os.remove("%sFORMANTED_%s.wav" % (file_formanted, str(numerator)))
except Exception:
pass
print("couldn't remove formanted type of file")
2023-07-21 20:36:54 +07:00
else:
out, _ = (
ffmpeg.input(file, threads=0)
.output("-", format="f32le", acodec="pcm_f32le", ac=1, ar=sr)
2023-07-23 03:47:53 +00:00
.run(
cmd=["ffmpeg", "-nostdin"], capture_stdout=True, capture_stderr=True
)
2023-07-21 20:36:54 +07:00
)
except Exception as e:
raise RuntimeError(f"Failed to load audio: {e}")
2023-07-28 23:45:47 +00:00
2023-07-26 23:01:10 +07:00
if converted:
2023-07-28 23:45:47 +00:00
try:
os.remove(file_formanted)
except Exception:
pass
print("couldn't remove converted type of file")
2023-07-26 23:01:10 +07:00
converted = False
2023-07-28 23:45:47 +00:00
return np.frombuffer(out, np.float32).flatten()