|
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 |
|
|
|
|