Spaces:
Sleeping
Sleeping
Demosthene-OR
commited on
Commit
•
b05362d
1
Parent(s):
9dc4d02
.....
Browse files
tabs/__pycache__/chatbot_tab.cpython-310.pyc
CHANGED
Binary files a/tabs/__pycache__/chatbot_tab.cpython-310.pyc and b/tabs/__pycache__/chatbot_tab.cpython-310.pyc differ
|
|
tabs/chatbot_tab.py
CHANGED
@@ -3,15 +3,13 @@ import os
|
|
3 |
from datetime import datetime
|
4 |
from extra_streamlit_components import tab_bar, TabBarItemData
|
5 |
import io
|
6 |
-
import base64
|
7 |
from gtts import gTTS
|
8 |
import soundfile as sf
|
9 |
-
import
|
10 |
-
|
11 |
-
import scipy.io.wavfile as wav
|
12 |
import speech_recognition as sr
|
13 |
-
import
|
14 |
-
|
15 |
from translate_app import tr
|
16 |
import getpass
|
17 |
from langchain_mistralai import ChatMistralAI
|
@@ -80,10 +78,11 @@ app = workflow.compile(checkpointer=memory)
|
|
80 |
|
81 |
# @st.cache_data
|
82 |
def init():
|
83 |
-
global config,thread_id, context,human_message1,ai_message1,language, app
|
84 |
|
85 |
thread_id = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
86 |
config = {"configurable": {"thread_id": thread_id}}
|
|
|
87 |
|
88 |
context = """Tu es un Directeur Commercial, mal organisé, d'une entreprise qui commercialise une solution technologique B2B. """
|
89 |
human_message1 = """Je souhaites que nous ayons une conversation verbale entre un commercial de mon entreprise, Marc (moi), et toi que je prospecte.
|
@@ -119,10 +118,11 @@ et mon équipe de vente n'est pas performante.
|
|
119 |
|
120 |
Attention: Ce n'est pas toi qui m'aide, c'est moi qui t'aide avec ma solution.
|
121 |
"""
|
122 |
-
ai_message1 = "J'ai bien compris, je suis un Directeur Commercial prospecté et je réponds seulement à
|
123 |
|
124 |
context = st.text_area(label=tr("Contexte:"), value=context)
|
125 |
human_message1 = st.text_area(label=tr("Consigne"), value=human_message1,height=300)
|
|
|
126 |
messages = [
|
127 |
SystemMessage(content=context),
|
128 |
HumanMessage(content=human_message1),
|
@@ -174,60 +174,10 @@ def play_audio(custom_sentence, Lang_target, speed=1.0):
|
|
174 |
# Lire l'audio dans Streamlit
|
175 |
st.audio(new_audio_stream_bytesio, autoplay=True)
|
176 |
|
177 |
-
def is_silent(data, threshold=0.01):
|
178 |
-
"""Vérifie si le niveau audio est inférieur à un certain seuil (silence)"""
|
179 |
-
return np.abs(data).mean() < threshold
|
180 |
-
|
181 |
-
def record_audio_until_silence(fs=44100, silence_duration=2):
|
182 |
-
# st.write("Enregistrement en cours... Parlez maintenant.")
|
183 |
-
audio_data = []
|
184 |
-
silence_start = None
|
185 |
-
|
186 |
-
while True:
|
187 |
-
# Enregistre un petit bout de son
|
188 |
-
data = sd.rec(int(fs * 2), samplerate=fs, channels=1, dtype='float32')
|
189 |
-
sd.wait()
|
190 |
-
|
191 |
-
# Ajoute le morceau au tableau d'audio
|
192 |
-
audio_data.append(data)
|
193 |
-
|
194 |
-
# Vérifie si le morceau est en silence
|
195 |
-
if is_silent(data):
|
196 |
-
if silence_start is None:
|
197 |
-
silence_start = time.time() # Démarre le chronomètre du silence
|
198 |
-
elif time.time() - silence_start > silence_duration:
|
199 |
-
print("Silence détecté. Fin de l'enregistrement.")
|
200 |
-
break # Arrête l'enregistrement si le silence dure suffisamment longtemps
|
201 |
-
else:
|
202 |
-
silence_start = None # Réinitialise le chronomètre si le son est détecté
|
203 |
-
|
204 |
-
# Convertit la liste de tableaux en un seul tableau NumPy
|
205 |
-
audio_data = np.concatenate(audio_data)
|
206 |
-
audio_data = np.int16(audio_data * 32767)
|
207 |
-
|
208 |
-
# Sauvegarde le fichier audio en format WAV
|
209 |
-
wav.write("enregistrement.wav", fs, audio_data)
|
210 |
-
st.write("Enregistrement sauvegardé")
|
211 |
-
|
212 |
-
def convert_audio_to_text(filename):
|
213 |
-
recognizer = sr.Recognizer()
|
214 |
-
with sr.AudioFile(filename) as source:
|
215 |
-
audio = recognizer.record(source) # Lit le fichier audio
|
216 |
-
|
217 |
-
try:
|
218 |
-
# Utilise l'API Google pour la reconnaissance vocale
|
219 |
-
text = recognizer.recognize_google(audio, language='fr-FR')
|
220 |
-
return text
|
221 |
-
except sr.UnknownValueError:
|
222 |
-
st.write("Google Speech Recognition n'a pas pu comprendre l'audio.")
|
223 |
-
return ""
|
224 |
-
except sr.RequestError as e:
|
225 |
-
st.write(f"Erreur avec le service Google Speech Recognition; {e}")
|
226 |
-
return ""
|
227 |
|
228 |
|
229 |
def run():
|
230 |
-
global thread_id, config
|
231 |
|
232 |
st.write("")
|
233 |
st.write("")
|
@@ -243,7 +193,7 @@ def run():
|
|
243 |
config,thread_id = init()
|
244 |
query = ""
|
245 |
st.button(label=tr("Validez"), type="primary")
|
246 |
-
else:
|
247 |
try:
|
248 |
config
|
249 |
# On ne fait rien
|
@@ -253,27 +203,56 @@ def run():
|
|
253 |
st.write("**thread_id:** "+thread_id)
|
254 |
# query = st.text_area(label=tr("Vendeur:"), value="")
|
255 |
query = ""
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
input_messages = [HumanMessage(query)]
|
262 |
-
|
263 |
-
if query != "":
|
264 |
-
output = app.invoke(
|
265 |
-
{"messages": input_messages, "language": language},
|
266 |
-
config,
|
267 |
-
)
|
268 |
-
st.write("**Prospect :** "+output["messages"][-1].content)
|
269 |
# Fonction pour générer et jouer le texte en speech
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
270 |
|
|
|
|
|
271 |
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
277 |
|
278 |
|
279 |
'''
|
|
|
3 |
from datetime import datetime
|
4 |
from extra_streamlit_components import tab_bar, TabBarItemData
|
5 |
import io
|
|
|
6 |
from gtts import gTTS
|
7 |
import soundfile as sf
|
8 |
+
import wavio
|
9 |
+
from audio_recorder_streamlit import audio_recorder
|
|
|
10 |
import speech_recognition as sr
|
11 |
+
import whisper
|
12 |
+
import numpy as np
|
13 |
from translate_app import tr
|
14 |
import getpass
|
15 |
from langchain_mistralai import ChatMistralAI
|
|
|
78 |
|
79 |
# @st.cache_data
|
80 |
def init():
|
81 |
+
global config,thread_id, context,human_message1,ai_message1,language, app, model_speech
|
82 |
|
83 |
thread_id = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
84 |
config = {"configurable": {"thread_id": thread_id}}
|
85 |
+
model_speech = whisper.load_model("base")
|
86 |
|
87 |
context = """Tu es un Directeur Commercial, mal organisé, d'une entreprise qui commercialise une solution technologique B2B. """
|
88 |
human_message1 = """Je souhaites que nous ayons une conversation verbale entre un commercial de mon entreprise, Marc (moi), et toi que je prospecte.
|
|
|
118 |
|
119 |
Attention: Ce n'est pas toi qui m'aide, c'est moi qui t'aide avec ma solution.
|
120 |
"""
|
121 |
+
ai_message1 = "J'ai bien compris, je suis un Directeur Commercial prospecté et je réponds seulement à tes questions. Je réponds à une seule question à la fois"
|
122 |
|
123 |
context = st.text_area(label=tr("Contexte:"), value=context)
|
124 |
human_message1 = st.text_area(label=tr("Consigne"), value=human_message1,height=300)
|
125 |
+
ai_message1 = st.text_area(label=tr("Réponse du prospect"), value=ai_message1)
|
126 |
messages = [
|
127 |
SystemMessage(content=context),
|
128 |
HumanMessage(content=human_message1),
|
|
|
174 |
# Lire l'audio dans Streamlit
|
175 |
st.audio(new_audio_stream_bytesio, autoplay=True)
|
176 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
177 |
|
178 |
|
179 |
def run():
|
180 |
+
global thread_id, config, model_speech
|
181 |
|
182 |
st.write("")
|
183 |
st.write("")
|
|
|
193 |
config,thread_id = init()
|
194 |
query = ""
|
195 |
st.button(label=tr("Validez"), type="primary")
|
196 |
+
else: # tab2
|
197 |
try:
|
198 |
config
|
199 |
# On ne fait rien
|
|
|
203 |
st.write("**thread_id:** "+thread_id)
|
204 |
# query = st.text_area(label=tr("Vendeur:"), value="")
|
205 |
query = ""
|
206 |
+
audio_bytes = audio_recorder (pause_threshold=2.0, sample_rate=16000, text=tr("Cliquez pour parler, puis attendre 2sec."), \
|
207 |
+
recording_color="#e8b62c", neutral_color="#1ec3bc", icon_size="6x",)
|
208 |
+
|
209 |
+
if audio_bytes:
|
210 |
+
st.write("**"+tr("Vendeur")+" :**\n")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
211 |
# Fonction pour générer et jouer le texte en speech
|
212 |
+
st.audio(audio_bytes, format="audio/wav")
|
213 |
+
try:
|
214 |
+
# Create a BytesIO object from the audio stream
|
215 |
+
audio_stream_bytesio = io.BytesIO(audio_bytes)
|
216 |
+
|
217 |
+
# Read the WAV stream using wavio
|
218 |
+
wav = wavio.read(audio_stream_bytesio)
|
219 |
|
220 |
+
# Extract the audio data from the wavio.Wav object
|
221 |
+
audio_data = wav.data
|
222 |
|
223 |
+
# Convert the audio data to a NumPy array
|
224 |
+
audio_input = np.array(audio_data, dtype=np.float32)
|
225 |
+
audio_input = np.mean(audio_input, axis=1)/32768
|
226 |
+
|
227 |
+
result = model_speech.transcribe(audio_input)
|
228 |
+
Lang_detected = result["language"]
|
229 |
+
query = result["text"]
|
230 |
+
st.write(tr("Langue détectée")+" : "+Lang_detected)
|
231 |
+
# Transcription Whisper (si result a été préalablement calculé)
|
232 |
+
st.write("**Vendeur :** "+query)
|
233 |
+
|
234 |
+
if query != "":
|
235 |
+
input_messages = [HumanMessage(query)]
|
236 |
+
output = app.invoke(
|
237 |
+
{"messages": input_messages, "language": language},
|
238 |
+
config,
|
239 |
+
)
|
240 |
+
|
241 |
+
# Récupération de la réponse
|
242 |
+
custom_sentence = output["messages"][-1].content
|
243 |
+
|
244 |
+
# Joue l'audio
|
245 |
+
if language=="French": Lang_target = "fr" # Langue de la réponse
|
246 |
+
play_audio(custom_sentence, Lang_target, 1)
|
247 |
+
|
248 |
+
st.write("**Prospect :** "+custom_sentence)
|
249 |
+
|
250 |
+
|
251 |
+
|
252 |
+
except KeyboardInterrupt:
|
253 |
+
st.write(tr("Arrêt de la reconnaissance vocale."))
|
254 |
+
except:
|
255 |
+
st.write(tr("Problème, essayer de nouveau.."))
|
256 |
|
257 |
|
258 |
'''
|