Spaces:
Build error
Build error
| # blogger.py | |
| import os | |
| import pyperclip | |
| import streamlit as st | |
| from dotenv import load_dotenv | |
| import speech_recognition as sr | |
| import google.generativeai as genai | |
| from langchain.prompts import PromptTemplate | |
| from langchain_google_genai import ChatGoogleGenerativeAI | |
| class Blog(object): | |
| def __init__(self, title="AI Blogger"): | |
| self.title = title | |
| def model(): | |
| genai.configure(api_key=os.getenv("GOOGLE_API_KEY")) | |
| return ChatGoogleGenerativeAI(model="gemini-pro") | |
| def getLLamaresponse(llm, input_text, tone, lang, blog_style, no_words, doc='', info=''): | |
| template = """ | |
| Write a {tone} blog in {lang} as {blog_style} for a topic {input_text} within {no_words} words with references and video links also if possible and ends with a conclusion. {info} {doc} | |
| """.format(tone=tone, lang=lang, blog_style=blog_style, input_text=input_text, | |
| no_words=no_words,doc=doc, info=info) | |
| response = llm.invoke(template) | |
| return response.content | |
| def copy_text(answer, copy_button=False): | |
| pyperclip.copy(answer) | |
| if copy_button: | |
| st.toast("Text copied to clipboard!", icon="π") | |
| def record_audio(): | |
| r = sr.Recognizer() | |
| with st.spinner("Recording..."): | |
| with sr.Microphone() as source: | |
| r.adjust_for_ambient_noise(source) | |
| with st.spinner("Say Something..."): | |
| audio = r.listen(source, timeout=5) | |
| with st.spinner("Processing..."): | |
| try: | |
| text = r.recognize_google(audio) | |
| st.session_state['input_text'] = text | |
| return text | |
| except sr.UnknownValueError: | |
| st.write("Sorry, I could not understand what you said. Please try again or write in text box.") | |
| return "" | |
| except sr.RequestError as e: | |
| st.write(f"Could not request results; {e}") | |
| return "" | |
| def input_state(input_text): | |
| if isinstance(input_text, str): | |
| st.session_state['input_text'] = input_text | |
| def run_blogger(doc=''): | |
| load_dotenv() | |
| blog = Blog() | |
| st.header(blog.title + " π€", divider='rainbow') | |
| hide_streamlit_style = """ | |
| <style> | |
| #MainMenu {visibility: hidden;} | |
| footer {visibility: hidden;} | |
| </style> | |
| """ | |
| st.markdown(hide_streamlit_style, unsafe_allow_html=True) | |
| button_disabled = True | |
| if button_disabled: | |
| st.toast("Mic Button is disabled in production. HF Don't have Audio Device") | |
| col1, col2 = st.columns([20, 3]) | |
| with col1: | |
| text = st.empty() | |
| input_text = text.text_input("Enter the Blog Topic") | |
| with col2: | |
| recorder = st.button("ποΈ", help="Blog Topic by Voice", key="mic", disabled=button_disabled) | |
| if recorder: | |
| recorded_text = blog.record_audio() | |
| if recorded_text: | |
| input_text = text.text_input("Enter the Blog Topic", value=recorded_text) | |
| if doc: | |
| input_text = text.text_area("Enter the Blog Topic", value=doc) | |
| input_text = "Reference: "+ input_text | |
| with st.sidebar: | |
| st.title(' :blue[_AI Generated Blog_] π€') | |
| st.subheader('Parameters') | |
| no_words = st.sidebar.slider('Maximum Characters', min_value=100, max_value=5000, value=1000, step=100) | |
| blog_style = st.selectbox('Writing the blog for', ('Researchers', 'Data Scientist', 'Common People'), index=0) | |
| tone = st.selectbox('Desired Tone', ('Informative', 'Casual', 'Persuasive', 'Formal', 'Humorous'), index=0) | |
| lang = st.text_input('Language', 'English') | |
| info = st.text_area('Specific Instruction') | |
| with st.spinner("Loading Model..."): | |
| llm = blog.model() | |
| submit = st.button("Generate Blog", on_click=lambda: blog.input_state(input_text)) | |
| if submit: | |
| with st.spinner("Generating Blog..."): | |
| answer = blog.getLLamaresponse(llm, st.session_state['input_text'], tone, lang, blog_style, no_words, doc, info) | |
| st.success('Blog Generated!', icon="β ") | |
| st.write(answer) | |
| st.markdown(''':orange[Run in your system to access Copy to Clipboard Feature]''') | |
| if __name__ == "__main__": | |
| run_blogger() | |