Demosthene-OR commited on
Commit
b05362d
1 Parent(s): 9dc4d02
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 sounddevice as sd
10
- import numpy as np
11
- import scipy.io.wavfile as wav
12
  import speech_recognition as sr
13
- import time
14
- from sentence_transformers import SentenceTransformer
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 à mes questions"
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
- if st.button(label=tr("Cliquer pour enregistrer"), type="primary"):
257
- record_audio_until_silence() # Enregistre jusqu'à ce qu'il y ait 2 secondes de silence
258
- query = convert_audio_to_text("enregistrement.wav") # Convertit l'audio en texte
259
- st.write("**Vendeur :** "+query)
260
- # st.button(label=tr("Validez"), type="primary")
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
- # Prononciation de la réponse
273
- custom_sentence = output["messages"][-1].content
274
- Lang_target = "fr" # Exemple de langue détectée
275
- # Joue l'audio
276
- play_audio(custom_sentence, Lang_target, 1)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
  '''