Pendrokar's picture
çomment out symlink
a0a523d
raw
history blame
10.9 kB
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