|
import ffmpeg |
|
import numpy as np |
|
|
|
|
|
|
|
import os |
|
import sys |
|
|
|
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 ( |
|
lambda DoFormant: True |
|
if DoFormant.lower() == "true" |
|
else (False if DoFormant.lower() == "false" else DoFormant) |
|
)(DoFormant): |
|
numerator = round(random.uniform(1, 4), 4) |
|
|
|
|
|
|
|
if not file.endswith(".wav"): |
|
if not os.path.isfile(f"{file_formanted}.wav"): |
|
converted = True |
|
|
|
|
|
converting = ( |
|
ffmpeg.input(file_formanted, threads=0) |
|
.output(f"{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") |
|
|
|
os.system( |
|
'%s -i "%s" -q "%s" -t "%s" -o "%sFORMANTED_%s.wav"' |
|
% ( |
|
stft, |
|
file_formanted, |
|
Quefrency, |
|
Timbre, |
|
file_formanted, |
|
str(numerator), |
|
) |
|
) |
|
|
|
print(f" · Formanted {file_formanted}!\n") |
|
|
|
|
|
|
|
|
|
|
|
out, _ = ( |
|
ffmpeg.input( |
|
"%sFORMANTED_%s.wav" % (file_formanted, str(numerator)), 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("%sFORMANTED_%s.wav" % (file_formanted, str(numerator))) |
|
except Exception: |
|
pass |
|
print("couldn't remove formanted type of file") |
|
|
|
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: |
|
pass |
|
print("couldn't remove converted type of file") |
|
converted = False |
|
|
|
return np.frombuffer(out, np.float32).flatten() |
|
|