Spaces:
Build error
Build error
| import streamlit as st | |
| from openai import OpenAI | |
| from PIL import Image | |
| import io | |
| import os | |
| import uuid | |
| from gtts import gTTS | |
| import cv2 | |
| import numpy as np | |
| import base64 | |
| # --- Configuration --- | |
| API_KEY = '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' | |
| client = OpenAI( | |
| base_url="https://openrouter.ai/api/v1", | |
| api_key=API_KEY | |
| ) | |
| # --- Helper Functions --- | |
| def describe_image(image_bytes): | |
| # Convert to base64 | |
| base64_image = base64.b64encode(image_bytes).decode('utf-8') | |
| response = client.chat.completions.create( | |
| model="opengvlab/internvl3-14b:free", | |
| messages=[ | |
| { | |
| "role": "user", | |
| "content": [ | |
| {"type": "text", "text": "Describe this image clearly, including objects, scene, and any visible text. Also warn about potential hazards."}, | |
| {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}} | |
| ] | |
| } | |
| ] | |
| ) | |
| return response.choices[0].message.content | |
| def speak(text, filename=None): | |
| if not filename: | |
| filename = f"audio_{uuid.uuid4()}.mp3" | |
| tts = gTTS(text=text, lang='en') | |
| tts.save(filename) | |
| return filename | |
| # --- Streamlit UI --- | |
| st.set_page_config(page_title="AI Visual Assistant for the Blind", layout="centered") | |
| st.title("ποΈ AI Visual Assistant for the Blind") | |
| st.markdown("Use your **camera** to capture the world around you.") | |
| st.subheader("πΈ Take a Picture") | |
| camera_image = st.camera_input("Capture a frame from your camera") | |
| if camera_image is not None: | |
| st.image(camera_image, caption="Captured Frame", use_column_width=True) | |
| with st.spinner("Analyzing the scene..."): | |
| # Read the image bytes directly | |
| image_bytes = camera_image.getvalue() | |
| description = describe_image(image_bytes) | |
| st.subheader("π Description") | |
| st.write(description) | |
| st.subheader("π Audio Narration") | |
| audio_file = speak(description) | |
| audio_bytes = open(audio_file, 'rb').read() | |
| st.audio(audio_bytes, format='audio/mp3') | |
| # Cleanup | |
| os.remove(audio_file) | |
| st.markdown("---") | |
| st.markdown("*Built with π‘ using Streamlit, OpenRouter, and gTTS.*") |