Vocabulary / app.py
openfree's picture
Upload app.py with huggingface_hub
4359927 verified
import gradio as gr
import pandas as pd
import numpy as np
import json
import datetime
from gtts import gTTS
import os
import random
# Data storage
VOCAB_FILE = "vocabulary.json"
PROGRESS_FILE = "progress.json"
# Initialize data
if os.path.exists(VOCAB_FILE):
with open(VOCAB_FILE, 'r') as f:
vocabulary = json.load(f)
else:
vocabulary = {}
if os.path.exists(PROGRESS_FILE):
with open(PROGRESS_FILE, 'r') as f:
progress = json.load(f)
else:
progress = {
'studied_words': [],
'correct_counts': {},
'incorrect_counts': {},
'study_time': {},
'daily_goals': {},
'achievements': []
}
def save_vocab():
with open(VOCAB_FILE, 'w') as f:
json.dump(vocabulary, f)
def save_progress():
with open(PROGRESS_FILE, 'w') as f:
json.dump(progress, f)
def import_csv(file):
df = pd.read_csv(file.name)
for _, row in df.iterrows():
word = row['word']
meaning = row['meaning']
category = row.get('category', 'General')
difficulty = row.get('difficulty', 'Medium')
vocabulary[word] = {
'meaning': meaning,
'category': category,
'difficulty': difficulty,
'example': row.get('example', ''),
'date_added': datetime.datetime.now().strftime('%Y-%m-%d')
}
save_vocab()
return "Vocabulary imported successfully!"
def add_word(word, meaning, category, difficulty, example):
vocabulary[word] = {
'meaning': meaning,
'category': category,
'difficulty': difficulty,
'example': example,
'date_added': datetime.datetime.now().strftime('%Y-%m-%d')
}
save_vocab()
return f"Word '{word}' added successfully!"
def get_random_word():
if not vocabulary:
return None
return random.choice(list(vocabulary.keys()))
def check_answer(word, user_answer):
correct = vocabulary[word]['meaning'].lower() == user_answer.lower()
if correct:
progress['correct_counts'][word] = progress['correct_counts'].get(word, 0) + 1
else:
progress['incorrect_counts'][word] = progress['incorrect_counts'].get(word, 0) + 1
progress['studied_words'].append(word)
save_progress()
return "Correct!" if correct else f"Wrong! The correct answer is: {vocabulary[word]['meaning']}"
def get_stats():
total_words = len(vocabulary)
studied_words = len(set(progress['studied_words']))
if not studied_words:
return "No study data available yet."
total_correct = sum(progress['correct_counts'].values())
total_attempts = total_correct + sum(progress['incorrect_counts'].values())
accuracy = (total_correct / total_attempts * 100) if total_attempts > 0 else 0
return f"""
Total Words: {total_words}
Studied Words: {studied_words}
Accuracy: {accuracy:.1f}%
"""
def text_to_speech(word):
tts = gTTS(text=word, lang='en')
tts.save('temp.mp3')
return 'temp.mp3'
with gr.Blocks(theme=gr.themes.Soft()) as app:
gr.Markdown("# Vocabulary Learning System")
with gr.Tab("Import/Add Words"):
with gr.Row():
file_input = gr.File(label="Import CSV")
import_btn = gr.Button("Import")
with gr.Row():
word_input = gr.Textbox(label="Word")
meaning_input = gr.Textbox(label="Meaning")
category_input = gr.Dropdown(choices=["General", "Business", "Academic", "TOEFL", "IELTS"], label="Category")
difficulty_input = gr.Dropdown(choices=["Easy", "Medium", "Hard"], label="Difficulty")
example_input = gr.Textbox(label="Example Sentence")
add_btn = gr.Button("Add Word")
result_text = gr.Textbox(label="Result")
with gr.Tab("Study Flashcards"):
with gr.Row():
current_word = gr.Textbox(label="Word")
audio_btn = gr.Button("🔊 Listen")
audio_output = gr.Audio(label="Pronunciation")
answer_input = gr.Textbox(label="Enter meaning")
check_btn = gr.Button("Check Answer")
next_btn = gr.Button("Next Word")
result_study = gr.Textbox(label="Result")
with gr.Tab("Progress"):
stats_text = gr.Textbox(label="Statistics")
refresh_btn = gr.Button("Refresh Stats")
# Event handlers
import_btn.click(import_csv, inputs=[file_input], outputs=[result_text])
add_btn.click(add_word, inputs=[word_input, meaning_input, category_input, difficulty_input, example_input], outputs=[result_text])
def update_word():
word = get_random_word()
if word:
return word
return "No words available"
next_btn.click(update_word, outputs=[current_word])
check_btn.click(check_answer, inputs=[current_word, answer_input], outputs=[result_study])
audio_btn.click(text_to_speech, inputs=[current_word], outputs=[audio_output])
refresh_btn.click(get_stats, outputs=[stats_text])
app.launch()
if __name__ == '__main__':
demo.launch()