|
import streamlit as st |
|
import torch |
|
import numpy as np |
|
import re |
|
from transformers import ( |
|
AutoModelForCausalLM, |
|
AutoTokenizer, |
|
AutoModelForSpeechSeq2Seq, |
|
AutoProcessor |
|
) |
|
import streamlit.components.v1 as components |
|
|
|
|
|
AVATAR_PERSONAS = { |
|
"Rat": { |
|
"image": "rat.png", |
|
"name": "Puzzle Master Rat", |
|
"description": "Clever and resourceful. Loves puzzles and word games.", |
|
"sample": "Let's solve a riddle together!", |
|
"teaching_style": "Analytical and game-based learning", |
|
"learning_tips": [ |
|
"Break complex ideas into smaller puzzles", |
|
"Use word games to learn vocabulary", |
|
"Think critically about language patterns" |
|
] |
|
}, |
|
"Ox": { |
|
"image": "ox.png", |
|
"name": "Professor Ox", |
|
"description": "Strong and dependable. Very patient when explaining concepts.", |
|
"sample": "I will guide you step by step.", |
|
"teaching_style": "Structured and systematic approach", |
|
"learning_tips": [ |
|
"Learn grammar rules systematically", |
|
"Practice one concept at a time", |
|
"Build a strong foundation" |
|
] |
|
}, |
|
"Tiger": { |
|
"image": "tiger.png", |
|
"name": "Adventure Coach Tiger", |
|
"description": "Brave and energetic. Loves exciting challenges.", |
|
"sample": "Let's make learning an adventure!", |
|
"teaching_style": "High-energy and challenge-driven", |
|
"learning_tips": [ |
|
"Turn learning into a fun challenge", |
|
"Set exciting language goals", |
|
"Celebrate every bit of progress" |
|
] |
|
}, |
|
"Rabbit": { |
|
"image": "rabbit.png", |
|
"name": "Storyteller Rabbit", |
|
"description": "Gentle and kind. Encourages learning through storytelling.", |
|
"sample": "I have a story to share with you!", |
|
"teaching_style": "Narrative and empathetic learning", |
|
"learning_tips": [ |
|
"Learn through engaging stories", |
|
"Connect language to emotional experiences", |
|
"Use imagination to remember vocabulary" |
|
] |
|
}, |
|
"Dragon": { |
|
"image": "dragon.png", |
|
"name": "Scholar Dragon", |
|
"description": "Confident and intelligent. Explains ideas clearly.", |
|
"sample": "I will help you think like a scholar!", |
|
"teaching_style": "Intellectual and precise instruction", |
|
"learning_tips": [ |
|
"Understand the logic behind language rules", |
|
"Analyze language structures", |
|
"Develop a scholarly approach to learning" |
|
] |
|
}, |
|
"Snake": { |
|
"image": "snake.png", |
|
"name": "Philosopher Snake", |
|
"description": "Calm and analytical. Gives insightful explanations.", |
|
"sample": "Let's break this down logically!", |
|
"teaching_style": "Reflective and analytical learning", |
|
"learning_tips": [ |
|
"Think deeply about language nuances", |
|
"Understand the 'why' behind grammar rules", |
|
"Develop critical thinking in language" |
|
] |
|
}, |
|
"Horse": { |
|
"image": "horse.png", |
|
"name": "Energetic Coach Horse", |
|
"description": "Cheerful and enthusiastic. Encourages active participation.", |
|
"sample": "Come on, let's say it together!", |
|
"teaching_style": "Interactive and participatory learning", |
|
"learning_tips": [ |
|
"Practice speaking out loud", |
|
"Engage actively in conversations", |
|
"Build confidence through participation" |
|
] |
|
}, |
|
"Goat": { |
|
"image": "goat.png", |
|
"name": "Creative Mentor Goat", |
|
"description": "Creative and friendly. Uses fun examples.", |
|
"sample": "Let's use pictures to understand this!", |
|
"teaching_style": "Visual and creative learning", |
|
"learning_tips": [ |
|
"Use visual aids to learn vocabulary", |
|
"Create mental images for new words", |
|
"Learn through creative and fun methods" |
|
] |
|
}, |
|
"Monkey": { |
|
"image": "monkey.png", |
|
"name": "Playful Genius Monkey", |
|
"description": "Smart and playful. Makes learning fun.", |
|
"sample": "I love word games! Do you?", |
|
"teaching_style": "Playful and game-oriented learning", |
|
"learning_tips": [ |
|
"Turn learning into a fun game", |
|
"Use humor to remember language", |
|
"Enjoy the process of learning" |
|
] |
|
}, |
|
"Rooster": { |
|
"image": "rooster.png", |
|
"name": "Pronunciation Master Rooster", |
|
"description": "Confident and vocal. Encourages clear pronunciation.", |
|
"sample": "Let's practice speaking clearly!", |
|
"teaching_style": "Phonetic and pronunciation-focused", |
|
"learning_tips": [ |
|
"Focus on clear pronunciation", |
|
"Practice accent and intonation", |
|
"Listen carefully to native speakers" |
|
] |
|
}, |
|
"Dog": { |
|
"image": "dog.png", |
|
"name": "Supportive Buddy Dog", |
|
"description": "Loyal and encouraging. Builds confidence in learners.", |
|
"sample": "You're doing a great job!", |
|
"teaching_style": "Supportive and confidence-building", |
|
"learning_tips": [ |
|
"Believe in your learning abilities", |
|
"Don't fear making mistakes", |
|
"Stay motivated and persistent" |
|
] |
|
}, |
|
"Pig": { |
|
"image": "pig.png", |
|
"name": "Relaxed Mentor Pig", |
|
"description": "Easygoing and kind. Makes learning feel natural.", |
|
"sample": "Let's take it step by step together!", |
|
"teaching_style": "Relaxed and natural learning", |
|
"learning_tips": [ |
|
"Learn at your own pace", |
|
"Stay calm and enjoy the process", |
|
"Make learning a comfortable experience" |
|
] |
|
} |
|
} |
|
|
|
class AdvancedLanguageLearningAssistant: |
|
def __init__(self, avatar_name): |
|
|
|
self.avatar = AVATAR_PERSONAS[avatar_name] |
|
|
|
|
|
try: |
|
self.llm_model = AutoModelForCausalLM.from_pretrained("microsoft/DialoGPT-small") |
|
self.llm_tokenizer = AutoTokenizer.from_pretrained("microsoft/DialoGPT-small") |
|
except Exception as e: |
|
st.error(f"Model loading error: {e}") |
|
self.llm_model = None |
|
self.llm_tokenizer = None |
|
|
|
def generate_response(self, user_input): |
|
if not self.llm_model: |
|
return "Sorry, I'm having trouble generating a response." |
|
|
|
|
|
prompt = f""" |
|
Avatar: {self.avatar['name']} |
|
Teaching Style: {self.avatar['teaching_style']} |
|
User Input: {user_input} |
|
|
|
Generate a response that: |
|
1. Reflects the avatar's unique personality |
|
2. Provides encouraging language learning support |
|
3. Maintains an engaging tone |
|
""" |
|
|
|
try: |
|
inputs = self.llm_tokenizer.encode(prompt, return_tensors='pt') |
|
outputs = self.llm_model.generate( |
|
inputs, |
|
max_length=150, |
|
temperature=0.7 |
|
) |
|
|
|
response = self.llm_tokenizer.decode(outputs[0], skip_special_tokens=True) |
|
return response |
|
except Exception as e: |
|
return f"Sorry, I'm having trouble generating a response. Error: {e}" |
|
|
|
def avatar_selection_page(): |
|
""" |
|
First stage: Avatar Selection |
|
""" |
|
st.title("Choose Your Learning Companion") |
|
|
|
|
|
st.markdown(""" |
|
<style> |
|
.avatar-grid { |
|
display: grid; |
|
grid-template-columns: repeat(3, 1fr); |
|
gap: 20px; |
|
padding: 20px; |
|
} |
|
.avatar-card { |
|
border: 2px solid #f0f0f0; |
|
border-radius: 10px; |
|
padding: 15px; |
|
text-align: center; |
|
transition: all 0.3s ease; |
|
} |
|
.avatar-card:hover { |
|
transform: scale(1.05); |
|
border-color: #4CAF50; |
|
} |
|
.avatar-image { |
|
width: 200px; |
|
height: 200px; |
|
object-fit: cover; |
|
border-radius: 50%; |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
|
|
|
|
st.markdown('<div class="avatar-grid">', unsafe_allow_html=True) |
|
|
|
for avatar_key, avatar_info in AVATAR_PERSONAS.items(): |
|
st.markdown(f''' |
|
<div class="avatar-card"> |
|
<img src="images/{avatar_info['image']}" class="avatar-image" alt="{avatar_info['name']}"> |
|
<h3>{avatar_info['name']}</h3> |
|
<p>{avatar_info['description']}</p> |
|
<button onclick="selectAvatar('{avatar_key}')">Select {avatar_info['name']}</button> |
|
</div> |
|
''', unsafe_allow_html=True) |
|
|
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
|
|
|
st.markdown(""" |
|
<script> |
|
function selectAvatar(avatarKey) { |
|
window.parent.postMessage({type: 'avatarSelected', avatarKey: avatarKey}, '*'); |
|
} |
|
</script> |
|
""", unsafe_allow_html=True) |
|
|
|
def conversation_page(selected_avatar): |
|
""" |
|
Second stage: Conversation Interface |
|
""" |
|
st.title(f"Learning English with {AVATAR_PERSONAS[selected_avatar]['name']}") |
|
|
|
|
|
assistant = AdvancedLanguageLearningAssistant(selected_avatar) |
|
|
|
|
|
user_input = st.text_input("Type your message in English:") |
|
|
|
if st.button("Send"): |
|
if user_input: |
|
response = assistant.generate_response(user_input) |
|
st.write(f"🤖 {response}") |
|
|
|
def main(): |
|
|
|
if 'stage' not in st.session_state: |
|
st.session_state.stage = 'avatar_selection' |
|
if 'selected_avatar' not in st.session_state: |
|
st.session_state.selected_avatar = None |
|
|
|
|
|
components.html(""" |
|
<script> |
|
window.addEventListener('message', function(event) { |
|
if (event.data.type === 'avatarSelected') { |
|
window.parent.postMessage({ |
|
type: 'streamlit:setComponentValue', |
|
key: 'selected_avatar', |
|
value: event.data.avatarKey |
|
}, '*'); |
|
} |
|
}); |
|
</script> |
|
""", height=0) |
|
|
|
|
|
selected_avatar = st.experimental_get_query_params().get('selected_avatar', [None])[0] |
|
|
|
if selected_avatar: |
|
st.session_state.selected_avatar = selected_avatar |
|
st.session_state.stage = 'conversation' |
|
|
|
|
|
if st.session_state.stage == 'avatar_selection': |
|
avatar_selection_page() |
|
elif st.session_state.stage == 'conversation': |
|
conversation_page(st.session_state.selected_avatar) |
|
|
|
if __name__ == "__main__": |
|
main() |