File size: 3,746 Bytes
d3fb87a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
from langchain import LLMChain
from langchain.prompts import PromptTemplate
from omegaconf import OmegaConf
import datetime

VOICE_SELECTION_PROMPT_TEMPLATE = """
Select one of the following voice based on the given concept.
You must choose one voice name based on the description of each model and the concept.


Cencept: {concept}

Voice name and description: {model_list}

Warning: {warning}

The avilable voice names: 
{model_name_list}

Selected voice name:
"""

GENDER_SELECTION_PROMPT_TEMPLATE = """
Select one of the following gender based on the given concept.
You must choose one gender based on the description of the concept. You must choose one gender Even if you can't decide.

Gender:
male
female

Cencept: {concept}
Selected gender male or female:
"""

LANGUAGE_SELECTION_PROMPT_TEMPLATE = """
Select one of the following language based on the given concept.
You must choose the language that is used by the description of the concept.

Languages:
Chinese
English
Japanese

Cencept: {concept}
Selected language:
"""

def load_voice_model_list():
    models_config = OmegaConf.load('resources/voices.yaml')
    models_dict = models_config['models']
    print(models_dict)
    model_list_str = ''
    model_name_list_str = ''
    for key, value in models_dict.items():
        model_list_str+="model name: " +key+', model description: '+value['desc']+'\n'
        model_name_list_str += key + ' '
    model_name_list_str += '\n'
    return model_list_str, models_dict, model_name_list_str

def get_vioce_model_chain(llm, class_concept):
    model_template = PromptTemplate(
        input_variables=["model_list", "concept", "model_name_list", "warning"],
        template=VOICE_SELECTION_PROMPT_TEMPLATE,
    )
    model_list_str, models_dict, model_name_list_str = load_voice_model_list()

    personality_chain = LLMChain(
        llm=llm, prompt=model_template, verbose=True)

    selected_model = None
    while (selected_model is None) or not (selected_model in models_dict):
        if (selected_model is not None) and not (selected_model in models_dict):
            warning_str = '{} is not in Model list! \n'.format(selected_model)
        else:
            warning_str = ''
        selected_model = personality_chain.run({'concept': class_concept, 'model_list':model_list_str, 'warning': warning_str, 'model_name_list': model_name_list_str})
    print("Selected model name: ", selected_model)
    
    return selected_model

def get_gender_chain(llm, class_concept):
    model_template = PromptTemplate(
        input_variables=["concept"],
        template=GENDER_SELECTION_PROMPT_TEMPLATE,
    )

    personality_chain = LLMChain(
        llm=llm, prompt=model_template, verbose=True)
    selected_gender = personality_chain.run({'concept': class_concept})
    print("Selected gender: ", selected_gender)
    return selected_gender

def get_language_chain(llm, class_concept):
    model_template = PromptTemplate(
        input_variables=["concept"],
        template=LANGUAGE_SELECTION_PROMPT_TEMPLATE,
    )

    personality_chain = LLMChain(
        llm=llm, prompt=model_template, verbose=True)
    selected_language = personality_chain.run({'concept': class_concept})
    print("Selected language: ", selected_language)
    return selected_language
                


def voice_selection_chain(llm, class_concept=None):
    chain = None
    memory = None
    if llm:
        print("class_concept", class_concept)
        if class_concept is None:
            class_concept = 'AI assistant'
        selected_model = get_vioce_model_chain(llm, class_concept)
        gender = get_gender_chain(llm, class_concept)
        language = get_language_chain(llm, class_concept)

    return selected_model, gender, language