ajout de mémoire avec fichier

This commit is contained in:
Foufure13
2025-01-10 23:13:37 +01:00
parent b1ac5c7506
commit 08c63b576c
15 changed files with 292 additions and 465 deletions
+163 -33
View File
@@ -59,6 +59,121 @@ def get_current_time():
# return now.strftime("%H:%M")
def get_current_date():
current_time = time.time()
return time.strftime('%Yy%mm%dd', time.localtime(current_time))
def dict_to_json_string(data):
"""Convertit un dictionnaire Python en chaîne JSON.
:param data: Dictionnaire Python.
:return: Chaîne JSON.
"""
try:
return json.dumps(data, indent=4, ensure_ascii=False)
except Exception as e:
print(f"Erreur lors de la conversion en JSON : {e}")
return None
def json_string_to_dict(json_string):
""" Convertit une chaîne JSON en dictionnaire Python.
:param json_string: Chaîne JSON.
:return: Dictionnaire Python.
"""
try:
return json.loads(json_string)
except Exception as e:
print(f"Erreur lors de la conversion en dictionnaire : {e}")
return None
class PersistentStorage:
def __init__(self, storage_dir="storage"):
"""
Initialise l'environnement de stockage avec un répertoire dédié.
:param storage_dir: Chemin du répertoire de stockage.
"""
self.storage_dir = storage_dir
def _get_file_path(self, filename):
"""Renvoie le chemin complet d'un fichier dans le répertoire de stockage."""
return os.path.join(self.storage_dir, filename + ".json")
def read(self, filename):
"""
Lit et retourne le contenu d'un fichier sous forme de dictionnaire.
:param filename: Nom du fichier (sans extension).
:return: Dictionnaire des données du fichier ou {} si le fichier est vide/inexistant.
"""
file_path = self._get_file_path(filename)
try:
with open(file_path, 'r', encoding='utf-8') as file:
return json.load(file)
except (FileNotFoundError, json.JSONDecodeError):
return {}
def write(self, filename, key, value):
"""
Ajoute ou met à jour une paire clé-valeur dans un fichier.
:param filename: Nom du fichier (sans extension).
:param key: Clé à ajouter ou mettre à jour.
:param value: Valeur associée.
"""
if not os.path.exists(self.storage_dir):
os.makedirs(self.storage_dir)
data = self.read(filename)
data[key] = value
file_path = self._get_file_path(filename)
with open(file_path, 'w', encoding='utf-8') as file:
json.dump(data, file, indent=4, ensure_ascii=False)
return data
def delete(self, filename, key):
"""
Supprime une clé d'un fichier si elle existe.
:param filename: Nom du fichier (sans extension).
:param key: Clé à supprimer.
"""
data = self.read(filename)
if key in data:
del data[key]
file_path = self._get_file_path(filename)
with open(file_path, 'w', encoding='utf-8') as file:
json.dump(data, file, indent=4, ensure_ascii=False)
return data
def list_keys(self, filename):
"""
Liste toutes les clés présentes dans un fichier.
:param filename: Nom du fichier (sans extension).
:return: Liste des clés.
"""
data = self.read(filename)
return list(data.keys())
def query_all(self):
"""
Interroge tous les fichiers dans le répertoire de stockage et retourne leurs contenus.
:return: Dictionnaire de tous les fichiers et leurs données.
"""
all_data = {}
for file in os.listdir(self.storage_dir):
if file.endswith(".json"):
filename = os.path.splitext(file)[0]
all_data[filename] = self.read(filename)
return all_data
storage = PersistentStorage()
################### RecordTwitch ########################
@@ -67,7 +182,7 @@ class RecordTwitch:
self.channel_name = channel_name
self.channel_url = "https://www.twitch.tv/" + self.channel_name
self.record_time = record_time
self.max_timerecordfile = 60
self.max_timerecordfile = 30
self.running = True
self.script_name = "twitch_record"
if (self.record_time == -1):
@@ -249,6 +364,7 @@ class Subtitle_translation:
self.pathjson = pathjson
self.reload_json()
self.dir_whisperX = "whisperX"
self.filename_memory = "subtitle_" +get_current_date()
self.subtitle = {}
self.all_subtitle = ""
self.is_running = True
@@ -284,25 +400,14 @@ class Subtitle_translation:
def remove_repetitions(self, message):
"""
Supprime les répétitions dans un message en conservant uniquement le premier
exemple d'une phrase répétée.
:param message: Le message sous forme de chaîne de caractères
:return: Le message sans répétitions
"""
sprint(self.script_name,"yellow", "remove_repetitions start for: \n" +message)
words = message.split() # Découpe le texte en mots
seen = set() # Pour suivre les mots déjà rencontrés
result = [] # Stocke les mots sans répétition
for word in words:
if word not in seen:
result.append(word)
seen.add(word)
sprint(self.script_name,"green", "remove_repetitions cleaned text : \n" +" ".join(result))
return " ".join(result)## str this switch
@@ -323,7 +428,6 @@ class Subtitle_translation:
sprint(self.script_name,"magenta", f"Dernier sous-titre à {last_time} = {last_text}")
return last_text
def auto_create_subtitle(self,file):
sprint(self.script_name,"green",f"start auto_create_subtitle")
@@ -336,7 +440,7 @@ class Subtitle_translation:
# subtitle_directory = "subtitle"
# os.makedirs(subtitle_directory, exist_ok=True)
# os.chdir(subtitle_directory)
spead_find = ""
speak_found = ""
sprint(self.script_name,"green", "translation : "+file+" ")
# whisperx --language fr --compute_type float32 ../record/final_output_audio.mp3
@@ -349,15 +453,17 @@ class Subtitle_translation:
file_noext = file.rsplit('.', 1)[0]
with open(file_noext+".txt", "r") as thisfile:
spead_find += thisfile.read().replace("'", "").replace('"', "").replace("\n", " ").replace(",", "")
speak_found += thisfile.read().replace("'", "").replace('"', "").replace("\n", " ").replace(",", "")
# parties = file_noext.split('_') # Sépare la base du nom et le numéro + extension
# num_ext = parties[-1] # Prend la dernière partie qui contient "007.mp3"
spead_find = self.remove_repetitions(spead_find)
self.all_subtitle += spead_find+"\n"
num_ext = get_current_time()
self.subtitle[str(num_ext)] = spead_find
sprint(self.script_name,"yellow", "parole du streamer : \n" +spead_find)
speak_found = self.remove_repetitions(speak_found)
self.all_subtitle += speak_found+"\n"
current_time = get_current_time()
self.subtitle[str(current_time)] = speak_found
storage.write(self.filename_memory, str(current_time), speak_found)
sprint(self.script_name,"yellow", "parole du streamer : \n" +speak_found)
# attention a No active speech found in audio
# os.chdir("../")
@@ -420,6 +526,7 @@ class Subtitle_translation:
class IA_generator:
def __init__(self,pathjson):
self.script_name = "IA_generator"
self.filename_memory = "IA_generator_" +get_current_date()
self.pathjson = pathjson
self.reload_json()
self.subtitle = {}
@@ -511,6 +618,7 @@ class IA_generator:
key = get_current_time()
self.response_generation[str(key)] = textfinal
storage.write(self.filename_memory, str(key), textfinal) #ecrire dans la mémoire fichier
def setnew_streamer_word_text(self, streamer_word_text):
self.streamer_word = streamer_word_text
@@ -581,17 +689,21 @@ class IA_generator:
################### sendmessageTwitch ########################
class messageTwitch:
def __init__(self, channel_name):
def __init__(self, config_user, channel_name):
self.ia_running = True
self.path_file_config_user = config_user
self.channel_name = channel_name
self.indexuser = 0
with open("../config/user.json", 'r') as file:
with open(self.path_file_config_user, 'r') as file:
self.userjson = json.load(file)
self.totaluser = len(self.userjson)
self.tw_acc_pseudo = get_value_json_list(self.indexuser, "tw_acc_pseudo", self.userjson)
self.tw_acc_token = get_value_json_list(self.indexuser, "tw_acc_token", self.userjson)
self.charactere = get_value_json_list(self.indexuser, "charactere", self.userjson)
self.respond_word = ""
self.last_respond_word = ""
def set_user(self,index_user):
@@ -632,26 +744,44 @@ class messageTwitch:
self.send_message_user(user1,"yo @"+pseudo2+" ^^")
sleep(10)
self.send_message_user(user1,"Heyyy cool ? @"+pseudo1+"")
def send_message_user(self,index_user, Message_text):
hprint("green","start send_message_user")
hprint("cyan","start send_message_user")
self.set_user(index_user)
command = '-pseudo "'+self.tw_acc_pseudo+'" -token "'+self.tw_acc_token+'" -twitchname "'+self.channel_name+'" -message " '+self.charactere+' '+Message_text+'"'
message_tosend = 'python send_message.py '+command
hprint("yellow",f"send message = "+str(message_tosend))
subprocess.run(message_tosend, shell=True)
hprint("yellow",f"Finnish send send_message_user index :" + str(index_user))
self.send_message(Message_text)
hprint("cyan",f"Finnish send send_message_user index :" + str(index_user))
def send_message(self, Message_text):
hprint("green","start send_message")
hprint("cyan","start send_message")
command = '-pseudo "'+self.tw_acc_pseudo+'" -token "'+self.tw_acc_token+'" -twitchname "'+self.channel_name+'" -message " '+self.charactere+' '+Message_text+'"'
message_tosend = 'python send_message.py '+command
hprint("yellow",f"send message = "+str(message_tosend))
message_tosend = 'python send_message.py '+ str(command)
hprint("cyan",f"send message = "+str(message_tosend))
subprocess.run(message_tosend, shell=True)
hprint("yellow",f"Finnish send_message message")
self.last_respond_word = Message_text
hprint("cyan",f"Finnish send_message message")
# def main_loop_respond(self):
# time.sleep(20) #wait starting script
# sprint(self.script_name,"blue", "main_loop_ia imagine_response start")
# try:
# while self.ia_running:
# # time.sleep(self.loop_timer_ia)
# # sprint(self.script_name,"yellow",f"wait {self.loop_timer_ia}s main_loop_ia imagine_response.")
# #self.respond_word = getvalue_file()
# if(self.last_respond_word != self.respond_word):
# self.send_message(self.respond_word)
# else:
# sprint(self.script_name,"yellow",f"génération déja créer")
# except KeyboardInterrupt:
# print("Arrêt du script.")
# except Exception as e:
# sprint(self.script_name,"red", "STOP main_loop_respond Error : "+ str(e))