g19_project / pages /Visualization.py
Emil25's picture
Update pages/Visualization.py
4ccd2d3
import io
import json
import os
import time
from PIL import Image
import requests
import streamlit as st
# API для генерации изображения
API_URL_IMG = "https://api-inference.huggingface.co" \
"/models/playgroundai/playground-v2-1024px-aesthetic"
API_URL_SPE = "https://api-inference.huggingface.co" \
"/models/facebook/mms-tts-eng"
TOKEN = os.getenv('API_TOKEN')
HEADERS = {"Authorization": TOKEN}
st.set_page_config(page_title="Student Assistant")
if 'clicked_button' not in st.session_state:
st.session_state.clicked_button = False
if 'generated_image' not in st.session_state:
st.session_state.generated_image = None
def click_button():
st.session_state.clicked_button = True
st.session_state.generated_image = None
def hugging_api_request(url, payload):
response = requests.post(url, headers=HEADERS, json=payload, timeout=120)
if response.status_code == 500:
st.exception(RuntimeError(f'{response} {url.split("/")[-1]}'
' is currently unavailable'))
return
try:
body = response.json()
except json.JSONDecodeError:
return response.content
if 'error' in body:
print(response.status_code, body)
if 'estimated_time' in body:
st.info('Модель загружается. Она будет доступна '
f'через {body["estimated_time"]} сек.')
time.sleep(body['estimated_time'])
else:
return
hugging_api_request(url, payload)
return body
# Функция генерации изображения
def generate_img(payload) -> io.BytesIO:
return hugging_api_request(API_URL_IMG, payload)
def generate_speech(payload) -> io.BytesIO:
return hugging_api_request(API_URL_SPE, payload)
st.markdown('# :female-student: Персональный помощник для студентов')
st.divider()
st.markdown("# :sparkles: Изучение английского языка"
" через визуальное и аудио восприятие")
image_idea = st.text_input('Предложите свою тему для генерации изображения',
value="Astronaut riding a horse")
image_gen_btn = st.button('Генерировать изображение', on_click=click_button)
if st.session_state.clicked_button:
if not st.session_state.generated_image:
with st.spinner('Идёт загрузка изображения...'):
image_bytes = generate_img({"inputs": image_idea})
image_raw = io.BytesIO(image_bytes)
st.success('Готово')
st.session_state.generated_image = image_raw
st.image(st.session_state.generated_image)
st.markdown('## Опишите фотографию на английском языке')
st.markdown('## План ответа поможет вам:')
st.markdown('+ the place;')
st.markdown('+ the action;')
st.markdown('+ the person’s appearance;')
st.markdown('+ whether you like the picture or not;')
st.markdown('+ why.')
st.markdown('Start with: “I’d like to describe this picture.'
' The picture shows …” ')
st.divider()
description_text = st.text_area(
'Описание фотографии',
key='t_area', height=250,
placeholder=(
'I’d like to describe this picture.'
' The picture shows …'))
tts_gen_btn = st.button('Произнести текст')
if tts_gen_btn and description_text:
with st.spinner('Идёт загрузка аудио...'):
audio_bytes = generate_speech({
"inputs": description_text
})
if isinstance(audio_bytes, bytes):
st.audio(audio_bytes, format='audio/ogg')
else:
st.warning('Что-то пошло не так, попробуйте еще раз.')
st.success('Готово')