From e91d3012cb155f4933957771a2d5e4fa559072ef Mon Sep 17 00:00:00 2001 From: Gauthier Date: Sun, 20 Mar 2022 10:45:12 +0100 Subject: [PATCH] two way comm --- speak_broadcast.py | 27 +++++++++++++++++++++++---- utterance/osc.py | 32 +++++++++++++++++++++++--------- utterance/voice.py | 6 ++++-- 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/speak_broadcast.py b/speak_broadcast.py index a6045c0..61e6634 100644 --- a/speak_broadcast.py +++ b/speak_broadcast.py @@ -47,7 +47,7 @@ def broadcast_utterance(v, utterance): global broadcast, exit - text = v.name.upper() + ":\n" + text = f"{v.name.upper()} : {v.temp}\n" broadcast.utterance(text, v.channel) terminal_utterance(text) @@ -85,6 +85,11 @@ def find_candidates(v, uv_vec, voices, results): lapse = time.time() - start logging.info(f"LOOP::done - {lapse} secs") +def update(): + global exit + while not exit: + utterance.osc.update() + time.sleep(0.2) def signal_terminate(signum, frame): @@ -128,8 +133,18 @@ def main() -> int: # NET #--------------------# logging.info(f"INIT::setting up OSC") - broadcast = utterance.osc.OscBroadcaster(name="osc_broadcast", host=conf['host'], port=conf['port'], command_channel=conf['command_osc_channel']) - broadcast.start_osc() + + utterance.osc.start_osc() + + broadcast = utterance.osc.OscBroadcaster(name="osc_broadcast", host=conf['host_voicemachine'], port=conf['port_voicemachine'], command_channel=conf['command_osc_channel']) + + def temperature_cb(temp, name): + for v in voices: + if v.name == name: + v.temp = temp + + receiver = utterance.osc.OscReceiver(name="osc_receiver", host=conf['host_machinespeak'], port=conf['port_machinespeak'], callback_fn=temperature_cb) + #--------------------# # METRIC @@ -144,6 +159,9 @@ def main() -> int: random.seed(time.time()) v = random.choice(voices) uv, uv_vec = utter_one_vectorise(v) + + t_update = threading.Thread(target=update) + t_update.start() while not exit: @@ -164,9 +182,10 @@ def main() -> int: uv_vec = metric.vector(uv) logging.info(f"LOOP::next {v.name}") + t_update.join() logging.info(f"TERMINATE::terminating OSC") - broadcast.terminate_osc() + utterance.osc.terminate_osc() logging.info(f"FIN") diff --git a/utterance/osc.py b/utterance/osc.py index 539ff6f..5f81f89 100644 --- a/utterance/osc.py +++ b/utterance/osc.py @@ -1,6 +1,18 @@ from osc4py3.as_eventloop import * from osc4py3 import oscbuildparse +def start_osc(): + osc_startup() + +def terminate_osc(): + osc_terminate() + +def temperature(temp, name): + print(f'{temp} - {name}') + +def update(): + osc_process() + class OscBroadcaster: def __init__(self, name: str, host: str, port: str, command_channel: str): @@ -8,7 +20,7 @@ class OscBroadcaster: self.host = host self.port = port self.cmd = command_channel - osc_udp_client(self.host, self.port, self.name) + osc_udp_client(self.host, self.port, self.name) def utterance(self, utterance: str, channel: str): msg = oscbuildparse.OSCMessage(channel, None, [utterance]) @@ -20,15 +32,17 @@ class OscBroadcaster: osc_send(msg, self.name) osc_process() - @staticmethod - def start_osc(): - osc_startup() - - @staticmethod - def terminate_osc(): - osc_terminate() - +class OscReceiver: + def __init__(self, name: str, host: str, port: str, callback_fn=None): + self.name = name + self.host = host + self.port = port + osc_udp_server(self.host, self.port, self.name) + if callback_fn: + osc_method('/', callback_fn) + else: + osc_method('/', temperature) diff --git a/utterance/voice.py b/utterance/voice.py index c15e85b..4223dc7 100644 --- a/utterance/voice.py +++ b/utterance/voice.py @@ -11,11 +11,13 @@ class Voice: self.v = aitextgen(model_folder=model, tokenizer_file=tokenizer) def utter_n(self, n: int, temp: float = None, lenght: int = None): - t = self.temp if temp != None else temp - l = self.lenght if lenght != None else lenght + t = self.temp if temp == None else temp + l = self.lenght if lenght == None else lenght return self.v.generate(n=n, max_lenght=l, temperature=t, return_as_list=True) def utter_one(self, temp: int = None, lenght: float = None) -> str: + t = self.temp if temp == None else temp + l = self.lenght if lenght == None else lenght return self.utter_n(n=1, temp=temp, lenght=lenght)[0] def set_channel(self, root: str, endpoint: str):