Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
import os | |
from os.path import abspath, dirname | |
import configparser | |
import logging | |
import os | |
import sys | |
isDev = setupData["isDev"] | |
logger = setupData["logger"] | |
import sys | |
root_path = f'.' if isDev else f'./resources/app' # The root directories are different in dev/prod | |
if not isDev: | |
sys.path.append("./resources/app") | |
# import DeepMoji/TorchMoji | |
sys.path.append(f"{root_path}/plugins/deepmoji_plugin/DeepMoji") | |
# TOP # emoticons out of 64 to take into account | |
emoji_count = 10 | |
text_scores = [] | |
# the plugin's default settings | |
plugin_settings = {} | |
isBatch = False | |
isXVAPitch = True | |
isEnglish = True | |
# previous sentence | |
prev_sentence = '' | |
# Previous emotional modifier values | |
last_em_angry = float(0) | |
last_em_happy = float(0) | |
last_em_sad = float(0) | |
last_em_surprise = float(0) | |
def scoreText(text): | |
return text | |
from plugins.deepmoji_plugin.xvasynth_torchmoji import scoreText | |
import csv | |
def setup(data=None): | |
logger.log(f'Setting up plugin. App version: {data["appVersion"]} | CPU only: {data["isCPUonly"]} | Development mode: {data["isDev"]}') | |
# Show test emoji in console; can crash due to encoding issues | |
try: | |
print("DeepMoji Plugin - emoji smily console print test: \U0001F604") | |
except: | |
pass | |
def pre_load_model(data=None): | |
# reset last em values | |
global last_em_angry, last_em_happy, last_em_sad, last_em_surprise,\ | |
isBatch, isXVAPitch, isEnglish, prev_sentence,\ | |
plugin_settings, configparser, emoji_count | |
# reload settings from INI | |
config = configparser.ConfigParser() | |
with open(f'{root_path}/plugins/deepmoji_plugin/deepmoji.ini', encoding='utf-8') as stream: | |
# xVASynth saves without INI sections | |
config.read_string("[top]\n" + stream.read()) | |
plugin_settings = dict(config['top']) | |
emoji_count = int(plugin_settings['emoji_count']) | |
isBatch = False | |
isXVAPitch = True | |
isEnglish = True | |
prev_sentence = '' | |
last_em_angry = float(0) | |
last_em_happy = float(0) | |
last_em_sad = float(0) | |
last_em_surprise = float(0) | |
logger.log("last_em reset") | |
def fetch_text(data=None): | |
global plugin_settings, emoji_count, text_scores, scoreText, isXVAPitch, isEnglish, prev_sentence | |
isBatch = False | |
text_scores = [data["sequence"]] | |
try: | |
# editor second generation test | |
if len(data["pitch"]): | |
logger.warning("DeepMoji analysis skipped due to customized editor values") | |
return | |
except: | |
pass | |
if ( | |
( | |
plugin_settings["load_deepmoji_model"]=="false" | |
or plugin_settings["load_deepmoji_model"]==False | |
) | |
and data["pluginsContext"]["mantella_settings"]["run_model"]==False | |
): | |
logger.log("DeepMoji model skipped") | |
return | |
if (data['modelType'] != 'xVAPitch'): | |
logger.log("DeepMoji can affect only xVAPitch models") | |
isXVAPitch = False | |
return | |
if (data['base_lang'] != 'en'): | |
logger.log("DeepMoji works only with English text") | |
isEnglish = False | |
return | |
if ( | |
plugin_settings["append_prev_sentence"]=="false" | |
or plugin_settings["append_prev_sentence"]==False | |
): | |
prev_sentence = '' | |
else: | |
prev_sentence += ' ' | |
# add previous sentence for a better flow | |
text_scores = scoreText(prev_sentence + data["sequence"], emoji_count) | |
logger.log(text_scores) | |
text_scores[0] = data["sequence"] | |
def fetch_text_batch(data=None): | |
global isBatch, plugin_settings, emoji_count, text_scores, scoreText, isXVAPitch, isEnglish, prev_sentence | |
isBatch = True | |
text_scores = [data["linesBatch"][0][0]] | |
if ( | |
plugin_settings["use_on_batch"]=="false" | |
or plugin_settings["use_on_batch"]==False | |
): | |
logger.debug("DeepMoji Plugin skipped on batch") | |
return | |
if ( | |
plugin_settings["load_deepmoji_model"]=="false" | |
or plugin_settings["load_deepmoji_model"]==False | |
): | |
logger.debug("DeepMoji model skipped") | |
return | |
if (data['modelType'] != 'xVAPitch'): | |
logger.debug("DeepMoji can affect only xVAPitch models") | |
isXVAPitch = False | |
return | |
if (data["linesBatch"][0][8] != 'en'): | |
logger.debug("DeepMoji works only with English text") | |
return | |
if ( | |
plugin_settings["append_prev_sentence"]=="false" | |
or plugin_settings["append_prev_sentence"]==False | |
): | |
prev_sentence = '' | |
else: | |
prev_sentence += ' ' | |
# logger.info(data) | |
try: | |
logger.debug(data["linesBatch"][0][0]) | |
text_scores = scoreText(prev_sentence + data["linesBatch"][0][0], emoji_count) | |
logger.debug(text_scores) | |
except: | |
logger.error("Could not parse line") | |
return | |
# text_scores | |
# (['Text', 'Top#%', | |
# 'Emoji_1', 'Emoji_2', 'Emoji_3', 'Emoji_4', 'Emoji_5', | |
# 'Pct_1', 'Pct_2', 'Pct_3', 'Pct_4', 'Pct_5']) | |
def adjust_values(data=None): | |
global root_path, os, csv, example_helper,\ | |
isBatch, isXVAPitch, isEnglish, logger, emoji_count, text_scores, plugin_settings,\ | |
prev_sentence, last_em_angry, last_em_happy, last_em_sad, last_em_surprise | |
if ( | |
isBatch | |
and ( | |
plugin_settings["use_on_batch"] == "false" | |
or plugin_settings["use_on_batch"] == False | |
) | |
): | |
logger.debug("DeepMoji Plugin skipped on batch") | |
return | |
if (isXVAPitch == False): | |
logger.log("DeepMoji can affect only xVAPitch models") | |
return | |
em_angry = float(0) | |
em_happy = float(0) | |
em_sad = float(0) | |
em_surprise = float(0) | |
emojis = '' | |
if ( | |
isXVAPitch | |
and isEnglish | |
and len(text_scores) > 1 | |
): | |
# DeepMoji works only with English text | |
with open(f'{root_path}/plugins/deepmoji_plugin/emoji_unicode_emotions.csv', encoding='utf-8') as csvfile: | |
reader = csv.DictReader(csvfile) | |
index = 0 | |
for emoji_row in reader: | |
for em_index in range(emoji_count): | |
# emotion is not one of detected emotions? | |
if (index != text_scores[2 + em_index]): | |
# skip | |
continue | |
em_angry += float(emoji_row['anger']) * float(text_scores[2 + em_index + emoji_count]) | |
em_happy += float(emoji_row['happiness']) * float(text_scores[2 + em_index + emoji_count]) | |
em_sad += float(emoji_row['sadness']) * float(text_scores[2 + em_index + emoji_count]) | |
em_surprise += float(emoji_row['surprise']) * float(text_scores[2 + em_index + emoji_count]) | |
emojis += emoji_row['emoji']+' ' | |
index += 1 | |
# Show Top emojis in console | |
try: | |
# can crash on batch | |
print(emojis) | |
except: | |
pass | |
em_emotion_max = 0.8 | |
em_angry_max = 0.6 | |
try: | |
em_angry += float(data["pluginsContext"]["mantella_settings"]["emAngry"]) * 100 | |
em_angry_max = 1 | |
except: | |
pass | |
try: | |
em_happy += float(data["pluginsContext"]["mantella_settings"]["emHappy"]) * 100 | |
except: | |
pass | |
try: | |
em_sad += float(data["pluginsContext"]["mantella_settings"]["emSad"]) * 100 | |
except: | |
pass | |
try: | |
em_surprise += float(data["pluginsContext"]["mantella_settings"]["emSurprise"]) * 100 | |
except: | |
pass | |
# HF | |
if (len(text_scores) > 1): | |
# top_em highest wins all | |
top_em = max( | |
em_angry, | |
em_happy, | |
em_sad | |
) | |
em_angry = em_angry if (em_angry == top_em) else 0 | |
em_happy = em_happy if (em_happy == top_em) else 0 | |
# amplified sadness ratio | |
em_sad = (em_sad * 3) if (em_sad == top_em) else 0 | |
# amplifier | |
ratio = float(plugin_settings['amplifier_ratio']) | |
else: | |
ratio = 1.0 | |
em_emotion_max = 1 | |
em_angry_max = 1 | |
logger.log(f'Amplifier ratio: {ratio}') | |
hasExcMark = False | |
if ('!!!' in text_scores[0]): | |
ratio += 2 | |
em_angry_max = max(em_angry_max, 0.92) | |
logger.log(f"!!! detected => em_angry_max: {em_angry_max}") | |
logger.log(f'!!! Ratio: {ratio}') | |
hasExcMark = True | |
elif ( | |
('!!' in text_scores[0]) | |
or ('!?!' in text_scores[0]) | |
): | |
ratio += 1.5 | |
em_angry_max = max(em_angry_max, 0.82) | |
logger.log(f"!! detected => em_angry_max: {em_angry_max}") | |
logger.log(f'!! Ratio: {ratio}') | |
hasExcMark = True | |
elif ('!' in text_scores[0]): | |
ratio += 1 | |
em_angry_max = max(em_angry_max, 0.7) | |
logger.log(f"! detected => em_angry_max: {em_angry_max}") | |
logger.log(f'! Ratio: {ratio}') | |
hasExcMark = True | |
# HF | |
if (len(text_scores) <= 1): | |
em_angry_max = 1 | |
ratio = 1 | |
# final values | |
em_angry = min(em_angry_max, em_angry / 100 * ratio) if em_angry > 0 else 0 | |
em_happy = min(em_emotion_max, em_happy / 100 * ratio) if em_happy > 0 else 0 | |
em_sad = min(em_emotion_max, em_sad / 100 * ratio) if em_sad > 0 else 0 | |
em_surprise = min(em_emotion_max, em_surprise / 100 * ratio) if em_surprise > 0 else 0 | |
# do average of previous if above threshold and last_em is not higher | |
last_top_em = max(last_em_angry, last_em_happy, last_em_sad) | |
if ( | |
(em_angry > 0) | |
and (last_top_em > 0.1) | |
and (last_top_em < em_angry) | |
): | |
logger.log(f"em_angry before avg: {em_angry}") | |
em_angry = (em_angry + last_top_em) / 2 | |
if ( | |
(em_happy > 0) | |
and (last_top_em > 0.1) | |
and (last_top_em < em_happy) | |
): | |
logger.log(f"em_happy before avg: {em_happy}") | |
em_happy = (em_happy + last_top_em) / 2 | |
if ( | |
(em_sad > 0) | |
and (last_top_em > 0.1) | |
and (last_top_em < em_sad) | |
): | |
logger.log(f"em_sad before avg: {em_sad}") | |
em_sad = (em_sad + last_top_em) / 2 | |
if ( | |
(em_surprise > 0) | |
and (last_em_surprise > 0.05) | |
and (last_em_surprise < em_surprise) | |
): | |
logger.log(f"em_surprise before avg: {em_surprise}") | |
em_surprise = (em_surprise + last_em_surprise) / 2 | |
# adjust the values within data | |
if (em_angry > 0): | |
logger.log(f"Adjusting em_angry: {em_angry}") | |
adjusted_pacing = False | |
for line_i in range(len(data["emAngry"])): | |
for char_i in range(len(data["emAngry"][line_i])): | |
data["emAngry"][line_i][char_i] = em_angry | |
data["hasDataChanged"] = True | |
# slower the speech if above threshold | |
# as the pacing goes way too fast when past this point | |
if (em_angry >= 0.7 and hasExcMark): | |
try: | |
data["pace"] *= (1 + em_angry / 2) | |
logger.log(f"Adjusting pacing: {1 + em_angry / 2}") | |
except: | |
pass | |
if ( | |
em_happy > 0 and ( | |
em_happy >= em_surprise | |
or em_surprise < 0.3 | |
) | |
): | |
# em_surprise & em_happy overamplify each other | |
logger.log(f"Adjusting em_happy: {em_happy}") | |
for line_i in range(len(data["emHappy"])): | |
for char_i in range(len(data["emHappy"][line_i])): | |
data["emHappy"][line_i][char_i] = em_happy | |
data["hasDataChanged"] = True | |
if (em_sad > 0): | |
logger.log(f"Adjusting em_sad: {em_sad}") | |
for line_i in range(len(data["emSad"])): | |
for char_i in range(len(data["emSad"][line_i])): | |
data["emSad"][line_i][char_i] = em_sad | |
data["hasDataChanged"] = True | |
# slower the speech if above threshold | |
if (em_sad > 0.2): | |
try: | |
data["pace"] *= (1 + em_sad / 3) | |
logger.log(f"Adjusting pacing: {1 + em_sad / 3}") | |
except: | |
pass | |
if ( | |
em_surprise > 0 and ( | |
em_surprise > em_happy | |
or em_happy < 0.3 | |
) | |
): | |
# em_surprise & em_happy overamplify each other | |
logger.log(f"Adjusting em_surprise: {em_surprise}") | |
for line_i in range(len(data["emSurprise"])): | |
for char_i in range(len(data["emSurprise"][line_i])): | |
data["emSurprise"][line_i][char_i] = em_surprise | |
data["hasDataChanged"] = True | |
prev_sentence = text_scores[0] | |
last_em_angry = float(0) | |
last_em_happy = float(0) | |
last_em_sad = float(0) | |
last_em_surprise = float(0) | |
return | |