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="alloy", 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, is_audio_input=False): st.session_state.messages.append({"role": "user", "content": message}) 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") 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:") # 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) if len(audio) > 0: st.audio(audio.export().read()) transcription = transcribe_audio(audio) st.write(f"Transcription : {transcription}") process_message(transcription, 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()