Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
from .models import * | |
from .utils import * | |
from .config import * | |
from .init import * | |
import gradio as gr | |
from pydub import AudioSegment | |
import random, os, threading, tempfile | |
from langdetect import detect | |
from .vote import log_text | |
def random_m(): | |
return random.sample(list(set(AVAILABLE_MODELS.keys())), 2) | |
def check_toxicity(text): | |
if not TOXICITY_CHECK: | |
return False | |
return toxicity.predict(text)['toxicity'] > 0.8 | |
def synthandreturn(text): | |
text = text.strip() | |
if len(text) > MAX_SAMPLE_TXT_LENGTH: | |
raise gr.Error(f'You exceeded the limit of {MAX_SAMPLE_TXT_LENGTH} characters') | |
if len(text) < MIN_SAMPLE_TXT_LENGTH: | |
raise gr.Error(f'Please input a text longer than {MIN_SAMPLE_TXT_LENGTH} characters') | |
if ( | |
# test toxicity if not prepared text | |
text not in sents | |
and check_toxicity(text) | |
): | |
print(f'Detected toxic content! "{text}"') | |
raise gr.Error('Your text failed the toxicity test') | |
if not text: | |
raise gr.Error(f'You did not enter any text') | |
# Check language | |
try: | |
if not detect(text) == "en": | |
gr.Warning('Warning: The input text may not be in English') | |
except: | |
pass | |
# Get two random models | |
mdl1, mdl2 = random.sample(list(AVAILABLE_MODELS.keys()), 2) | |
log_text(text) | |
print("[debug] Using", mdl1, mdl2) | |
def predict_and_update_result(text, model, result_storage): | |
try: | |
if model in AVAILABLE_MODELS: | |
result = router.predict(text, AVAILABLE_MODELS[model].lower(), api_name="/synthesize") | |
else: | |
result = router.predict(text, model.lower(), api_name="/synthesize") | |
except: | |
raise gr.Error('Unable to call API, please try again :)') | |
print('Done with', model) | |
# try: | |
# doresample(result) | |
# except: | |
# pass | |
try: | |
with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as f: | |
audio = AudioSegment.from_file(result) | |
current_sr = audio.frame_rate | |
if current_sr > 24000: | |
audio = audio.set_frame_rate(24000) | |
try: | |
print('Trying to normalize audio') | |
audio = match_target_amplitude(audio, -20) | |
except: | |
print('[WARN] Unable to normalize audio') | |
audio.export(f.name, format="wav") | |
os.unlink(result) | |
result = f.name | |
except: | |
pass | |
if model in AVAILABLE_MODELS.keys(): model = AVAILABLE_MODELS[model] | |
print(model) | |
print(f"Running model {model}") | |
result_storage[model] = result | |
# try: | |
# doloudnorm(result) | |
# except: | |
# pass | |
mdl1k = mdl1 | |
mdl2k = mdl2 | |
print(mdl1k, mdl2k) | |
if mdl1 in AVAILABLE_MODELS.keys(): mdl1k=AVAILABLE_MODELS[mdl1] | |
if mdl2 in AVAILABLE_MODELS.keys(): mdl2k=AVAILABLE_MODELS[mdl2] | |
results = {} | |
print(f"Sending models {mdl1k} and {mdl2k} to API") | |
thread1 = threading.Thread(target=predict_and_update_result, args=(text, mdl1k, results)) | |
thread2 = threading.Thread(target=predict_and_update_result, args=(text, mdl2k, results)) | |
thread1.start() | |
thread2.start() | |
thread1.join() | |
thread2.join() | |
#debug | |
# print(results) | |
# print(list(results.keys())[0]) | |
# y, sr = librosa.load(results[list(results.keys())[0]], sr=None) | |
# print(sr) | |
# print(list(results.keys())[1]) | |
# y, sr = librosa.load(results[list(results.keys())[1]], sr=None) | |
# print(sr) | |
#debug | |
# outputs = [text, btn, r2, model1, model2, aud1, aud2, abetter, bbetter, prevmodel1, prevmodel2, nxtroundbtn] | |
print(f"Retrieving models {mdl1k} and {mdl2k} from API") | |
return ( | |
text, | |
"Synthesize", | |
gr.update(visible=True), # r2 | |
mdl1, # model1 | |
mdl2, # model2 | |
gr.update(visible=True, value=results[mdl1k]), # aud1 | |
gr.update(visible=True, value=results[mdl2k]), # aud2 | |
gr.update(visible=True, interactive=False), #abetter | |
gr.update(visible=True, interactive=False), #bbetter | |
gr.update(visible=False), #prevmodel1 | |
gr.update(visible=False), #prevmodel2 | |
gr.update(visible=False), #nxt round btn | |
) | |
# Battle Mode | |
def synthandreturn_battle(text, mdl1, mdl2): | |
if mdl1 == mdl2: | |
raise gr.Error('You can\'t pick two of the same models.') | |
text = text.strip() | |
if len(text) > MAX_SAMPLE_TXT_LENGTH: | |
raise gr.Error(f'You exceeded the limit of {MAX_SAMPLE_TXT_LENGTH} characters') | |
if len(text) < MIN_SAMPLE_TXT_LENGTH: | |
raise gr.Error(f'Please input a text longer than {MIN_SAMPLE_TXT_LENGTH} characters') | |
if ( | |
# test toxicity if not prepared text | |
text not in sents | |
and check_toxicity(text) | |
): | |
print(f'Detected toxic content! "{text}"') | |
raise gr.Error('Your text failed the toxicity test') | |
if not text: | |
raise gr.Error(f'You did not enter any text') | |
# Check language | |
try: | |
if not detect(text) == "en": | |
gr.Warning('Warning: The input text may not be in English') | |
except: | |
pass | |
# Get two random models | |
log_text(text) | |
print("[debug] Using", mdl1, mdl2) | |
def predict_and_update_result(text, model, result_storage): | |
try: | |
if model in AVAILABLE_MODELS: | |
result = router.predict(text, AVAILABLE_MODELS[model].lower(), api_name="/synthesize") | |
else: | |
result = router.predict(text, model.lower(), api_name="/synthesize") | |
except: | |
raise gr.Error('Unable to call API, please try again :)') | |
print('Done with', model) | |
# try: | |
# doresample(result) | |
# except: | |
# pass | |
try: | |
with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as f: | |
audio = AudioSegment.from_file(result) | |
current_sr = audio.frame_rate | |
if current_sr > 24000: | |
audio = audio.set_frame_rate(24000) | |
try: | |
print('Trying to normalize audio') | |
audio = match_target_amplitude(audio, -20) | |
except: | |
print('[WARN] Unable to normalize audio') | |
audio.export(f.name, format="wav") | |
os.unlink(result) | |
result = f.name | |
except: | |
pass | |
if model in AVAILABLE_MODELS.keys(): model = AVAILABLE_MODELS[model] | |
print(model) | |
print(f"Running model {model}") | |
result_storage[model] = result | |
# try: | |
# doloudnorm(result) | |
# except: | |
# pass | |
mdl1k = mdl1 | |
mdl2k = mdl2 | |
print(mdl1k, mdl2k) | |
if mdl1 in AVAILABLE_MODELS.keys(): mdl1k=AVAILABLE_MODELS[mdl1] | |
if mdl2 in AVAILABLE_MODELS.keys(): mdl2k=AVAILABLE_MODELS[mdl2] | |
results = {} | |
print(f"Sending models {mdl1k} and {mdl2k} to API") | |
thread1 = threading.Thread(target=predict_and_update_result, args=(text, mdl1k, results)) | |
thread2 = threading.Thread(target=predict_and_update_result, args=(text, mdl2k, results)) | |
thread1.start() | |
thread2.start() | |
thread1.join() | |
thread2.join() | |
print(f"Retrieving models {mdl1k} and {mdl2k} from API") | |
return ( | |
text, | |
"Synthesize", | |
gr.update(visible=True), # r2 | |
mdl1, # model1 | |
mdl2, # model2 | |
gr.update(visible=True, value=results[mdl1k]), # aud1 | |
gr.update(visible=True, value=results[mdl2k]), # aud2 | |
gr.update(visible=True, interactive=False), #abetter | |
gr.update(visible=True, interactive=False), #bbetter | |
gr.update(visible=False), #prevmodel1 | |
gr.update(visible=False), #prevmodel2 | |
gr.update(visible=False), #nxt round btn | |
) | |
# Unlock vote | |
def unlock_vote(btn_index, aplayed, bplayed): | |
# sample played | |
if btn_index == 0: | |
aplayed = gr.State(value=True) | |
if btn_index == 1: | |
bplayed = gr.State(value=True) | |
# both audio samples played | |
if bool(aplayed) and bool(bplayed): | |
print('Both audio samples played, voting unlocked') | |
return [gr.update(interactive=True), gr.update(interactive=True), gr.update(), gr.update()] | |
return [gr.update(), gr.update(), aplayed, bplayed] | |
def randomsent(): | |
return random.choice(sents), '🎲' | |
def randomsent_battle(): | |
return tuple(randomsent()) + tuple(random_m()) | |
def clear_stuff(): | |
return "", "Synthesize", gr.update(visible=False), '', '', gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False) |