Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import numpy as np | |
| import json | |
| import tensorflow as tf | |
| from tensorflow.keras.models import load_model | |
| # ==================== | |
| # Load models | |
| # ==================== | |
| encoder_model = load_model("encoder_model.h5") | |
| decoder_model = load_model("decoder_model.h5") | |
| # ==================== | |
| # Load assets | |
| # ==================== | |
| with open("assets/char2idx.json", "r", encoding="utf-8") as f: | |
| char2idx = json.load(f) | |
| with open("assets/idx2char.json", "r", encoding="utf-8") as f: | |
| idx2char = json.load(f) | |
| with open("assets/config.json", "r", encoding="utf-8") as f: | |
| config = json.load(f) | |
| num_chars = config["num_chars"] | |
| max_len_input = config["max_len_input"] | |
| max_len_target = config["max_len_target"] | |
| latent_dim = config["latent_dim"] | |
| # ==================== | |
| # Encode input text | |
| # ==================== | |
| def encode_text(text, max_len): | |
| x = np.zeros((1, max_len, num_chars), dtype="float32") | |
| words = text.lower().split(" ") | |
| for t, w in enumerate(words[:max_len]): | |
| if w in char2idx: | |
| x[0, t, char2idx[w]] = 1.0 | |
| return x | |
| # ==================== | |
| # Decode sequence | |
| # ==================== | |
| def decode_sequence(input_seq): | |
| states_value = encoder_model.predict(input_seq) | |
| target_seq = np.zeros((1, 1, num_chars)) | |
| target_seq[0, 0, char2idx["\t"]] = 1.0 | |
| decoded_sentence = "" | |
| stop_condition = False | |
| while not stop_condition: | |
| output_tokens, h, c = decoder_model.predict([target_seq] + states_value) | |
| sampled_token_index = np.argmax(output_tokens[0, -1, :]) | |
| sampled_char = idx2char[str(sampled_token_index)] # key là str khi lưu json | |
| if sampled_char == "\n" or len(decoded_sentence.split(" ")) >= max_len_target - 1: | |
| stop_condition = True | |
| decoded_sentence += sampled_char | |
| else: | |
| decoded_sentence += sampled_char + " " | |
| target_seq = np.zeros((1, 1, num_chars)) | |
| target_seq[0, 0, sampled_token_index] = 1.0 | |
| states_value = [h, c] | |
| return decoded_sentence.strip() | |
| # ==================== | |
| # Gradio interface | |
| # ==================== | |
| def chatbot(user_input, history=[]): | |
| seq = encode_text(user_input, max_len_input) | |
| response = decode_sequence(seq) | |
| history.append((user_input, response)) | |
| return history, history | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# Basic Chatbot") | |
| chatbot_ui = gr.Chatbot() | |
| msg = gr.Textbox(placeholder="Type a message...") | |
| clear = gr.Button("Clear") | |
| def respond(message, chat_history): | |
| response = chatbot(message, chat_history)[1][-1][1] | |
| return "", chat_history | |
| msg.submit(respond, [msg, chatbot_ui], [msg, chatbot_ui]) | |
| clear.click(lambda: None, None, chatbot_ui, queue=False) | |
| demo.launch() | |