This commit is contained in:
Foufure13
2025-02-19 17:47:19 +01:00
parent fc2547c45c
commit ddbac35391
21 changed files with 470 additions and 140 deletions
+5 -1
View File
@@ -9,7 +9,11 @@
"tw_acc_pseudo": "exoticnaturees",
"tw_acc_token": "oauth:9102fncctpjc44jxfkdvhzaywobhhi",
"charactere": "Kappa"
},
{
"tw_acc_pseudo": "ForFunIlluminaty",
"tw_acc_token": "oauth:c5zoigy66klbfldh54h6kapv118mif",
"charactere": "Kappa"
}
]
+38
View File
@@ -0,0 +1,38 @@
import subprocess
import threading
import time
import pygetwindow as gw
import sys
# Fonction pour générer des sorties normales dans le terminal actuel
def normal_output():
count = 0
while True:
print(f"Normal output line {count}")
count += 1
time.sleep(1)
if __name__ == "__main__":
# Vérifier si la sortie est bien un terminal
if not sys.stdout.isatty():
print("This script must be run in a terminal.")
sys.exit(1)
try:
# Ouvrir un nouveau terminal pour afficher la barre de statut
status_bar_process = subprocess.Popen(
["start", "cmd", "/k", "python", "status_bar.py"], shell=True
) # Utilise "start cmd /k" pour Windows
# Attendre un instant pour que la fenêtre apparaisse
time.sleep(1)
# Trouver la fenêtre de la barre de statut
for window in gw.getWindowsWithTitle("status_bar.py"):
window.alwaysOnTop = True # Mettre la fenêtre toujours au-dessus
# Démarrer les sorties normales dans le terminal principal
normal_output()
except KeyboardInterrupt:
print("\nExiting...")
+26
View File
@@ -0,0 +1,26 @@
import time
import os
import sys
def status_bar():
try:
while True:
# Obtenir la taille du terminal
rows, columns = os.popen('stty size', 'r').read().split()
rows = int(rows)
columns = int(columns)
# Déplacer le curseur au début du terminal
sys.stdout.write("\033[H") # Aller au coin supérieur gauche
sys.stdout.write("\033[2K") # Effacer la ligne
sys.stdout.write("Status Bar: [Working on tasks...] | Time: {}\n".format(time.strftime("%H:%M:%S")))
sys.stdout.flush()
# Attendre un peu avant de mettre à jour
time.sleep(1)
except KeyboardInterrupt:
print("\nExiting status bar...")
if __name__ == "__main__":
status_bar()
+241 -94
View File
@@ -11,6 +11,9 @@ import shutil
import datetime
import glob
import threading
import asyncio
from urllib.parse import urlparse
from pytmi import Client
# import keyboard
from pynput import keyboard
from threading import Thread, Semaphore
@@ -27,6 +30,10 @@ import pty
console = Console()
def sleep_control(time_sleep, running):
if running:
time.sleep(time_sleep)
def hprint(color, texte):
timestamp = datetime.datetime.now().strftime("%Hh %Mm %Ss")
console.print("[bold "+color+"] ["+timestamp+"] "+texte+" [/bold "+color+"]")
@@ -35,6 +42,30 @@ def sprint(script_name,color, texte):
timestamp = datetime.datetime.now().strftime("%Hh %Mm %Ss")
console.print("[bold "+color+"] ["+timestamp+"] ("+script_name+") "+texte+" [/bold "+color+"]")
def debug_print(TAG, texte_print, type_debug,script_name):
timestamp = datetime.datetime.now().strftime("%Hh %Mm %Ss")
type_color = "blue"
# more color
# DARKCYAN
if TAG == "e": # Erreur
type_color = "red"
console.print("[bold "+type_color+"] ["+timestamp+"] ("+script_name+") "+texte_print+" [/bold "+type_color+"]")
elif TAG == "w": # Warning
type_color = "yellow"
console.print("[bold "+type_color+"] ["+timestamp+"] ("+script_name+") "+texte_print+" [/bold "+type_color+"]")
elif TAG == "g": # Succes
type_color = "green"
console.print("[bold "+type_color+"] ["+timestamp+"] ("+script_name+") "+texte_print+" [/bold "+type_color+"]")
elif TAG == "i": # Info
type_color = "cyan"
console.print("[bold "+type_color+"] ["+timestamp+"] ("+script_name+") "+texte_print+" [/bold "+type_color+"]")
elif TAG == "v" and type_debug != "Info": # Verbos
type_color = "magenta"
console.print("[bold "+type_color+"] ["+timestamp+"] ("+script_name+") "+texte_print+" [/bold "+type_color+"]")
elif TAG == "d" and type_debug != "Verbos" and type_debug != "Info": # Debug
type_color = "blue"
console.print("[bold "+type_color+"] ["+timestamp+"] ("+script_name+") "+texte_print+" [/bold "+type_color+"]")
def del_file(dossier, file):
motif = os.path.join(dossier, file)
@@ -42,6 +73,15 @@ def del_file(dossier, file):
os.remove(file)
hprint("",f"file deleted : {file}")
def del_pathfile(file_path):
try:
os.remove(file_path)
hprint("green", "Fichier Suprimé : " +file_path)
except Exception as e:
hprint("red", "del_file Error : "+ str(e))
# Supprimer le fichier après le traitement
def get_value_json(var_name, config):
return config.get(var_name)
@@ -176,6 +216,10 @@ storage = PersistentStorage()
################### RecordTwitch ########################
class RecordTwitch:
def __init__(self, channel_name, record_time):
@@ -184,6 +228,7 @@ class RecordTwitch:
self.record_time = record_time
self.max_timerecordfile = 30
self.running = True
self.type_debug = "Debug"
self.script_name = "twitch_record"
if (self.record_time == -1):
self.record_time = 9999
@@ -239,12 +284,12 @@ class RecordTwitch:
def loop_run(self, intervalle):#boucle pour déplacer les fichier fini enregistrement
time.sleep(30) # attente début du script complet et enregistrement
time.sleep(20) # attente début du script complet et enregistrement
try:
while self.running:
self.verif_record_move()
sprint(self.script_name,"yellow", f"wait {intervalle}s for next scan file completed.")
time.sleep(intervalle)
# sprint(self.script_name,"yellow", f"wait {intervalle}s for next scan file completed.")
sleep_control(intervalle,self.running)
#except KeyboardInterrupt:
except Exception as e:
sprint(self.script_name,"red", "STOP loop_run Error : "+ str(e))
@@ -253,7 +298,8 @@ class RecordTwitch:
def verif_record_move(self, dir_inrecord="in_record", dir_record="record"):
sprint(self.script_name,"green", "start verif_record_move")
# sprint(self.script_name,"green", "start verif_record_move")
debug_print("v", "Verif_record_move Start", self.type_debug, self.script_name)
if not os.path.exists(dir_record):
os.makedirs(dir_record)
sprint(self.script_name,"green", "création du dossier : "+dir_record)
@@ -267,25 +313,29 @@ class RecordTwitch:
chemin_destination = os.path.join(dir_record, fileto_move)
# move file
shutil.move(chemin_source, chemin_destination)
sprint(self.script_name,"green",f"File moved: {fileto_move}")
else:
sprint(self.script_name,"yellow","Not enough files to compare.")
# sprint(self.script_name,"green",f"File moved: {fileto_move}")
debug_print("d", f"File moved: {fileto_move}", self.type_debug, self.script_name)
def compteur(self ):
seconds = 0
loop = 0
def compteur(self):
self.seconds = 0
self.loop = 0
while self.running:
time.sleep(1) # Attend une seconde
if (seconds < 10):
print(f"\033[94mRecording time: 0{seconds}s | file : {loop}\033[0m", end='\r', flush=True) # Réinitialise la ligne à chaque fois
else:
print(f"\033[94mRecording time: {seconds}s | file : {loop}\033[0m", end='\r', flush=True) # Réinitialise la ligne à chaque fois
# if (self.seconds < 10):
# print(f"\033[94mRecording time: 0{self.seconds}s | file : {self.loop}\033[0m", end='\r', flush=True) # Réinitialise la ligne à chaque fois
# else:
# print(f"\033[94mRecording time: {self.seconds}s | file : {self.loop}\033[0m", end='\r', flush=True) # Réinitialise la ligne à chaque fois
self.seconds += 1
if self.seconds == self.max_timerecordfile:
self.loop +=1
self.seconds = 0 # Réinitialise le compteur après 60 seconds
seconds += 1
if seconds == self.max_timerecordfile:
loop +=1
seconds = 0 # Réinitialise le compteur après 60 seconds
def get_seconde_compteur(self):
return self.seconds
def get_loop_compteur(self):
return self.loop
def record_audio(self):
output_directory = "record"
@@ -293,8 +343,6 @@ class RecordTwitch:
os.makedirs(output_directory, exist_ok=True)
os.makedirs(in_record_directory, exist_ok=True)
timestamp_complet = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
timestamp = datetime.datetime.now().strftime("%Y-%m-%d")
@@ -328,7 +376,7 @@ class RecordTwitch:
loop_run = Thread(target=self.loop_run, args=(20,), daemon=True)
loop_run.start()
#loop_run.join() # Wait for the recording to finish
sprint(self.script_name,"cyan","Enregistrement terminé, le programme va se terminer.")
# sprint(self.script_name,"cyan","Enregistrement terminé, le programme va se terminer.")
@@ -361,10 +409,11 @@ class RecordTwitch:
class Subtitle_translation:
def __init__(self, pathjson):
self.script_name = "translation"
self.type_debug = "Debug"
self.pathjson = pathjson
self.reload_json()
self.dir_whisperX = "whisperX"
self.filename_memory = "subtitle_" +get_current_date()
self.filename_memory = "subtitle_data"
self.subtitle = {}
self.all_subtitle = ""
self.is_running = True
@@ -373,7 +422,7 @@ class Subtitle_translation:
self.dir_record = "record"
def stop(self):
sprint(self.script_name,"yellow",f"Arrêt loop subtitle")
sprint(self.script_name,"red",f"Arrêt loop subtitle")
self.is_running = False
if self.loop_thread.is_alive():
# self.loop_thread.join() # Attend la fin du thread pour un arrêt propre
@@ -390,17 +439,15 @@ class Subtitle_translation:
for file in os.listdir(self.dir_record):
file_path = os.path.join(self.dir_record, file)
if os.path.isfile(file_path):
sprint(self.script_name,"blue",f"File find -> transcribe.")
# sprint(self.script_name,"blue",f"File find -> transcribe.")
debug_print("d", "Creation subtitle : "+file_path, self.type_debug, self.script_name)
# Exécuter une fonction sur le fichier
self.auto_create_subtitle(file)
# Supprimer le fichier après le traitement
os.remove(file_path)
print(f"Fichier {file_path} supprimé.")
del_pathfile(file_path)
def remove_repetitions(self, message):
sprint(self.script_name,"yellow", "remove_repetitions start for: \n" +message)
# 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
@@ -408,11 +455,10 @@ class Subtitle_translation:
if word not in seen:
result.append(word)
seen.add(word)
sprint(self.script_name,"green", "remove_repetitions cleaned text : \n" +" ".join(result))
# sprint(self.script_name,"green", "remove_repetitions cleaned text : \n" +" ".join(result))
return " ".join(result)## str this switch
def print_allsubtitle(self):
os.system('clear')
sprint(self.script_name,"yellow", "\n\n All subtitle Print\n ")
for key, text in self.subtitle.items():
sprint(self.script_name,"yellow", " time "+ str(key)+" = "+ text+" \n\n")
@@ -431,18 +477,14 @@ class Subtitle_translation:
def auto_create_subtitle(self,file):
sprint(self.script_name,"green",f"start auto_create_subtitle")
# debug_print("v", "auto_create_subtitle Start", self.type_debug,self.script_name)
del_file("","*.txt")
del_file("","*.srt")
del_file("","*.vtt")
del_file("","*.tsv")
del_file("","*.json")
# subtitle_directory = "subtitle"
# os.makedirs(subtitle_directory, exist_ok=True)
# os.chdir(subtitle_directory)
speak_found = ""
sprint(self.script_name,"green", "translation : "+file+" ")
# sprint(self.script_name,"green", "translation : "+file+" ")
# whisperx --language fr --compute_type float32 ../record/final_output_audio.mp3
# record_twitch = ['whisperx', '--language',self.language, '--compute_type','float32', '../'+self.dir_record+"/"+file] #ancienne version
# record_twitch = ['whisper', '--language',self.language, '../'+self.dir_record+"/"+file,"--device","cuda"]
@@ -460,30 +502,26 @@ class Subtitle_translation:
speak_found = self.remove_repetitions(speak_found)
self.all_subtitle += speak_found+"\n"
current_time = get_current_time()
# if self.subtitle:
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("../")
sprint(self.script_name,"green","finish create_subtitle")
def main_loop(self):
time.sleep(45)
time.sleep(25)
sprint(self.script_name,"green", "start main boucle_traitement record")
try:
while self.is_running:
sprint(self.script_name,"blue",f"wait {self.loop_timer}s loop main translation.")
# Attend 'intervalle' secondes avant la prochaine itération
self.verif_file_transcribe()
time.sleep(self.loop_timer)
# except KeyboardInterrupt:
# print("Arrêt du script.")
except Exception as e:
sprint(self.script_name,"red", "STOP main_loop Error : "+ str(e))
# debug_print("v", "main_loop record Start", self.type_debug,self.script_name)
# #console.print("[bold green]Enregistrement terminé, le programme va se terminer.[/bold green]")
while self.is_running:
try:
# sprint(self.script_name,"blue",f"wait {self.loop_timer}s loop main translation.")
self.verif_file_transcribe()
sleep_control(self.loop_timer,self.is_running)
except Exception as e:
sprint(self.script_name,"red", "STOP main_loop Error : "+ str(e))
#console.print("[bold green]Enregistrement terminé, le programme va se terminer.[/bold green]")
def start_main_loop(self):
"""Lance dans un thread pour ne pas bloquer le code principal."""
@@ -525,8 +563,9 @@ class Subtitle_translation:
class IA_generator:
def __init__(self,pathjson):
self.type_debug = "Debug"
self.script_name = "IA_generator"
self.filename_memory = "IA_generator_" +get_current_date()
self.filename_memory = "IA_generator"
self.pathjson = pathjson
self.reload_json()
self.subtitle = {}
@@ -541,7 +580,7 @@ class IA_generator:
self.bad_answer = get_value_json("bad_answer", self.config)
def stop(self):
sprint(self.script_name,"yellow",f"Arrêt loop subtitle")
sprint(self.script_name,"red",f"Arrêt loop subtitle")
self.ia_running = False
if self.loop_thread.is_alive():
# self.loop_thread.join() # Attend la fin du thread pour un arrêt propre
@@ -568,7 +607,6 @@ class IA_generator:
return ''.join(values[-n:])
def print_allgeneration(self):
os.system('clear')
sprint(self.script_name,"yellow", "\n\n Print All response_generation \n ")
for key, text in self.response_generation.items():
sprint(self.script_name,"yellow", " key = "+ str(key)+" = "+ text+" \n\n")
@@ -580,9 +618,25 @@ class IA_generator:
return ""
# Récupère la dernière clé et valeur
key, last_generation = list(self.response_generation.items())[-1]
sprint(self.script_name,"magenta", f"Dernier response_generation key : {key} = {last_generation}")
# sprint(self.script_name,"magenta", f"Dernier response_generation key : {key} = {last_generation}")
return last_generation
def get_last_subtitle(self):
data = storage.read("subtitle_data")
if data: # Vérifie si data n'est pas vide
# Trie les clés et récupère la dernière
sorted_keys = sorted(data.keys())
last_key = sorted_keys[-1]
self.streamer_word = data[last_key]
# sprint(self.script_name,"blue", "get_last_subtitle : " + data[last_key])
else:
self.generation_text = ""
def clear_response(self, text):
# Vérifie si ":" est dans la chaîne de caractères
if ":" in text:
@@ -593,7 +647,9 @@ class IA_generator:
return text
def imagine_response(self):
sprint(self.script_name,"green",f"start imagine_response\n")
# sprint(self.script_name,"green",f"start imagine_response\n")
debug_print("v", "start imagine_response", self.type_debug,self.script_name)
# sprint(self.script_name,"magenta",f"streamer_word : \n"+str(self.streamer_word))
# sprint(self.script_name,"magenta",f"streamer_word : \n"+str(len(self.streamer_word[0])))
if str(self.streamer_word) == "":
@@ -602,18 +658,25 @@ class IA_generator:
prompt_gpt = ['tgpt','-q','-w', '"'+self.list_prompt[self.index_prompt]+' "'+ str(self.streamer_word)+'"']
sprint(self.script_name,"DARKCYAN","index preprompt : "+str(self.index_prompt)+"\n")
sprint(self.script_name,"DARKCYAN","\nPrompt demandé : "+str(prompt_gpt)+"\n")
# sprint(self.script_name,"DARKCYAN","index preprompt : "+str(self.index_prompt)+"\n")
# sprint(self.script_name,"DARKCYAN","\nPrompt demandé : "+str(prompt_gpt)+"\n")
process = subprocess.run(prompt_gpt, capture_output=True, text=True, check=False)
text_generation = process.stdout.replace("'", "").replace('"', "").replace("\n", "")
# sprint(self.script_name,"CYAN","réponse imaginé sans formatage : \n"+text_generation+"\n\n") #debug
textfinal = self.clear_response(text_generation)
nombre_de_mots = len(textfinal.split())
# nombre_de_mots = len(textfinal.split())
#TODO amélioration condition de génération
# if nombre_de_mots>100:
# sprint(self.script_name,"red","réponse prompt trop grande : "+str(textfinal))
# self.change_prompt()
# self.imagine_response()
# return
# nombre_de_caracteres = len(textfinal)
self.last_streamer_word = self.streamer_word
sprint(self.script_name,"CYAN","réponse imaginé : \n"+textfinal+"\n\n")
# sprint(self.script_name,"CYAN","réponse imaginé : \n"+textfinal+"\n\n")
debug_print("d", "Réponse imaginé : \n"+textfinal, self.type_debug,self.script_name)
self.change_prompt()
key = get_current_time()
@@ -628,22 +691,28 @@ class IA_generator:
return ''.join(values[-n:])
def main_ask(self, streamer_word_text):
sprint(self.script_name,"blue", "imagine_response start")
# sprint(self.script_name,"blue", "imagine_response start")
debug_print("i", "PRINCIPAL START imagine_response", self.type_debug,self.script_name)
self.streamer_word = streamer_word_text
imagine_response_thread = Thread(target=self.imagine_response)
imagine_response_thread.start()
def main_loop_ia(self):
sprint(self.script_name,"blue", "main_loop_ia imagine_response start")
time.sleep(20)
# sprint(self.script_name,"blue", "main_loop_ia imagine_response start")
# debug_print("v", "main_loop_ia imagine_response start", self.type_debug,self.script_name)
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.")
# sprint(self.script_name,"yellow",f"wait {self.loop_timer_ia}s main_loop_ia imagine_response.")
self.get_last_subtitle()
if(self.last_streamer_word != self.streamer_word):
self.imagine_response()
self.last_streamer_word = self.streamer_word
else:
sprint(self.script_name,"yellow",f"génération déja créer")
# sprint(self.script_name,"yellow",f"génération déja créer")
debug_print("d", "génération déja créer", self.type_debug,self.script_name)
sleep_control(self.loop_timer_ia,self.ia_running)
# except KeyboardInterrupt:
# print("Arrêt du script.")
except Exception as e:
@@ -674,8 +743,35 @@ class IA_generator:
# class messageTwitch:
# def __init__(self, channel_name, pseudo, token):
# self.channel_name = channel_name
# self.pseudo = pseudo
# self.token = token
# async def send_message_to_twitch_stream(self, message):
# parsed_url = urlparse(self.channel_name)
# channel = parsed_url.path.lstrip('/')
# pseudo = self.tw_acc_pseudo
# token = self.tw_acc_token
# message = self.ram_msgnow
# async with Client() as client:
# try:
# print("Tentative de login")
# await client.login_oauth(token, pseudo)
# print("Tentative de join")
# await client.join(channel)
# print("Tentative d'envoi de message")
# await client.send_message(message)
# print("Message envoyé avec succès.")
# sleep(45) # Utilisez asyncio.sleep pour éviter de bloquer l'event loop
# await client.part(channel)
# print("Déconnecté.")
# except Exception as e:
# print(f"Erreur lors de l'interaction avec Twitch: {type(e).__name__}, {e}")
@@ -695,6 +791,7 @@ class messageTwitch:
self.path_file_config_user = config_user
self.channel_name = channel_name
self.indexuser = 0
self.type_debug = "Debug"
with open(self.path_file_config_user, 'r') as file:
self.userjson = json.load(file)
self.totaluser = len(self.userjson)
@@ -703,6 +800,7 @@ class messageTwitch:
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.ram_msgnow = ""
self.generation_text = ""
self.last_respond_word = ""
@@ -718,8 +816,9 @@ class messageTwitch:
def change_user(self):
# commented for pausing
debug_print("v", "Changement User Twitch", self.type_debug, self.script_name)
if (self.totaluser != 1): # si la liste ne fait pas que 1 de taille
if(self.totaluser > self.indexuser): # si la taille de liste est plus grande que lindex
if(self.totaluser-1 > self.indexuser): # si la taille de liste est plus grande que lindex
self.indexuser = self.indexuser + 1
else :
self.indexuser = 0
@@ -729,14 +828,6 @@ class messageTwitch:
self.charactere = get_value_json_list(self.indexuser, "charactere", self.userjson)
def set_user(self,index_user):
self.indexuser = index_user
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)
def conversation(self):
user1 = 1
user2 = 2
@@ -757,44 +848,100 @@ class messageTwitch:
def send_message(self, Message_text):
hprint("cyan","start send_message")
try:
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 '+ str(command)
debug_print("d", f"send message = "+str(message_tosend), self.type_debug, self.script_name)
sprint(self.script_name,"cyan",f"send message = "+str(message_tosend))
subprocess.run(message_tosend, shell=True)
# self.ram_msgnow = Message_text
# await self.send_message_to_twitch_stream()
# asyncio.run(self.send_message_to_twitch_stream())
self.last_respond_word = Message_text
# sprint(self.script_name,"cyan",f"Finnish send_message message")
debug_print("g", "Finnish send_message message", self.type_debug,self.script_name)
except Exception as e:
sprint(self.script_name,"red", "send_message Error : "+ str(e))
async def send_message_to_twitch_stream(self):
parsed_url = urlparse(self.channel_name)
channel = parsed_url.path.lstrip('/')
pseudo = self.tw_acc_pseudo
token = self.tw_acc_token
message = self.ram_msgnow
async with Client() as client:
try:
print("Tentative de login")
await client.login_oauth(token, pseudo)
# while self.message_running:
print("Tentative de join")
await client.join(channel)
print("Tentative d'envoi de message")
await client.send_message(message)
print("Message envoyé avec succès.")
sleep_control(25,self.message_running)
await client.part(channel)
print("disconnect.")
except Exception as e:
print(f"Erreur lors de l'interaction avec Twitch: {type(e).__name__}, {e}")
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 '+ str(command)
hprint("cyan",f"send message = "+str(message_tosend))
subprocess.run(message_tosend, shell=True)
self.last_respond_word = Message_text
hprint("cyan",f"Finnish send_message message")
def get_last_generation(self):
data = storage.read("IA_generator_" +get_current_date())
# Trie les clés et récupère la dernière
sorted_keys = sorted(data.keys())
last_key = sorted_keys[-1]
self.generation_text = data[last_key]
data = storage.read("IA_generator")
if data: # Vérifie si data n'est pas vide
# Trie les clés et récupère la dernière
sorted_keys = sorted(data.keys())
last_key = sorted_keys[-1]
self.generation_text = data[last_key]
# sprint(self.script_name,"blue", "get_last_generation : " + data[last_key])
else:
debug_print("e", "get_last_generation = No generation: ", self.type_debug, self.script_name)
# sprint(self.script_name,"red", "get_last_generation = No generation: ")
self.generation_text = ""
def start_main_loop_respond(self):
time.sleep(20) #wait starting script
sprint(self.script_name,"blue", "main_loop_ia imagine_response start")
time.sleep(40) #wait starting script
sprint(self.script_name,"blue", "main_loop_respond start")
try:
while self.message_running:
time.sleep(20)
self.get_last_generation()
if (self.generation_text == ""):
sprint(self.script_name,"yellow",f"pas encore de génération")
sleep_control(45,self.message_running)
continue
if(self.last_respond_word != self.generation_text):
sprint(self.script_name,"green",f"\n\n ENVOIE MESSAGE : \n "+self.generation_text)
# sprint(self.script_name,"green",f"\n\n ENVOIE MESSAGE : \n "+self.generation_text)
debug_print("v", "Début envoie message : "+self.generation_text, self.type_debug, self.script_name)
self.send_message(self.generation_text) # envoie de message
self.last_respond_word = self.generation_text # mise a jour du dernier message envoyé
self.change_user() # cahngement de user
else:
sprint(self.script_name,"yellow",f"génération déja créer")
except KeyboardInterrupt:
print("Arrêt du script.")
# sprint(self.script_name,"yellow",f"génération déja envoyé")
debug_print("d", "génération déja envoyé", self.type_debug, self.script_name)
sleep_control(20,self.message_running)
except Exception as e:
sprint(self.script_name,"red", "STOP main_loop_respond Error : "+ str(e))
def start_loop_respond(self):
"""Lance dans un thread pour ne pas bloquer le code principal."""
self.message_running = True
+7 -1
View File
@@ -36,7 +36,13 @@ def hprint(color, texte):
console.print("[bold "+color+"] ["+timestamp+"] "+texte+" [/bold "+color+"]")
def del_pathfile(file_path):
try:
os.remove(file_path)
sprint(self.script_name,"green", "Fichier Suprimé : " +file_path)
except Exception as e:
sprint(self.script_name,"red", "del_file Error : "+ str(e))
# Supprimer le fichier après le traitement
def get_value_json(var_name, config):
return config.get(var_name)
+16
View File
@@ -0,0 +1,16 @@
{
"folders": [
{
"path": "../../stream_control_obs/script"
},
{
"path": "../../stream_control_obs"
},
{
"path": "../.."
}
],
"settings": {
"git.ignoreLimitWarning": true
}
}
+18 -19
View File
@@ -22,6 +22,8 @@ from rich.table import Table
from rich.text import Text
import subprocess
import pty
# import win32console
import multiprocessing
#import from local file 4 main class
@@ -42,7 +44,7 @@ console = Console()
def stop_all():
hprint("blue", "Arrêt d'enregistrement twitch.")
hprint("blue", "Arrêt du bot twitch.")
recordTw.stop()
sb_translation.stop()
ask_text.stop()
@@ -65,7 +67,13 @@ def print_help():
hprint("PURPLE", "Touche m : change le prompt a donner a l'ia")
def del_pathfile(file_path):
try:
os.remove(file_path)
hprint("green", "Fichier Suprimé : " +file_path)
except Exception as e:
hprint("red", "del_file Error : "+ str(e))
# Supprimer le fichier après le traitement
def start_keyboard_listener():
global listening_keyboard # Déclare que tu utilises la variable globale
@@ -138,6 +146,10 @@ def generation_responce():
hprint("blue", "start IA_generator")
ask_text.main_ask(text_streamer)
def print_Status_bar():
print(f"\033[94mRecording time: 0{self.seconds}s | file : {self.loop}\033[0m", end='\r', flush=True) # Réinitialise la ligne à chaque fois
#----------------------------------------------------------------------------------------------------
@@ -145,6 +157,10 @@ if __name__ == '__main__':
global main_loop
main_loop = True
del_pathfile("./working_bot/storage/IA_generator.json")
del_pathfile("./working_bot/storage/subtitle_data.json")
#configuration du dossier de travaille
work_directory = "working_bot"
if not os.path.exists(work_directory):
@@ -184,23 +200,6 @@ if __name__ == '__main__':
listener_thread.start() # mise en thread de l'écoute des appuye touche
time.sleep(25)
last_generaton = ""
while main_loop:
time.sleep(10)
hprint("blue", "start main_loop main script / main_loop = "+str(main_loop))
text_streamer = sb_translation.get_lasttext()
ask_text.setnew_streamer_word_text(text_streamer)
# new_genration = ask_text.getlast_generation()
# if new_genration != "" and new_genration != last_generaton:
# hprint("blue", "Send message -> "+new_genration)
# controluser.send_message(new_genration)
# controluser.change_user()
# last_generaton = new_genration
# time.sleep(10)
+1
View File
@@ -0,0 +1 @@
{"text": " Brian, on peut en reparler dans une minute ? ...de le faire. En pla\u00e7ant les balises \u00e9lectroniques sur la voiture, il faut simplement acc\u00e9der au v\u00e9hicule, faire sauter le r\u00e9servoir... ...Fischer avait mis un autocollant sur le pare-choc arri\u00e8re de sa voiture et quelqu'un est venu recoller exactement le m\u00eame autocollant sur celui d\u00e9j\u00e0 existant, donc je crois que c'est l\u00e0 que la balise a mis un autocollant sur le pare-choc arri\u00e8re de sa voiture et quelqu'un est venu recoller exactement le m\u00eame autocollant sur celui d\u00e9j\u00e0 existant, donc je crois que c'est l\u00e0 que la balise a mis un autocollant sur le pare-choc arri\u00e8re de sa voiture.", "segments": [{"id": 0, "seek": 0, "start": 0.88, "end": 3.0, "text": " Brian, on peut en reparler dans une minute ?", "tokens": [50409, 10765, 11, 322, 5977, 465, 33291, 1918, 2680, 2251, 3456, 2506, 50515], "temperature": 0.0, "avg_logprob": -0.1896892874581473, "compression_ratio": 2.3423076923076924, "no_speech_prob": 0.25903812050819397}, {"id": 1, "seek": 0, "start": 3.0, "end": 5.38, "text": " ...de le faire. En pla\u00e7ant les balises \u00e9lectroniques sur la voiture,", "tokens": [50515, 1097, 1479, 476, 4865, 13, 2193, 15256, 1138, 394, 1512, 3119, 3598, 30996, 2044, 4911, 1022, 635, 38859, 11, 50634], "temperature": 0.0, "avg_logprob": -0.1896892874581473, "compression_ratio": 2.3423076923076924, "no_speech_prob": 0.25903812050819397}, {"id": 2, "seek": 0, "start": 5.7, "end": 8.0, "text": " il faut simplement acc\u00e9der au v\u00e9hicule, faire sauter le r\u00e9servoir...", "tokens": [50650, 1930, 8487, 24208, 1317, 526, 1068, 1609, 49438, 2271, 11, 4865, 601, 20314, 476, 14415, 1978, 9043, 485, 50765], "temperature": 0.0, "avg_logprob": -0.1896892874581473, "compression_ratio": 2.3423076923076924, "no_speech_prob": 0.25903812050819397}, {"id": 3, "seek": 0, "start": 8.52, "end": 11.48, "text": " ...Fischer avait mis un autocollant sur le pare-choc arri\u00e8re de sa voiture", "tokens": [50791, 1097, 37, 19674, 11853, 3346, 517, 45833, 1833, 394, 1022, 476, 7448, 12, 339, 905, 3399, 4212, 368, 601, 38859, 50939], "temperature": 0.0, "avg_logprob": -0.1896892874581473, "compression_ratio": 2.3423076923076924, "no_speech_prob": 0.25903812050819397}, {"id": 4, "seek": 0, "start": 11.48, "end": 14.42, "text": " et quelqu'un est venu recoller exactement le m\u00eame autocollant", "tokens": [50939, 1030, 25283, 6, 409, 871, 6138, 84, 39495, 260, 38111, 476, 5698, 45833, 1833, 394, 51086], "temperature": 0.0, "avg_logprob": -0.1896892874581473, "compression_ratio": 2.3423076923076924, "no_speech_prob": 0.25903812050819397}, {"id": 5, "seek": 0, "start": 14.42, "end": 18.56, "text": " sur celui d\u00e9j\u00e0 existant, donc je crois que c'est l\u00e0 que la balise a mis un autocollant", "tokens": [51086, 1022, 22829, 12027, 2514, 394, 11, 5926, 1506, 21724, 631, 269, 6, 377, 3684, 631, 635, 3119, 908, 257, 3346, 517, 45833, 1833, 394, 51293], "temperature": 0.0, "avg_logprob": -0.1896892874581473, "compression_ratio": 2.3423076923076924, "no_speech_prob": 0.25903812050819397}, {"id": 6, "seek": 0, "start": 18.56, "end": 23.3, "text": " sur le pare-choc arri\u00e8re de sa voiture et quelqu'un est venu recoller exactement le m\u00eame autocollant", "tokens": [51293, 1022, 476, 7448, 12, 339, 905, 3399, 4212, 368, 601, 38859, 1030, 25283, 6, 409, 871, 6138, 84, 39495, 260, 38111, 476, 5698, 45833, 1833, 394, 51530], "temperature": 0.0, "avg_logprob": -0.1896892874581473, "compression_ratio": 2.3423076923076924, "no_speech_prob": 0.25903812050819397}, {"id": 7, "seek": 0, "start": 23.3, "end": 27.36, "text": " sur celui d\u00e9j\u00e0 existant, donc je crois que c'est l\u00e0 que la balise a mis un autocollant", "tokens": [51530, 1022, 22829, 12027, 2514, 394, 11, 5926, 1506, 21724, 631, 269, 6, 377, 3684, 631, 635, 3119, 908, 257, 3346, 517, 45833, 1833, 394, 51733], "temperature": 0.0, "avg_logprob": -0.1896892874581473, "compression_ratio": 2.3423076923076924, "no_speech_prob": 0.25903812050819397}, {"id": 8, "seek": 2736, "start": 27.36, "end": 29.02, "text": " sur le pare-choc arri\u00e8re de sa voiture.", "tokens": [50365, 1022, 476, 7448, 12, 339, 905, 3399, 4212, 368, 601, 38859, 13, 50448], "temperature": 0.0, "avg_logprob": -0.2770047823588053, "compression_ratio": 0.8333333333333334, "no_speech_prob": 0.4634491205215454}], "language": "fr"}
+36
View File
@@ -0,0 +1,36 @@
1
00:00:00,880 --> 00:00:03,000
Brian, on peut en reparler dans une minute ?
2
00:00:03,000 --> 00:00:05,380
...de le faire. En plaçant les balises électroniques sur la voiture,
3
00:00:05,700 --> 00:00:08,000
il faut simplement accéder au véhicule, faire sauter le réservoir...
4
00:00:08,520 --> 00:00:11,480
...Fischer avait mis un autocollant sur le pare-choc arrière de sa voiture
5
00:00:11,480 --> 00:00:14,420
et quelqu'un est venu recoller exactement le même autocollant
6
00:00:14,420 --> 00:00:18,560
sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
7
00:00:18,560 --> 00:00:23,300
sur le pare-choc arrière de sa voiture et quelqu'un est venu recoller exactement le même autocollant
8
00:00:23,300 --> 00:00:27,360
sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
9
00:00:27,360 --> 00:00:29,020
sur le pare-choc arrière de sa voiture.
+10
View File
@@ -0,0 +1,10 @@
start end text
880 3000 Brian, on peut en reparler dans une minute ?
3000 5380 ...de le faire. En plaçant les balises électroniques sur la voiture,
5700 8000 il faut simplement accéder au véhicule, faire sauter le réservoir...
8520 11480 ...Fischer avait mis un autocollant sur le pare-choc arrière de sa voiture
11480 14420 et quelqu'un est venu recoller exactement le même autocollant
14420 18560 sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
18560 23300 sur le pare-choc arrière de sa voiture et quelqu'un est venu recoller exactement le même autocollant
23300 27360 sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
27360 29020 sur le pare-choc arrière de sa voiture.
1 start end text
2 880 3000 Brian, on peut en reparler dans une minute ?
3 3000 5380 ...de le faire. En plaçant les balises électroniques sur la voiture,
4 5700 8000 il faut simplement accéder au véhicule, faire sauter le réservoir...
5 8520 11480 ...Fischer avait mis un autocollant sur le pare-choc arrière de sa voiture
6 11480 14420 et quelqu'un est venu recoller exactement le même autocollant
7 14420 18560 sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
8 18560 23300 sur le pare-choc arrière de sa voiture et quelqu'un est venu recoller exactement le même autocollant
9 23300 27360 sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
10 27360 29020 sur le pare-choc arrière de sa voiture.
+9
View File
@@ -0,0 +1,9 @@
Brian, on peut en reparler dans une minute ?
...de le faire. En plaçant les balises électroniques sur la voiture,
il faut simplement accéder au véhicule, faire sauter le réservoir...
...Fischer avait mis un autocollant sur le pare-choc arrière de sa voiture
et quelqu'un est venu recoller exactement le même autocollant
sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
sur le pare-choc arrière de sa voiture et quelqu'un est venu recoller exactement le même autocollant
sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
sur le pare-choc arrière de sa voiture.
+29
View File
@@ -0,0 +1,29 @@
WEBVTT
00:00.880 --> 00:03.000
Brian, on peut en reparler dans une minute ?
00:03.000 --> 00:05.380
...de le faire. En plaçant les balises électroniques sur la voiture,
00:05.700 --> 00:08.000
il faut simplement accéder au véhicule, faire sauter le réservoir...
00:08.520 --> 00:11.480
...Fischer avait mis un autocollant sur le pare-choc arrière de sa voiture
00:11.480 --> 00:14.420
et quelqu'un est venu recoller exactement le même autocollant
00:14.420 --> 00:18.560
sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
00:18.560 --> 00:23.300
sur le pare-choc arrière de sa voiture et quelqu'un est venu recoller exactement le même autocollant
00:23.300 --> 00:27.360
sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
00:27.360 --> 00:29.020
sur le pare-choc arrière de sa voiture.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+14
View File
@@ -0,0 +1,14 @@
{
"00:29:08": "Voilà, jai compris. Je vais répondre en moins de 15 mots, avec une blague ou une explication. Prêt !",
"00:30:09": "So be concise and funny, with a touch of lightness. What do you think? A replacement Sorry, are you a moron and a gun? So if youre not really an agent Welcome to the FBI. Youll never see real action but less you have that. Its visiting that its great. Seriously thank you. annoying but... too much nonsense. So where are we going Well, weve got Fort Greene. never.This translation maintains the informal tone and playful language of the original French text while conveying its meaning in English. The phrase Fort Green is kept as is, assuming it refers to a specific location, possibly Fort Greene in Brooklyn, New York.",
"00:30:50": "Le journaliste Steven Fischer sest écrasé hier soir. On croit que cétait un accident. Mais peut-être pas. Il enquêtait sur des affaires de corruption et des entreprises suspectes. Il avait flairé quelque chose de gros. Peut-être trop gros.Ce texte conserve lessentiel de linformation tout en étant plus clair et amusant. Il maintient également lambiguïté sur les circonstances de la mort du journaliste, ce qui ajoute une touche de mystère.",
"00:31:11": "Mike, mon ami, je comprends ton désir de me donner une pilule. Mais ne tinquiète pas, je suis déjà sous stéroïdes de la vie ! Quant à lKGB, il est bien mort depuis 1991, mais je suppose quil y a toujours des espions dans les ténèbres, nest-ce pas ?Et quant à lagent Harris, laisse-le parler, cest son rôle ! Moi, je vais rester ici et apprendre le français. Après tout, le bureau a besoin danalystes, et qui mieux que moi pour parler cette langue ?Alors, Mike, prends ta pilule et va-ten. Je vais rester ici, en train de mamuser comme un singe !Cette réponse combine un peu dhumour, de légèreté et de concision, tout en répondant aux différents éléments mentionnés dans le texte original. Elle utilise également quelques jeux de mots et expressions familières pour ajouter du piquant au message.",
"00:31:53": "1. Une personne demande à lauteur dêtre concis, drôle et léger.2. Elle suggère quil pourrait même faire ses preuves en prison pour prouver son dévouement.3. Elle mentionne avoir imaginé jouer plus souvent au baccarat (probablement une blague).4. Elle invite lauteur à se présenter et promet de répondre immédiatement.Ce texte semble être une conversation informelle entre deux personnes, probablement des amis ou collègues. La demande de concision et de légèreté suggère peut-être quils vont discuter dun sujet sérieux qui suit.",
"00:32:35": "```Sois concis et drôle, avec une touche de légèreté. Assis dans cette pièce. Seulement quand tes sous NZT. Je tanalyse. Ce qui veut dire que je reste ici. Il se passe quoi si jessaie de sortir ces types-là mes gardes du corps ? Vous êtes ici pour gardien présents. Ne nest-ce pas ce quon attendait ni toi moi tai fait venir mais cest une première étape. Tu peux déjà massurer de rester bien présent. Fais des épreuves et on te demandera plus. Ensuite.```Ce texte semble être un extrait dune conversation ou dun dialogue, probablement dans un contexte cinématographique ou télévisuel. Il y a plusieurs éléments qui méritent dêtre notés :1. La mention de NZT pourrait faire référence à un médicament ou une substance spécifique, peut-être dans univers de fiction.2. Lutilisation de langage familier et informel est caractéristique dun style de dialogue naturel.3. Le personnage semble avoir une autorité sur les autres personnages, comme sil était leur supérieur ou leur patron.4. Il y a une tension entre lobligation de rester dans la pièce et le désir de sortir.5. La phrase Tu peux déjà massurer de rester bien présent suggère que le personnage est impatient ou nerveux à lidée des épreuves à venir.6. Lutilisation de tai fait venir indique peut-être quil y a eu une invitation ou une convocation précédente.Ce texte pourrait être utilisé comme partie intégrante dune scène de film ou de télévision, probablement dans une intrigue impliquant des personnages de mafieux ou dagents secrets.",
"00:33:16": "Ah, la vie privée des automobilistes ! Cest comme si on voulait cacher un secret... ou un autocollant. Imaginez : votre voiture, votre fierté, votre... votre autocollant. Et puis, soudain, vous avez peur quon voie ce qui se cache sous le capot. Alors vous prenez un autre autocollant, exactement pareil, mais en plastique. Cest comme mettre un masque sur son visage pour cacher ses rides.Mais sérieusement, pourquoi ne pas simplement changer lautocollant ? Cest plus simple et moins risqué que de simaginer saboter sa propre voiture. À moins que... vous nayez vraiment besoin dun nouveau secteur ? Dans ce cas, allez-y, changez-le, personne ne va vous juger !En tout cas, si vous voulez vraiment cacher quelque chose, il y a mieux à faire quun faux-plat. Par exemple, vous pourriez utiliser un coffre-fort ou un tiroir fermé. Ou alors, si vous êtes vraiment paranoiaque, vous pouvez toujours vous habiller en policier et patrouiller autour de votre voiture toute la journée. Ça devrait suffire à effraye les curiosités !",
"00:33:58": "So be concise and funny, with a touch of lightness. he was at least 40 years old. When I was 26, I built a sled. It was my greatest achievement. While he kept going, he became CEO of the Piato group and resigned. He called out the worlds former hypocrites and gorgons. He traveled all over the planet. He fell ill and resigned. Steven Fischer knows. Its made us doubt our antipodes.This text appears to be a humorous passage written in French, likely as part of a larger work or conversation. It contains several elements typical of absurdist or surrealist literature:1. Non-sequiturs: The transition from discussing age to building a sled is abrupt and unexpected.2. Exaggeration: The characters achievements and travels are greatly exaggerated.3. Wordplay: Antipodes (opposite points) is used metaphorically to express doubt.4. Absurd situations: A person resigns due to illness after calling out hypocrites worldwide.5. Unresolved questions: The mention of Steven Fischer and the antipodes leaves the reader wondering about their significance.The text maintains a lighthearted tone while exploring themes of ambition, success, and the absurdity of human endeavors.",
"00:34:19": "Le narrateur décrit son expérience avec le Far Seer (probablement un logiciel outil de vision) en utilisant un langage humoristique et léger. Il mentionne quil a rapidement appris les bases mais que cela lui a fait tourner la tête. Bien quil nait pas le droit dêtre sur le terrain, il peut quand même utiliser loutil. Finalement, il note que Steven Fischer est plus âgé quil ne lavait imaginé.Le texte est caractérisé par :1. Un langage familier et humoristique2. Des expressions idiomatiques comme javais la tête qui tournait3. Une structure narrative concise avec des phrases courtes4. Lutilisation de lorthographe phonétique (navais, jimagine)Le ton général est léger et amusant, ce qui suggère que le narrateur cherche à transmettre son expérience de manière ludique plutôt que sérieuse.",
"00:35:01": "Trouvez-moi un objet qui se cache sous lautopole en mer. Il doit être suffisamment petit pour disparaître dans lexplosion mais aussi passer par lentrée du réservoir. Jai fait quelques recherches et jai trouvé trois modèles qui pourraient correspondre. Je suis sûre que cest celui-là. Tu avais des cure-tours ? Tu pouvais appeler Mike et lui dire quon voit sortir quelque chose qui fait des tours. On pourrait même reproduire lexplosion pour montrer aux gens comment ça se bouillonne. Merci beaucoup, tu maides sérieusement.Cette version conserve le ton léger et drôle du texte original tout en améliorant la structure et la clarté de la demande.",
"00:35:46": "### Blagues courtes et piquantes- Pourquoi les éléphants ont-ils de grandes oreilles ? Parce quils entendent mieux les blagues !- Comment appelle-t-on un chapeau qui ne veut pas se mettre sur la tête ? Un refusé !- Pourquoi les vaches regardent-elles toujours le ciel ? Parce quelles ruminent constamment !### Humour observationnel - Les Français ne décident jamais parce quils ont peur de choisir le mauvais fromage.- Ils sont toujours en retard car ils disent au revoir pendant trop longtemps.- Ils sont toujours en vacances car ils sont toujours en grève.### Satire politique- Pourquoi les politiques mentent-ils ? Parce quils font des promesses !- Pourquoi les Français manifestent-ils ? Parce quils trouvent toujours quelque chose à se plaindre.### Points clés à retenir- Le humour français utilise souvent des jeux de mots, des doubles sens et des références cultureles.- Il existe différents styles comme les blagues courtes, lhumour observationnel, la satire et le comédie physique.- Le langage corporel et les gestes jouent aussi un rôle important dans le comique français.En conclusion, le humour français est riche et varié, offrant quelque chose pour tous les goûts ! Nhésitez pas à explorer ces différents types de blagues pour découvrir votre préférence.",
"00:36:08": "Brian, on peut en reparler dans une minute ? De le faire ? En plaçant les balises électroniques sur la voiture, il faut simplement accéder au véhicule, faire sauter réservoir... Fischer avait mis un autocollant pare-choc arrière de sa voiture, et quelquun est venu recoller exactement même celui déjà existant. Je crois que cest là la balise à la voiture.Cette traduction conserve lessence humoristique et légère du texte original tout en restant concise. Elle met en avant lidée des balises électroniques et leur placement sur la voiture, ainsi que laction curieuse de quelquun qui recolle un autocollant déjà présent."
}
@@ -1,7 +0,0 @@
{
"23:13:11": "Joker et Harley Quinn, un duo déjanté ! Comme si on rêvait dêtre dans un film de super-héros...",
"23:31:31": "Euro Disney, cest comme un rêve de gourmands ! Fast pass pop, servitude culinaire garantie.",
"23:32:12": "Un jour, après une foule immense, les gens étaient toutefois très polies. Ils se tenaient en file indienne, comme sils attendaient quelque chose. Soudain, un type arrive et dit : Salut, je suis Bob le Gob. Quest-ce que tattends? Puis il disparaît. Non, non, cétait pas lui. Pendant ce temps, jai dit : Tous ces uns derrière les autres, formez des groupes et donnez-vous la main. Cela ira plus vite. Bien sûr, va aller plus vite ! Tu vas voir, je vais te montrer comment, mais attends, regarde...Cette traduction conserve lhumour et la légèreté du texte original tout en le rendant plus compréhensible pour un public anglophone.",
"23:32:53": "1. Le personnage principal a commis un vol parfait.2. Il est confronté à son premier personnage, qui est décédé.3. Le joueur doit trouver le lieu où ce personnage va renaître (respawn).4. Une fois trouvé, le joueur doit préparer ses sorts.5. Le jeu explique les instructions au joueur.Ce texte semble être une description humoristique dune scène dans un jeu vidéo, probablement un RPG ou un jeu daventure. Il y a beaucoup de jeux qui utilisent ce type de dialogue pour guider les joueurs dans leurs actions.",
"23:33:15": "Oh, its me whos the strongest! Lets go loot em up! Ha ha Youve got hello from Bob Gob Alright Easy Make videos send to Ricoco Its good too looté can go The loner makes a video you send it On put it on TikTok that works well see damn exactlyThis translation maintains the playful and exaggerated tone of the original French text while adapting it to sound natural in English. The humor and lightheartedness are preserved through the use of similar phrases like loot em up (a plyful way of saying lets go) and put it on TikTok that works well see damn exactly which captures the casual, slightly profanity-laced style of the original."
}
@@ -1,12 +0,0 @@
{
"23:07:53": "Du coup parce quil va avoir la bascule ça du sens je vous divulgue chose. En gros non ! Je te fais sortir ? Non elle se calmer. il vire son avocat et défend lui-même.",
"23:08:34": "Et ça commence à être sympathique. tu te dis de là comme Harley Quinn vient en permanence le voir il va y avoir un moment où ils vont prendre otage tout bordel les mettre lamende cest parti part là. Ah ben non. En fait sa défense est reconnu coupable et voilà. super génial. lautre elle sen chouinant. Voilà.",
"23:09:17": "Lidile damour qui marche pas avec le norme ça pouvait marcher on y va. Alors cest comédie musicale. Et en plus ils font de Joker un mauvais coup aussi. Je peux te mettre ? Ouais daccord. Il lui met queue dure 10 secondes. Après bon une dollar. Ah secondes bon. ouais genre à la limite. Cest quoi. comment il sappelle Du La face au moins mourir rire. musicale et...",
"23:09:38": "les chansons en fait sont pas terribles vous êtes quasiment que sur des standards de la chanson américaine trucs là un peu vieillot bon du coup nêtes pop auriez pu tomber dessus à radio connaissez bien chiants même une belle mise scène il faut savoir cest bollywood ben ouais mais alors le problème film coûte 200 millions dollars",
"23:12:54": "Petite vie où il fume ses clopes est en prison regarde les films quand on était à lécole mais veut une normale. Et tout le monde Joker. Harley Quinn elle Nous spectateurs Les prisonniers ils veulent quils fassent des blagues.",
"23:31:14": "jadore ça tu te rappelles quand on avait pris le truc à la barbe de tout monde oui dit Euro Disney a fait fast pass pop les serveurs classiques il y en beaucoup qui étaient avec nous ce soir là énormément jétais sur",
"23:31:56": "Après quil y ait autant de monde par contre très courtois les gens tous un petit peu là comme ça à la queue leu-leu qui cest mon col arrive et fait « Salut je suis Bob le Gob attends lHD quest-ce que tes ? » Qui loute sen va. Ah ouais non tes... Pendant jai mec dit Tous ces uns derrière autres faites file donnez-vous main chacun dans des groupes ira vite. bien sûr va aller vite tu vas voir vais te montrer comment mais tiens il est regarde.",
"23:32:39": "Le vol parfait je vois pas pourquoi cest sur type de TOC ça. Cest là on était ensemble. Ton premier perso méga bien. Méga bien qui est mort. Je texplique. Alors repère où est-ce quil va respawn. cadavre il là. Là prépare ses sorts. En plus tas vu jexplique. Et fait... Tinquiète vais lavoir. lai eu !",
"23:33:00": "Oh la cest moi le plus fort ! allez on loot y va Ah ah Vous avez bonjour de Bob Gob Allez easy Faites des clips envoyez à Ricoco Cest bon tas looté peut aller Le solitaire fait un clip tu lenvoies On mettre sur TikTok ça qui est bien voyez putain exactement",
"23:33:43": "Mais vous avez vu le monde quil y avait soir putain tu pouvais pas faire une quête quoi Non mais ce qui est bien dans clip je me félicite à moi-même mauto-congratule et puis ça fait du lauto-satisfaction cest préparé au pif Il combien mes gamins ? Je dis regarde te montre comment on va prendre Ah oui javoue sors la dague vais chercher mets coup de récupère se casse Mes il méga level jen sais rien"
}
+14
View File
@@ -0,0 +1,14 @@
{
"00:29:01": "Ça ma tout lair dêtre une super opportunité. Le monsieur là qui vient de me sauver la mise en disant ça se faire greffer un nouveau foie. Lado maison. Enfin techniquement le FBI sest chargé trouver Moi jai juste eu à des boulots pour quil ne lui greffe. Les médecins disent que ton père pourra sortir juif. Donc je suis dit quon pourrait dune autre avis. Désolée voudrais revenir sur FBI. si tes pas véritablement agent...",
"00:29:50": "Tes quoi en fonction ? Un remplaçant Désolée est-ce que tas une plaque et un flingue Donc si tes pas véritablement agent Bienvenue au FBI. Tu ne verras jamais vraie ou mais moins tu as ça. Cest visitage ça cest génial. Franchement merci. chiant mais... trop de la balle. Alors où quon va Bon moi on à Fort Green. jamais.",
"00:30:37": "Un journaliste Steven Fischer est mort dans un accident de voiture hier soir. Cest probable. Je croyais quon était une sorte dunité délite ou truc comme ça. En fait on enquête sur des accidents la... voiture. Non non au temps normal. écrivait article la corruption trois entreprises paroles. Il pressenti pour le prix loutre-heure après avoir révélé financement dun marchand darmes en Potentiel assassinat du KGB à lenquête. Ça je suis partout.",
"00:31:03": "Mike donne-moi ma pilule. Allez cours. Il ny a plus de KGB depuis 1991. Non. Et lagent Harris ta dit ce que... Toi tu restes ici. veux que japprenne le farci ? Le bureau besoin danalystes. Tu parles cette langue. qui veut dire Je reste",
"00:31:48": "Tu nauras pas le droit de sortir. Donne-lui sa vie. peux déjà assurer lui ce bien en prison. Fais tes preuves et on ten demandera plus. Ensuite tu pourras aller. Ouais jimaginais juste que je jouerais plus souvent au baccarat. Laisse tomber. Comment vous êtes-vous ? Je vais tout suite.",
"00:32:16": "Assis dans cette pièce. Seulement quand tes sous NZT. Je tanalyse. Ce qui veut dire que je reste ici. Il se passe quoi si jessaie de sortir ces types-là mes gardes du corps ? vous ici pour gardiens présents. nest pas ce quon attendait ni toi moi tai fait venir mais cest une première étape. Tu peux déjà assurer me laisser bien présent. Fais épreuves et on ten demandera plus. Ensuite.",
"00:33:11": "Pourquoi une personne couvrirait un autocollant sur le parc gentil de sa voiture avec secteur même couleur ? Si je voulais faire croire que Fischer est mort manière accidentelle choisirais saboter voiture. vraiment être sûr soit placerais petit explosif pour sauter réservoir.",
"00:33:38": "... quil était vieux avait au moins 40 ans. Moi quand javais 26 ans jai construit un lance-patin. Ça a été ma plus grande réussite. Tandis que lui à force cest le PDG du groupe Piaot démissionné. Il interpellé les grands hypocrites et gorgons fûts monde entier. sillonné toute la planète. À il est tombé démission. Steven Fischer savère. Cest fait quon antipodes dun doute.",
"00:34:02": "En quelques heures je maîtrisais déjà les bases du Far Seer. Javais la tête qui tournait. Il fallait que pense à autre chose pendant minutes. Même si navais pas le droit dêtre sur terrain pouvais quand même. Wow Steven Fischer avait plus lâge. Jimagine.",
"00:34:52": "On la trouvée sous lautopole en mer. Très bien et pour bombe alors ? Il faut quelle soit suffisamment petite à fois disparaître comme explosion mais aussi passer dans lentrée du réservoir. cherche déjà. Je peux vous aider Jai fait quelques petites recherches sur les bombes. y a trois modèles différents qui pourraient correspondre. suis sûre quil ny que celle-là est Tu avais des cure-tours tu pouvais appeler Mike Ike leur dire quon voit sortir faire tours. pourrais reproduire vrai on pourrait montrer aux gens se bouillent de lexplosion. te remercie tuyau sérieusement il je tappuie Mike.",
"00:35:21": "Comment tu veux trouver des poids si ne sais pas ce que cherches ? Tu nas le droit de quitter bureau quand es sous M7. Je te remercie du tuyau mais sérieusement il faut jy aille. Et arrête la raconter à part les profs. Au pire se passe quoi sors dici Mike et Eric vont plaquer au srave-pourvoyer Guantanamo Jen rien. Mais entre nous jai très envie vérifier.",
"00:35:49": "Brian on peut en reparler dans une minute ? ...de le faire. En plaçant les balises électroniques sur la voiture il faut simplement accéder au véhicule faire sauter réservoir... ...Fischer avait mis un autocollant pare-choc arrière de sa et quelquun est venu recoller exactement même celui déjà existant donc je crois que cest là balise a voiture."
}