From b2cc817911777d1ba85abaca9b98171bd89269b1 Mon Sep 17 00:00:00 2001 From: NATURESPEAK Date: Mon, 4 Apr 2022 09:12:49 +0200 Subject: [PATCH] jaccard, temp, etc. --- speak_broadcast.py | 32 ++++++++++++++++++++++++++------ utterance/osc.py | 5 +++++ utterance/utils.py | 2 +- utterance/voice.py | 43 ++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 74 insertions(+), 8 deletions(-) diff --git a/speak_broadcast.py b/speak_broadcast.py index 88bb97a..60da7a5 100644 --- a/speak_broadcast.py +++ b/speak_broadcast.py @@ -7,8 +7,9 @@ import examine.metric logging.basicConfig(level=logging.INFO) UTTERANCE_LEN = 16 #<--------------- these should be in config -NUM_METRIC_GEN = 50 +NUM_METRIC_GEN = 75 NUM_SAMPLE_VOICES = 3 +RANDOM_SEED_TIMER_MIN = 2 broadcast = None metric = None exit = False @@ -52,7 +53,11 @@ def broadcast_utterance(v, utterance): temp = format(v.temp, '.2f') text = f"{v.name.upper()}: {temp}\n" 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) terminal_utterance(text) @@ -113,7 +118,7 @@ def main() -> int: p = argparse.ArgumentParser() 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("-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() logging.info(f"INIT::loading config file - {args.config}") @@ -135,6 +140,8 @@ def main() -> int: 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.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) @@ -152,11 +159,12 @@ def main() -> int: if type(temp) == str and temp == "DEBUG": debug = name logging.info(f"DEBUG MODE: {debug}") - else: + else: # temperature for v in voices: if v.name == name: print(f'{name} - {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) @@ -176,10 +184,10 @@ def main() -> int: logging.info("INIT::SEEDING RANDOM") random.seed(time.time()) 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 = 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() #--------------------# @@ -206,7 +214,19 @@ def main() -> int: # ok here we need to randomise maybe...?! # ([d, t, v]) + + 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] uv = choice[1] uv_vec = metric.vector(uv) diff --git a/utterance/osc.py b/utterance/osc.py index 785b206..5d131a1 100644 --- a/utterance/osc.py +++ b/utterance/osc.py @@ -37,6 +37,11 @@ class OscBroadcaster: osc_send(msg, self.name) update() + def temperature(self, temp: float, channel: str): + msg = oscbuildparse.OSCMessage(channel, None, [temp]) + osc_send(msg, self.name) + update() + class OscReceiver: def __init__(self, name: str, host: str, port: str, callback_fn=None): diff --git a/utterance/utils.py b/utterance/utils.py index e59a34a..354411b 100644 --- a/utterance/utils.py +++ b/utterance/utils.py @@ -16,7 +16,7 @@ def clean(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): frags = [] diff --git a/utterance/voice.py b/utterance/voice.py index 2550d04..f448464 100644 --- a/utterance/voice.py +++ b/utterance/voice.py @@ -1,6 +1,9 @@ from aitextgen import aitextgen import utterance.utils -import regex, string, time +import gensim, regex, string, time + +UTTERANCE_MEMORY_LEN = 15 +UTTERANCE_MEMORY_MIN_DIST = 0.2 class Voice: @@ -9,6 +12,7 @@ class Voice: self.temp = temp self.lenght = lenght self.v = aitextgen(model_folder=model, tokenizer_file=tokenizer) + self.utterances = [] def utter_n(self, n: int, temp: float = None, lenght: int = None): t = self.temp if temp == None else temp @@ -20,12 +24,49 @@ class Voice: l = self.lenght if lenght == None else lenght 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): self.channel = root + endpoint def channel(self): 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): self.utterance = utt self.utterance_fragments = utterance.utils.fragments(utt)