import argparse, json, sys, time, random import utterance.voice import utterance.utils import utterance.osc import examine.metric UTTERANCE_LEN = 16 def format_str(text: str) -> str: t = utterance.utils.clean(text) return utterance.utils.format(t) 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") args = p.parse_args() with open(args.config) as f: conf = json.load(f) voices = [] for v in conf['voices']: 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']) voices.append(voice) broadcast = utterance.osc.OscBroadcaster(name="osc_broadcast", host=conf['host'], port=conf['port'], command_channel=conf['command_osc_channel']) broadcast.start_osc() nbr_voices = len(voices) state = 'c' metric = examine.metric.Metric(model_input='data/models/doc2vec.model') s = set(range(0, nbr_voices - 1)) rindex = random.sample(s, 1)[0] v = voices[rindex] uv = v.utter_one() uv = format_str(uv) v_vec = metric.vector(uv) while state == 'c': candidates = random.sample(s, 3) results = [] for c in candidates: if c == rindex: continue vc = voices[c] vc_texts = vc.utter_n(n=150) for t in vc_texts: t = format_str(t) t_vec = metric.vector(t) d = examine.metric.cos_dist(v_vec, t_vec) results.append([d, t, c]) # vv = voices[rrindex] # texts = vv.utter_n(n=150) # # texts = v.utter_n(n=150) # results = [] # for t in texts: # t = format_str(t) # t_vec = metric.vector(uv) # d = examine.metric.cos_dist(v_vec, t_vec) # results.append((d, t)) results.sort(key=lambda t: t[0], reverse=True) print('----------------------------') print(v.name + ":") print(uv) print('----------------------------') for r in results[:2]: print('-->' + str(r[0])) print(r[1]) print('+++++++++++++++++++++++++') # new round top = results[0] rindex = top[2] v = voices[rindex] uv = top[1] v_vec = metric.vector(top[1]) state = input("Continue? ") broadcast.terminate_osc() if __name__ == '__main__': sys.exit(main())