jaccard, temp, etc.

This commit is contained in:
NATURESPEAK 2022-04-04 09:12:49 +02:00
parent c33d577bb6
commit b2cc817911
4 changed files with 74 additions and 8 deletions

View File

@ -7,8 +7,9 @@ import examine.metric
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
UTTERANCE_LEN = 16 #<--------------- these should be in config UTTERANCE_LEN = 16 #<--------------- these should be in config
NUM_METRIC_GEN = 50 NUM_METRIC_GEN = 75
NUM_SAMPLE_VOICES = 3 NUM_SAMPLE_VOICES = 3
RANDOM_SEED_TIMER_MIN = 2
broadcast = None broadcast = None
metric = None metric = None
exit = False exit = False
@ -52,7 +53,11 @@ def broadcast_utterance(v, utterance):
temp = format(v.temp, '.2f') temp = format(v.temp, '.2f')
text = f"{v.name.upper()}: {temp}\n" text = f"{v.name.upper()}: {temp}\n"
else: else:
text = f"{v.name.upper()}:\n" text = f""
# Send all text to server to calculate bounds in advance
broadcast.utterance(utterance, v.calculate)
broadcast.utterance(text, v.channel) broadcast.utterance(text, v.channel)
terminal_utterance(text) terminal_utterance(text)
@ -113,7 +118,7 @@ def main() -> int:
p = argparse.ArgumentParser() p = argparse.ArgumentParser()
p.add_argument("-c", "--config", type=str, default="voice.config.json", help="configuratin file") p.add_argument("-c", "--config", type=str, default="voice.config.json", help="configuratin file")
p.add_argument("-i", "--iterations", type=int, default=10, help="number of iterations") p.add_argument("-i", "--iterations", type=int, default=10, help="number of iterations")
p.add_argument("-t", "--terminal", action=argparse.BooleanOptionalAction, help="print to terminal") p.add_argument("-t", "--terminal", action='store_true', help="print to terminal")
args = p.parse_args() args = p.parse_args()
logging.info(f"INIT::loading config file - {args.config}") logging.info(f"INIT::loading config file - {args.config}")
@ -135,6 +140,8 @@ def main() -> int:
model = v['model'] model = v['model']
voice = utterance.voice.Voice(name=v["name"].upper(), model=model['model_dir'], tokenizer=model['tokeniser_file'], temp=float(model["temperature"]), lenght=UTTERANCE_LEN) voice = utterance.voice.Voice(name=v["name"].upper(), model=model['model_dir'], tokenizer=model['tokeniser_file'], temp=float(model["temperature"]), lenght=UTTERANCE_LEN)
voice.set_channel(v['osc_channel']['root'], v['osc_channel']['utterance']) voice.set_channel(v['osc_channel']['root'], v['osc_channel']['utterance'])
voice.set_calculate(v['osc_channel']['root'], v['osc_channel']['calculate'])
voice.set_temperature(v['osc_channel']['root'], v['osc_channel']['temperature'])
voices.append(voice) voices.append(voice)
@ -152,11 +159,12 @@ def main() -> int:
if type(temp) == str and temp == "DEBUG": if type(temp) == str and temp == "DEBUG":
debug = name debug = name
logging.info(f"DEBUG MODE: {debug}") logging.info(f"DEBUG MODE: {debug}")
else: else: # temperature
for v in voices: for v in voices:
if v.name == name: if v.name == name:
print(f'{name} - {temp}') print(f'{name} - {temp}')
v.temp = temp v.temp = temp
broadcast.temperature(temp, v.temperature)
receiver = utterance.osc.OscReceiver(name="osc_receiver", host=conf['host_machinespeak'], port=conf['port_machinespeak'], callback_fn=receiver_cb) receiver = utterance.osc.OscReceiver(name="osc_receiver", host=conf['host_machinespeak'], port=conf['port_machinespeak'], callback_fn=receiver_cb)
@ -176,10 +184,10 @@ def main() -> int:
logging.info("INIT::SEEDING RANDOM") logging.info("INIT::SEEDING RANDOM")
random.seed(time.time()) random.seed(time.time())
if not exit: if not exit:
t_random_seed = threading.Timer(random.randint(60, 60 * 4), random_seed) t_random_seed = threading.Timer(random.randint(60, 60 * RANDOM_SEED_TIMER_MIN), random_seed)
t_random_seed.start() t_random_seed.start()
t_random_seed = threading.Timer(random.randint(60, 60 * 4), random_seed) t_random_seed = threading.Timer(random.randint(60, 60 * RANDOM_SEED_TIMER_MIN), random_seed)
t_random_seed.start() t_random_seed.start()
#--------------------# #--------------------#
@ -206,7 +214,19 @@ def main() -> int:
# ok here we need to randomise maybe...?! # ok here we need to randomise maybe...?!
# ([d, t, v]) # ([d, t, v])
choice = results[0] choice = results[0]
# makse sure we don't say the same thing over and over again
for r in results:
v = r[2]
u = r[1]
if v.select(u):
choice = r
break
else:
logging.info(f"LOOP::reduncancy {v.name}")
v = choice[2] v = choice[2]
uv = choice[1] uv = choice[1]
uv_vec = metric.vector(uv) uv_vec = metric.vector(uv)

View File

@ -37,6 +37,11 @@ class OscBroadcaster:
osc_send(msg, self.name) osc_send(msg, self.name)
update() update()
def temperature(self, temp: float, channel: str):
msg = oscbuildparse.OSCMessage(channel, None, [temp])
osc_send(msg, self.name)
update()
class OscReceiver: class OscReceiver:
def __init__(self, name: str, host: str, port: str, callback_fn=None): def __init__(self, name: str, host: str, port: str, callback_fn=None):

View File

@ -16,7 +16,7 @@ def clean(text: str) -> str:
def format(text: str) -> str: def format(text: str) -> str:
return text.replace('\r\n', '\n').replace('\n\n', '\n') return text.replace('\r\n', '\n').replace('\n\n', '\n').replace('', "'").replace("", "'")
def fragments(utterance: str): def fragments(utterance: str):
frags = [] frags = []

View File

@ -1,6 +1,9 @@
from aitextgen import aitextgen from aitextgen import aitextgen
import utterance.utils import utterance.utils
import regex, string, time import gensim, regex, string, time
UTTERANCE_MEMORY_LEN = 15
UTTERANCE_MEMORY_MIN_DIST = 0.2
class Voice: class Voice:
@ -9,6 +12,7 @@ class Voice:
self.temp = temp self.temp = temp
self.lenght = lenght self.lenght = lenght
self.v = aitextgen(model_folder=model, tokenizer_file=tokenizer) self.v = aitextgen(model_folder=model, tokenizer_file=tokenizer)
self.utterances = []
def utter_n(self, n: int, temp: float = None, lenght: int = None): def utter_n(self, n: int, temp: float = None, lenght: int = None):
t = self.temp if temp == None else temp t = self.temp if temp == None else temp
@ -20,12 +24,49 @@ class Voice:
l = self.lenght if lenght == None else lenght l = self.lenght if lenght == None else lenght
return self.utter_n(n=1, temp=temp, lenght=lenght)[0] return self.utter_n(n=1, temp=temp, lenght=lenght)[0]
def select(self, utterance: str) -> bool:
# fuction making sure to not say the same thing
print("select;")
toks = set(gensim.utils.tokenize(utterance))
i = 0
for u in self.utterances:
d = gensim.matutils.jaccard_distance(toks, u)
print(f"{i} - d: {d}")
if d < UTTERANCE_MEMORY_MIN_DIST:
return False
self.utterances.append(toks)
print(len(self.utterances))
if len(self.utterances) > UTTERANCE_MEMORY_LEN:
self.utterances.pop(0)
return True
def set_channel(self, root: str, endpoint: str): def set_channel(self, root: str, endpoint: str):
self.channel = root + endpoint self.channel = root + endpoint
def channel(self): def channel(self):
return self.channel return self.channel
def set_calculate(self, root: str, endpoint: str):
self.calculate = root + endpoint
def calculate(self):
return self.calculate
def set_temperature(self, root: str, endpoint: str):
self.temperature = root + endpoint
def calculate(self):
return self.temperature
def fragments(self, utt: str): def fragments(self, utt: str):
self.utterance = utt self.utterance = utt
self.utterance_fragments = utterance.utils.fragments(utt) self.utterance_fragments = utterance.utils.fragments(utt)