Download app.py from evoss-tc/Image_Caption_Language_Learning: direct link, hf CLI and curl.
- Browser
- Download file 3.48 kB
-
https://huggingface.co/spaces/evoss-tc/Image_Caption_Language_Learning/resolve/main/app.py
- Command line
-
hf download hf://spaces/evoss-tc/Image_Caption_Language_Learning/app.py
-
curl -L -o app.py https://huggingface.co/spaces/evoss-tc/Image_Caption_Language_Learning/resolve/main/app.py
3.48 kB
| import gradio as gr | |
| from gtts import gTTS | |
| import os | |
| from PIL import Image | |
| from transformers import pipeline, AutoModelForSeq2SeqLM, AutoTokenizer, BlipProcessor, BlipForConditionalGeneration | |
| # Define translation models per language pair | |
| translation_models = { | |
| "French": "Helsinki-NLP/opus-mt-en-fr", | |
| "Spanish": "Helsinki-NLP/opus-mt-en-es", | |
| "Mandarin": "Helsinki-NLP/opus-mt-en-zh", | |
| "Vietnamese": "Helsinki-NLP/opus-mt-en-vi", | |
| "Tagalog": "Helsinki-NLP/opus-mt-en-tl" | |
| } | |
| # Directory to store local models | |
| local_model_dir = "./models" | |
| os.makedirs(local_model_dir, exist_ok=True) | |
| # Load translation models and tokenizers locally | |
| translation_pipelines = {} | |
| for lang, model_name in translation_models.items(): | |
| local_path = os.path.join(local_model_dir, model_name.replace('/', '_')) | |
| if not os.path.exists(local_path): | |
| model = AutoModelForSeq2SeqLM.from_pretrained(model_name) | |
| tokenizer = AutoTokenizer.from_pretrained(model_name) | |
| model.save_pretrained(local_path) | |
| tokenizer.save_pretrained(local_path) | |
| else: | |
| model = AutoModelForSeq2SeqLM.from_pretrained(local_path) | |
| tokenizer = AutoTokenizer.from_pretrained(local_path) | |
| translation_pipelines[lang] = pipeline("translation", model=model, tokenizer=tokenizer) | |
| # Load image captioning model | |
| caption_processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-base") | |
| caption_model = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-base") | |
| def generate_caption(image): | |
| inputs = caption_processor(image, return_tensors="pt") | |
| output = caption_model.generate(**inputs) | |
| caption = caption_processor.decode(output[0], skip_special_tokens=True) | |
| return caption | |
| # Function to translate text using locally stored models | |
| def translate_text(sentence, target_lang): | |
| if target_lang in translation_pipelines: | |
| model = translation_pipelines[target_lang] | |
| translation = model(sentence, max_length=100, truncation=True) | |
| return translation[0]['translation_text'] | |
| return sentence # Return original if no model found | |
| # Language options | |
| language_options = { | |
| "English": "en", "French": "fr", "Spanish": "es", "Mandarin": "zh", "Vietnamese": "vi", "Tagalog": "tl" | |
| } | |
| # Main function for Gradio | |
| def process_image(image, l1, l2): | |
| if not image: | |
| return "Please upload an image.", None, None | |
| caption_en = generate_caption(image) | |
| caption_l2 = translate_text(caption_en, l2) if l2 != "English" else caption_en | |
| # Generate TTS | |
| tts = gTTS(text=caption_l2, lang=language_options[l2]) | |
| audio_path = "caption_audio.mp3" | |
| tts.save(audio_path) | |
| return caption_l2, audio_path, caption_en | |
| # Gradio Interface | |
| interface = gr.Interface( | |
| fn=process_image, | |
| inputs=[ | |
| gr.Image(type="pil", sources=["upload"]), # Only allows upload and drag-and-drop | |
| gr.Dropdown(list(language_options.keys()), label="Your Native Language (L1)"), | |
| gr.Dropdown(list(language_options.keys()), label="Target Language (L2)") | |
| ], | |
| outputs=[ | |
| gr.Textbox(label="Generated Caption (L2)"), | |
| gr.Audio(label="Listen to the Caption"), | |
| gr.Textbox(label="Generated Caption (L1)") | |
| ], | |
| title="Image Caption Generator for Language Learning", | |
| description="Upload an image, select your native language (L1) and target language (L2), and get a generated caption with text-to-speech audio." | |
| ) | |
| # Launch Gradio | |
| interface.launch() | |