NATURESPEAK-ML-UTTER/speak_broadcast.py

113 lines
2.3 KiB
Python
Raw Normal View History

2022-03-13 17:09:05 +01:00
import argparse, json, sys, time, random
import utterance.voice
import utterance.utils
import utterance.osc
import examine.metric
UTTERANCE_LEN = 16
broadcast = None
def format_str(text: str) -> str:
t = utterance.utils.clean(text)
return utterance.utils.format(t)
def broadcast_utterance(v, utterance):
global broadcast
text = v.name.upper() + ":\n"
broadcast.utterance(text, v.channel)
time.sleep(2)
frags = v.fragments(utterance)
for f in frags:
text += f
broadcast.utterance(text, v.channel)
time.sleep(2)
broadcast.command('clear')
time.sleep(2)
def main() -> int:
global broadcast
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=50)
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])
results.sort(key=lambda t: t[0], reverse=True)
broadcast_utterance(v, uv)
# 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())