I have problem with this message a start app. My project is private. But I send my teste app here:
import streamlit as st
import openai
from langchain import OpenAI, PromptTemplate, LLMChain
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains.question_answering import load_qa_chain
from docx import Document
from dotenv import load_dotenv, find_dotenv
from pathlib import Path
import queue
import time
from streamlit_webrtc import WebRtcMode, webrtc_streamer
import pydub
from questions import questions
# Configuração da API OpenAI
_ = load_dotenv(find_dotenv())
client = openai.Client()
PASTA_TEMP = Path(__file__).parent / 'temp'
PASTA_TEMP.mkdir(exist_ok=True)
ARQUIVO_AUDIO_TEMP = PASTA_TEMP / 'audio.mp3'
ARQUIVO_MIC_TEMP = PASTA_TEMP / 'mic.mp3'
client = openai.OpenAI()
# TRANSCREVE MICROFONE =====================================
def transcreve_audio(caminho_audio, prompt):
with open(caminho_audio, 'rb') as arquivo_audio:
transcricao = client.audio.transcriptions.create(
model='whisper-1',
language='pt',
response_format='text',
file=arquivo_audio,
prompt=prompt,
)
return transcricao
@st.cache_data
def get_ice_servers():
return [{'urls': ['stun:stun.l.google.com:19302']}]
def adiciona_chunck_de_audio(frames_de_audio, chunck_audio):
for frame in frames_de_audio:
sound = pydub.AudioSegment(
data=frame.to_ndarray().tobytes(),
sample_width=frame.format.bytes,
frame_rate=frame.sample_rate,
channels=len(frame.layout.channels)
)
chunck_audio += sound
return chunck_audio
def transcreve_tab_mic():
prompt_mic = st.text_input(
'(opcional) Digite o seu prompt', key='input_mic', label_visibility="visible")
webrtx_ctx = webrtc_streamer(
key='recebe_audio',
mode=WebRtcMode.SENDONLY,
audio_receiver_size=1024,
media_stream_constraints={'video': False, 'audio': True}
)
if not webrtx_ctx.state.playing:
st.write(st.session_state['transcricao_mic'])
return
container = st.empty()
container.markdown('Comece a falar...')
chunck_audio = pydub.AudioSegment.empty()
tempo_ultima_transcricao = time.time()
st.session_state['transcricao_mic'] = ''
while True:
if webrtx_ctx.audio_receiver:
try:
frames_de_audio = webrtx_ctx.audio_receiver.get_frames(
timeout=1)
except queue.Empty:
time.sleep(0.1)
continue
chunck_audio = adiciona_chunck_de_audio(
frames_de_audio, chunck_audio)
agora = time.time()
if len(chunck_audio) > 0 and agora - tempo_ultima_transcricao > 5:
tempo_ultima_transcricao = agora
chunck_audio.export(ARQUIVO_MIC_TEMP)
transcricao = transcreve_audio(ARQUIVO_MIC_TEMP, prompt_mic)
st.session_state['transcricao_mic'] += transcricao
container.write(st.session_state['transcricao_mic'])
chunck_audio = pydub.AudioSegment.empty()
else:
break
# TRANSCREVE AUDIO =====================================
def transcreve_tab_audio():
arquivo_audio = st.file_uploader(
'Adicione um arquivo de áudio .mp3', type=['mp3'])
if not arquivo_audio is None:
transcricao = client.audio.transcriptions.create(
model='whisper-1',
language='pt',
response_format='text',
file=arquivo_audio,
)
st.write(transcricao)
# Função para gerar texto usando GPT
def generate_text(prompt):
llm = OpenAI(temperature=0.7)
template = """
Você é um assistente especializado em patentes. Use as informações fornecidas para gerar um texto apropriado:
{prompt}
"""
prompt_template = PromptTemplate(
template=template, input_variables=["prompt"])
llm_chain = LLMChain(prompt=prompt_template, llm=llm)
return llm_chain.run(prompt)
# Função para salvar em DOCX
def save_to_docx(content):
doc = Document()
for section, text in content.items():
doc.add_heading(section, level=1)
doc.add_paragraph(text)
doc.save("download/patente.docx")
# Inicialização do estado da sessão
if 'page' not in st.session_state:
st.session_state.page = 0
if 'responses' not in st.session_state:
st.session_state.responses = {}
if 'current_generated_text' not in st.session_state:
st.session_state.current_generated_text = ""
if not 'transcricao_mic' in st.session_state:
st.session_state['transcricao_mic'] = ''
# Função principal do Streamlit
def main():
st.empty() # Limpa o cache
st.title("ISAIA'S - Assistente de Redação de Patentes")
# Sidebar com mensagem de boas-vindas
st.sidebar.header("SEJA BEM VINDO!")
st.sidebar.write("Olá! Eu sou a **IA Isaia's** e estou aqui para te ajudar a descrever sua redação de patente. Vamos tornar esse processo divertido e eficiente, e em pouco tempo você terá seu projeto pronto para ser submetido ao INPI - Instituto Nacional de Propriedade Intelectual.")
st.sidebar.markdown(
"Para isso, preciso que você descreva seu invento com o máximo de detalhes possível em cada etapa. Todas as informações são importantes. Vamos começar?")
if st.session_state.page < len(questions):
current_question = questions[st.session_state.page]
st.write(f"Pergunta {st.session_state.page + 1} de {len(questions)}")
st.subheader(
f"Pergunta {st.session_state.page + 1}: {current_question}")
# Tratamento especial para a primeira pergunta
if st.session_state.page == 0:
st.write(
"*Selecione uma ou mais opções de acordo com o seu projeto e o que visa buscar a proteção.*")
options = st.multiselect(
"", ["Produto", "Equipamento", "Processo", "Sistema"])
text_input = ", ".join(options) if options else ""
else:
# Opção de entrada de texto
text_input = st.text_area(
"Digite sua resposta: ", label_visibility="visible")
col1, col2 = st.columns(2)
with col1:
if st.button("VOLTAR") and st.session_state.page > 0:
st.session_state.responses[current_question] = text_input
st.session_state.page -= 1
st.session_state.current_generated_text = ""
st.experimental_rerun()
with col2:
if st.button("AVANÇAR"):
if text_input:
st.session_state.responses[current_question] = text_input
st.session_state.page += 1
st.session_state.current_generated_text = ""
st.experimental_rerun()
else:
st.warning(
"Por favor, forneça uma resposta antes de avançar.")
# Botão para gerar texto, exceto na primeira pergunta
if st.session_state.page > 0:
if st.button("Gerar Texto com IA"):
st.session_state.current_generated_text = generate_text(
text_input)
st.experimental_rerun()
tab_mic, tab_audio = st.tabs(['Microfone', 'Áudio'])
with tab_mic:
st.session_state.responses[current_question] = transcreve_tab_mic()
st.session_state.page += 1
st.session_state.current_generated_text = ""
st.experimental_rerun()
with tab_audio:
st.session_state.responses[current_question] = transcreve_tab_audio(
)
st.session_state.page += 1
st.session_state.current_generated_text = ""
st.experimental_rerun()
# Exibição do texto gerado
if st.session_state.current_generated_text:
st.write("Texto gerado:")
st.text_area("", st.session_state.current_generated_text,
height=300, label_visibility="visible")
col1, col2 = st.columns(2)
with col1:
if st.button("Aceitar e Avançar"):
st.session_state.responses[
f"{current_question} (Gerado por IA)"] = st.session_state.current_generated_text
st.session_state.page += 1
st.session_state.current_generated_text = ""
st.experimental_rerun()
with col2:
if st.button("Reescrever"):
st.session_state.current_generated_text = generate_text(
text_input)
st.experimental_rerun()
else:
st.write("Todas as perguntas foram respondidas!")
if st.button("Gerar Documento"):
save_to_docx(st.session_state.responses)
st.success("Documento gerado com sucesso!")
if __name__ == "__main__":
main()
Version: Python 3.11
ipykernel==6.29.4
langchain==0.1.16
langchain-community==0.0.34
langchain-openai==0.1.4
openai==1.24.0
pypdf==4.2.0
streamlit==1.29.0
streamlit_authenticator==0.2.3
psycopg2==2.9.9
python-dotenv==1.0.1
faiss-cpu==1.8.0
streamlit_webrtc
pydub
python-docx==1.1.2
Document
exceptions