Spaces:
Paused
Paused
rick
commited on
update demorrha
Browse files
app.py
CHANGED
|
@@ -5,10 +5,10 @@ from audiorecorder import audiorecorder
|
|
| 5 |
import tempfile
|
| 6 |
import base64
|
| 7 |
|
| 8 |
-
# Configuration
|
| 9 |
client = OpenAI(api_key=getenv("OPENAI_API_KEY"))
|
| 10 |
|
| 11 |
-
#
|
| 12 |
def lire_fichier(nom_fichier):
|
| 13 |
try:
|
| 14 |
with open(nom_fichier, 'r', encoding='utf-8') as fichier:
|
|
@@ -19,6 +19,7 @@ def lire_fichier(nom_fichier):
|
|
| 19 |
except Exception as e:
|
| 20 |
return f"Une erreur s'est produite lors de la lecture du fichier : {str(e)}"
|
| 21 |
|
|
|
|
| 22 |
def transcribe_audio(audio_file, language=None):
|
| 23 |
with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as temp_audio:
|
| 24 |
audio_file.export(temp_audio.name, format="wav")
|
|
@@ -32,12 +33,13 @@ def transcribe_audio(audio_file, language=None):
|
|
| 32 |
|
| 33 |
return transcript.text
|
| 34 |
|
|
|
|
| 35 |
def language_detection(input_text, temperature=0.01):
|
| 36 |
system_prompt = "".join([
|
| 37 |
"Je souhaite que vous agissiez en tant que fonction linguistique.",
|
| 38 |
"Je m'exprimerai dans n'importe quelle langue, et vous en détecterez la langue.",
|
| 39 |
-
"Vous fournirez le
|
| 40 |
-
"Votre
|
| 41 |
"La langue de l'audio d'entrée. Fournir la langue d'entrée au format ISO-639-1 améliorera la précision et la latence."
|
| 42 |
])
|
| 43 |
response = client.chat.completions.create(
|
|
@@ -56,7 +58,7 @@ def language_detection(input_text, temperature=0.01):
|
|
| 56 |
)
|
| 57 |
return response.choices[0].message.content
|
| 58 |
|
| 59 |
-
|
| 60 |
def text_to_speech(text):
|
| 61 |
response = client.audio.speech.create(
|
| 62 |
model="tts-1",
|
|
@@ -74,6 +76,7 @@ def text_to_speech(text):
|
|
| 74 |
|
| 75 |
return audio_bytes
|
| 76 |
|
|
|
|
| 77 |
def process_message(message, operation_prompt="", is_audio_input=False):
|
| 78 |
payload_content = f'{operation_prompt} :\n\"\"\"\n{message}\n\"\"\"'
|
| 79 |
|
|
@@ -100,30 +103,28 @@ def process_message(message, operation_prompt="", is_audio_input=False):
|
|
| 100 |
tts_audio = text_to_speech(full_response)
|
| 101 |
st.audio(tts_audio, format="audio/mp3", autoplay=True)
|
| 102 |
|
| 103 |
-
#
|
| 104 |
class GlobalSystemPrompts:
|
| 105 |
-
#
|
| 106 |
-
# Définition des prompts système globaux pour différentes fonctionnalités
|
| 107 |
-
# Chaque méthode retourne un prompt système spécifique
|
| 108 |
def linguascribe():
|
| 109 |
SYSTEM_PROMPT = f"{lire_fichier('linguascribe.prompt')}"
|
| 110 |
return SYSTEM_PROMPT
|
| 111 |
|
|
|
|
| 112 |
SYSTEM_PROMPT=""
|
| 113 |
OP_PROMPT=""
|
| 114 |
|
| 115 |
-
|
|
|
|
| 116 |
global SYSTEM_PROMPT
|
| 117 |
global OP_PROMPT
|
| 118 |
SYSTEM_PROMPT=GlobalSystemPrompts.linguascribe()
|
| 119 |
OP_PROMPT = f"Translate({from_lang} to {dest_lang})"
|
| 120 |
-
return {
|
| 121 |
-
"system_prompt": SYSTEM_PROMPT,
|
| 122 |
-
"operation_prompt": OP_PROMPT
|
| 123 |
-
}
|
| 124 |
|
|
|
|
| 125 |
SUPPORTED_LANGUAGES=["Afrikaans", "Arabic", "Armenian", "Azerbaijani", "Belarusian", "Bosnian", "Bulgarian", "Catalan", "Chinese", "Croatian", "Czech", "Danish", "Dutch", "English", "Estonian", "Finnish", "French", "Galician", "German", "Greek", "Hebrew", "Hindi", "Hungarian", "Icelandic", "Indonesian", "Italian", "Japanese", "Kannada", "Kazakh", "Korean", "Latvian", "Lithuanian", "Macedonian", "Malay", "Marathi", "Maori", "Nepali", "Norwegian", "Persian", "Polish", "Portuguese", "Romanian", "Russian", "Serbian", "Slovak", "Slovenian", "Spanish", "Swahili", "Swedish", "Tagalog", "Tamil", "Thai", "Turkish", "Ukrainian", "Urdu", "Vietnamese", "Welsh"]
|
| 126 |
|
|
|
|
| 127 |
def convert_language_name_to_iso6391(language_name):
|
| 128 |
# Dictionnaire de correspondance entre les noms de langues et les codes ISO 639-1
|
| 129 |
language_to_iso = {
|
|
@@ -147,7 +148,7 @@ def convert_language_name_to_iso6391(language_name):
|
|
| 147 |
# Retourne le code ISO 639-1 correspondant au nom de la langue
|
| 148 |
return language_to_iso.get(language_name, "en") # Par défaut, retourne 'en' si la langue n'est pas trouvée
|
| 149 |
|
| 150 |
-
|
| 151 |
def main():
|
| 152 |
st.title("------- DEMORRHA -------")
|
| 153 |
|
|
@@ -161,6 +162,7 @@ def main():
|
|
| 161 |
if "target_language" not in st.session_state:
|
| 162 |
st.session_state.target_language = "en"
|
| 163 |
|
|
|
|
| 164 |
if "translation" == st.session_state["process_mode"]:
|
| 165 |
set_mode_translation(from_lang=st.session_state.language_detected, dest_lang=st.session_state.target_language)
|
| 166 |
|
|
@@ -175,39 +177,41 @@ def main():
|
|
| 175 |
with st.chat_message(message["role"]):
|
| 176 |
st.markdown(message["content"])
|
| 177 |
|
| 178 |
-
# Interface utilisateur pour le chat
|
| 179 |
user_input = st.chat_input("Entrez votre message ici:")
|
| 180 |
|
| 181 |
-
|
| 182 |
-
# Ajout de l'enregistreur audio
|
| 183 |
st.write("Ou enregistrez votre message audio :")
|
| 184 |
audio = audiorecorder("Cliquez pour enregistrer", "Cliquez pour arrêter l'enregistrement")
|
| 185 |
|
|
|
|
| 186 |
if user_input:
|
| 187 |
process_message(user_input, operation_prompt=f"{OP_PROMPT}")
|
| 188 |
|
|
|
|
| 189 |
if len(audio) > 0:
|
| 190 |
-
# st.audio(audio.export().read(), autoplay=False)
|
| 191 |
transcription = transcribe_audio(audio, language=st.session_state.language_detected)
|
| 192 |
if None == st.session_state.language_detected:
|
| 193 |
st.session_state.language_detected = language_detection(input_text=transcription, temperature=0.01)
|
| 194 |
-
st.write(f"
|
| 195 |
st.write(f"Transcription : {transcription}")
|
| 196 |
process_message(transcription, operation_prompt=f"{OP_PROMPT}", is_audio_input=True)
|
| 197 |
|
|
|
|
| 198 |
with st.sidebar:
|
| 199 |
st.header("DEMORRHA - v1")
|
| 200 |
st.markdown("## À propos")
|
| 201 |
st.info("\n".join([
|
| 202 |
-
"Cette application utilise Streamlit et l'API
|
| 203 |
-
"Cet outil a pour objectif de montrer la voie dans un acte saint de la
|
| 204 |
-
"Abattre les
|
| 205 |
]))
|
| 206 |
|
| 207 |
-
#
|
| 208 |
def on_language_change():
|
| 209 |
st.session_state.target_language = convert_language_name_to_iso6391(st.session_state.language_selector)
|
| 210 |
|
|
|
|
| 211 |
st.selectbox(
|
| 212 |
label="Choisissez la langue de destination",
|
| 213 |
options=tuple(SUPPORTED_LANGUAGES),
|
|
@@ -217,5 +221,6 @@ def main():
|
|
| 217 |
index=SUPPORTED_LANGUAGES.index("English")
|
| 218 |
)
|
| 219 |
|
|
|
|
| 220 |
if __name__ == "__main__":
|
| 221 |
main()
|
|
|
|
| 5 |
import tempfile
|
| 6 |
import base64
|
| 7 |
|
| 8 |
+
# Configuration du client OpenAI avec la clé API
|
| 9 |
client = OpenAI(api_key=getenv("OPENAI_API_KEY"))
|
| 10 |
|
| 11 |
+
# Fonction pour lire et retourner le contenu de fichiers textes
|
| 12 |
def lire_fichier(nom_fichier):
|
| 13 |
try:
|
| 14 |
with open(nom_fichier, 'r', encoding='utf-8') as fichier:
|
|
|
|
| 19 |
except Exception as e:
|
| 20 |
return f"Une erreur s'est produite lors de la lecture du fichier : {str(e)}"
|
| 21 |
|
| 22 |
+
# Fonction pour transcrire l'audio en texte
|
| 23 |
def transcribe_audio(audio_file, language=None):
|
| 24 |
with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as temp_audio:
|
| 25 |
audio_file.export(temp_audio.name, format="wav")
|
|
|
|
| 33 |
|
| 34 |
return transcript.text
|
| 35 |
|
| 36 |
+
# Fonction pour détecter la langue d'un texte donné
|
| 37 |
def language_detection(input_text, temperature=0.01):
|
| 38 |
system_prompt = "".join([
|
| 39 |
"Je souhaite que vous agissiez en tant que fonction linguistique.",
|
| 40 |
"Je m'exprimerai dans n'importe quelle langue, et vous en détecterez la langue.",
|
| 41 |
+
"Vous fournirez le résultat de votre détection au format ISO-639-1.",
|
| 42 |
+
"Votre réponse doit représenter l'argument `language` et contenir seulement sa valeur de type chaîne de caractères.",
|
| 43 |
"La langue de l'audio d'entrée. Fournir la langue d'entrée au format ISO-639-1 améliorera la précision et la latence."
|
| 44 |
])
|
| 45 |
response = client.chat.completions.create(
|
|
|
|
| 58 |
)
|
| 59 |
return response.choices[0].message.content
|
| 60 |
|
| 61 |
+
# Fonction pour convertir du texte en parole
|
| 62 |
def text_to_speech(text):
|
| 63 |
response = client.audio.speech.create(
|
| 64 |
model="tts-1",
|
|
|
|
| 76 |
|
| 77 |
return audio_bytes
|
| 78 |
|
| 79 |
+
# Fonction pour traiter les messages de l'utilisateur et générer une réponse
|
| 80 |
def process_message(message, operation_prompt="", is_audio_input=False):
|
| 81 |
payload_content = f'{operation_prompt} :\n\"\"\"\n{message}\n\"\"\"'
|
| 82 |
|
|
|
|
| 103 |
tts_audio = text_to_speech(full_response)
|
| 104 |
st.audio(tts_audio, format="audio/mp3", autoplay=True)
|
| 105 |
|
| 106 |
+
# Classe pour stocker les prompts système globaux
|
| 107 |
class GlobalSystemPrompts:
|
| 108 |
+
# Méthode pour récupérer le prompt système pour la fonctionnalité Linguascribe
|
|
|
|
|
|
|
| 109 |
def linguascribe():
|
| 110 |
SYSTEM_PROMPT = f"{lire_fichier('linguascribe.prompt')}"
|
| 111 |
return SYSTEM_PROMPT
|
| 112 |
|
| 113 |
+
# Variables globales pour les prompts
|
| 114 |
SYSTEM_PROMPT=""
|
| 115 |
OP_PROMPT=""
|
| 116 |
|
| 117 |
+
# Fonction pour configurer le mode de traduction
|
| 118 |
+
def set_mode_translation(from_lang, dest_lang):
|
| 119 |
global SYSTEM_PROMPT
|
| 120 |
global OP_PROMPT
|
| 121 |
SYSTEM_PROMPT=GlobalSystemPrompts.linguascribe()
|
| 122 |
OP_PROMPT = f"Translate({from_lang} to {dest_lang})"
|
|
|
|
|
|
|
|
|
|
|
|
|
| 123 |
|
| 124 |
+
# Liste des langues supportées par l'application
|
| 125 |
SUPPORTED_LANGUAGES=["Afrikaans", "Arabic", "Armenian", "Azerbaijani", "Belarusian", "Bosnian", "Bulgarian", "Catalan", "Chinese", "Croatian", "Czech", "Danish", "Dutch", "English", "Estonian", "Finnish", "French", "Galician", "German", "Greek", "Hebrew", "Hindi", "Hungarian", "Icelandic", "Indonesian", "Italian", "Japanese", "Kannada", "Kazakh", "Korean", "Latvian", "Lithuanian", "Macedonian", "Malay", "Marathi", "Maori", "Nepali", "Norwegian", "Persian", "Polish", "Portuguese", "Romanian", "Russian", "Serbian", "Slovak", "Slovenian", "Spanish", "Swahili", "Swedish", "Tagalog", "Tamil", "Thai", "Turkish", "Ukrainian", "Urdu", "Vietnamese", "Welsh"]
|
| 126 |
|
| 127 |
+
# Fonction pour convertir le nom d'une langue en code ISO 639-1
|
| 128 |
def convert_language_name_to_iso6391(language_name):
|
| 129 |
# Dictionnaire de correspondance entre les noms de langues et les codes ISO 639-1
|
| 130 |
language_to_iso = {
|
|
|
|
| 148 |
# Retourne le code ISO 639-1 correspondant au nom de la langue
|
| 149 |
return language_to_iso.get(language_name, "en") # Par défaut, retourne 'en' si la langue n'est pas trouvée
|
| 150 |
|
| 151 |
+
# Fonction principale de l'application
|
| 152 |
def main():
|
| 153 |
st.title("------- DEMORRHA -------")
|
| 154 |
|
|
|
|
| 162 |
if "target_language" not in st.session_state:
|
| 163 |
st.session_state.target_language = "en"
|
| 164 |
|
| 165 |
+
# Configuration du mode de traduction si nécessaire
|
| 166 |
if "translation" == st.session_state["process_mode"]:
|
| 167 |
set_mode_translation(from_lang=st.session_state.language_detected, dest_lang=st.session_state.target_language)
|
| 168 |
|
|
|
|
| 177 |
with st.chat_message(message["role"]):
|
| 178 |
st.markdown(message["content"])
|
| 179 |
|
| 180 |
+
# Interface utilisateur pour le chat textuel
|
| 181 |
user_input = st.chat_input("Entrez votre message ici:")
|
| 182 |
|
| 183 |
+
# Interface utilisateur pour l'enregistrement audio
|
|
|
|
| 184 |
st.write("Ou enregistrez votre message audio :")
|
| 185 |
audio = audiorecorder("Cliquez pour enregistrer", "Cliquez pour arrêter l'enregistrement")
|
| 186 |
|
| 187 |
+
# Traitement du message textuel de l'utilisateur
|
| 188 |
if user_input:
|
| 189 |
process_message(user_input, operation_prompt=f"{OP_PROMPT}")
|
| 190 |
|
| 191 |
+
# Traitement de l'entrée audio de l'utilisateur
|
| 192 |
if len(audio) > 0:
|
|
|
|
| 193 |
transcription = transcribe_audio(audio, language=st.session_state.language_detected)
|
| 194 |
if None == st.session_state.language_detected:
|
| 195 |
st.session_state.language_detected = language_detection(input_text=transcription, temperature=0.01)
|
| 196 |
+
st.write(f"Langue détectée : {st.session_state.language_detected}")
|
| 197 |
st.write(f"Transcription : {transcription}")
|
| 198 |
process_message(transcription, operation_prompt=f"{OP_PROMPT}", is_audio_input=True)
|
| 199 |
|
| 200 |
+
# Configuration de la barre latérale
|
| 201 |
with st.sidebar:
|
| 202 |
st.header("DEMORRHA - v1")
|
| 203 |
st.markdown("## À propos")
|
| 204 |
st.info("\n".join([
|
| 205 |
+
"Cette application utilise Streamlit et l'API d'OpenAI pour créer un chat interactif avec des modèles de langages avancés dans le but de fournir un outil permettant la communication entre les êtres humains.",
|
| 206 |
+
"Cet outil a pour objectif de montrer la voie dans un acte saint de la volonté de son auteur : ",
|
| 207 |
+
"Abattre les barrières linguistiques entre les hommes."
|
| 208 |
]))
|
| 209 |
|
| 210 |
+
# Fonction de rappel pour le changement de langue
|
| 211 |
def on_language_change():
|
| 212 |
st.session_state.target_language = convert_language_name_to_iso6391(st.session_state.language_selector)
|
| 213 |
|
| 214 |
+
# Sélection de la langue de destination
|
| 215 |
st.selectbox(
|
| 216 |
label="Choisissez la langue de destination",
|
| 217 |
options=tuple(SUPPORTED_LANGUAGES),
|
|
|
|
| 221 |
index=SUPPORTED_LANGUAGES.index("English")
|
| 222 |
)
|
| 223 |
|
| 224 |
+
# Point d'entrée de l'application
|
| 225 |
if __name__ == "__main__":
|
| 226 |
main()
|