demorrha / app.py
ImPolymath's picture
Update app.py
82907e7 verified
raw
history blame
4.13 kB
import streamlit as st
from openai import OpenAI
from os import getenv
from audiorecorder import audiorecorder
import tempfile
import base64
# fonction pour lire et retourner le contenu de fichiers textes
def lire_fichier(nom_fichier):
try:
with open(nom_fichier, 'r', encoding='utf-8') as fichier:
contenu = fichier.read()
return contenu
except FileNotFoundError:
return f"Erreur : Le fichier '{nom_fichier}' n'a pas été trouvé."
except Exception as e:
return f"Une erreur s'est produite lors de la lecture du fichier : {str(e)}"
# Configuration de la clé API OpenAI
client = OpenAI(api_key=getenv("OPENAI_API_KEY"))
# Définition du prompt système initial
SYSTEM_PROMPT = f"{lire_fichier('linguascribe.prompt')}"
def transcribe_audio(audio_file):
with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as temp_audio:
audio_file.export(temp_audio.name, format="wav")
with open(temp_audio.name, "rb") as audio_file:
transcript = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file
)
return transcript.text
def text_to_speech(text):
response = client.audio.speech.create(
model="tts-1",
voice="onyx",
input=text
)
# Sauvegarder l'audio dans un fichier temporaire
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as temp_audio:
response.stream_to_file(temp_audio.name)
# Lire le contenu du fichier audio
with open(temp_audio.name, "rb") as audio_file:
audio_bytes = audio_file.read()
return audio_bytes
def process_message(message, operation_prompt="", is_audio_input=False):
payload_content = f'{operation_prompt} :\n\"\"\"\n{message}\n\"\"\"'
st.session_state.messages.append({"role": "user", "content": payload_content})
with st.chat_message("user"):
st.markdown(message)
with st.chat_message("assistant"):
message_placeholder = st.empty()
full_response = ""
for response in client.chat.completions.create(
model="gpt-4o",
messages=st.session_state.messages,
stream=True,
temperature=0.1,
):
full_response += (response.choices[0].delta.content or "")
message_placeholder.markdown(full_response + "▌")
message_placeholder.markdown(full_response)
st.session_state.messages.append({"role": "assistant", "content": full_response})
if is_audio_input:
tts_audio = text_to_speech(full_response)
st.audio(tts_audio, format="audio/mp3", autoplay=True)
def main():
st.title("Application de Chat avec GPT-4")
# Initialisation de l'historique des messages avec le prompt système
if "messages" not in st.session_state:
st.session_state.messages = [
{"role": "system", "content": SYSTEM_PROMPT}
]
# Affichage de l'historique des messages (sauf le message système)
for message in st.session_state.messages[1:]:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# Interface utilisateur pour le chat
user_input = st.chat_input("Entrez votre message ici:")
OP_PROMPT = "Translate(fr_FR to en_US)"
# Ajout de l'enregistreur audio
st.write("Ou enregistrez votre message audio :")
audio = audiorecorder("Cliquez pour enregistrer", "Cliquez pour arrêter l'enregistrement")
if user_input:
process_message(user_input, operation_prompt=f"{OP_PROMPT}")
if len(audio) > 0:
# st.audio(audio.export().read(), autoplay=False)
transcription = transcribe_audio(audio)
st.write(f"Transcription : {transcription}")
process_message(transcription, operation_prompt=f"{OP_PROMPT}", is_audio_input=True)
st.sidebar.markdown("## À propos")
st.sidebar.info("Cette application utilise Streamlit et OpenAI GPT-4 pour créer un chat interactif avec un modèle de langage avancé.")
if __name__ == "__main__":
main()