# pip install streamlit import streamlit as st import soundfile as sf import json import datetime from datetime import datetime as date from datetime import timedelta as td import math import pandas as pd import plotly.express as px from pydub import AudioSegment import tempfile import os import subprocess # # Chargement du fichier des utilisateurs # with open("users_info.json", 'r') as file: # dict_user = json.load(file) # # Logo de la page # my_logo = logo.add_logo(logo_path="logo-digitalix.png", width=100, height=100) # st.image(my_logo) # # Titre de la page # st.title("TRANSCRIPTION AUDIO AUTOMATIQUE DIGITALIX") # st.write("# Bienvenue! 👋") # st.markdown( # """ # Transcrivez facilement vos fichiers audio en texte avec notre application. # Il vous suffit de télécharger votre fichier audio et nous nous occupons du reste # """ # ) # # Check authentication # authenticate.set_st_state_vars() # # Add login/logout buttons # if st.session_state["authenticated"]: # authenticate.button_logout() # else: # authenticate.button_login() # # user info # auth_code = st.session_state["auth_code"] # user_info = st.session_state["user_info"] # maintenant = datetime.datetime.now() # username = user_info['username'] # user_pool_name = 'transcription_streamlit' # # add user to users_dict and group free # if user_info['username'] not in dict_user.keys(): # dict_user[user_info['username']] = {"email": user_info['email'], # "durees_audio_sec":[], # "date_inscription":str(maintenant), # "dates_transcription":[], # "abonnement":1} # #group_name = 'utilisateurs_gratuits' # # get user pool id # #user_pool_id = authenticate.get_user_pool_id(user_pool_name) # #print("User Pool ID:", user_pool_id) # #authenticate.add_user_to_group(user_pool_id, username, group_name) # # Calcul annee-mois de trascription # Year = maintenant.year # Month = maintenant.month # Year_Month = str(Year) + '_' + str(Month).zfill(2) # #Definition quota utilisation # quota_20H = 1000 # # Pour des groupes d'utilisateurs # if (st.session_state["authenticated"] and "utilisateurs_sidwaya" in st.session_state["user_cognito_groups"]): # #print("Code authentification:",auth_code) # #print("information utilisateur:",user_info) # st.write( # """ # ## Comment faire la transcription? # - Sélectionner votre fichier audio à transcrire (dans la partie "charger l'audio", appuyer sur "Browse files", # choisir l'audio et attendre son chargement sur le site) # - Cliquer sur le bouton "Transcrire l'audio à gauche de la page" # - Attender que la transcription automatique soit effectuée # - Consultez le texte transcrit à l'écran et télécharger-le si nécessaire # - Formats de fichiers audio pris en charge : MP3,WAV,M4A. # ### Confidentialité : # Nous comprenons l'importance de la confidentialité de vos données. # Votre fichier audio est utilisé uniquement pour la transcription et est supprimé de nos serveurs après le processus de transcription # Amuser-vous!""" # ) def graphique_utilisation(data, username, annee_mois): # Copie des données dict_user = data # Transformation en dataframe df_user = pd.DataFrame(dict_user).T.reset_index() df_user.rename(columns={"index":"usernames"},inplace = True) # Separation des lignes de listes en plusieurs lignes pour les colonees duree_audio_sec et dates_transcription df_duree = df_user.drop(['dates_transcription'],axis=1) df_duree = df_duree.explode('durees_audio_sec') df_duree = df_duree.reset_index(drop=True) df_transcription = df_user.drop(['durees_audio_sec'],axis=1) df_transcription = df_transcription.explode('dates_transcription') df_transcription = df_transcription.reset_index(drop=True) # Regroupement des dataframes df_user = df_duree.copy() df_user["dates_transcription"] = df_transcription["dates_transcription"] df_user['date_inscription'] = pd.to_datetime(df_user['date_inscription'],format = "%Y-%m-%d %H:%M:%S.%f") df_user['dates_transcription'] = pd.to_datetime(df_user['dates_transcription'],format = "%Y-%m-%d %H:%M:%S.%f") # Calcul annee-mois de trascription df_user['Year'] = df_user['dates_transcription'].dt.year df_user['Month'] = df_user['dates_transcription'].dt.month df_user['Year_Month'] = df_user['Year'].astype(str) + '_' + df_user['Month'].astype(str).str.zfill(2) # Selection utilisateur et mois d'utilisation #print(username) #print(annee_mois) a =df_user[(df_user["usernames"] == username) & (df_user["Year_Month"] == annee_mois)] a["Consommation_heures"] = a["durees_audio_sec"].cumsum() a["Consommation_heures"] = a["Consommation_heures"].values / 3600 fig = px.line(a, x='dates_transcription', y='Consommation_heures') # Calcul temps total de transcription en secondes du mois temps = a["durees_audio_sec"].sum() if len(a["Consommation_heures"])!= 0 : # Ajouter la limite de temps 20H = 72000 s fig.add_shape(type="line", x0=fig['data'][0]['x'][0], x1=fig['data'][0]['x'][-1], y0=20, y1=20, line=dict(color='red', width=2, dash='dash')) # Afficher la légende de la limite SEUIL DE 20H = 72000 secondes fig.add_annotation(x=fig['data'][0]['x'][-1], y=20, text="SEUIL DE 20H", showarrow=False, font=dict(color="red"), xshift=-40, # Shift the label to the left yshift=20) # Shift the label downwards # Afficher la figure interactive # fig.show() return fig,temps else: return fig,temps def transcript(dict_user,username,user_group, audio_file,maintenant,Year_Month,quota_20H,model): # Calcul consommation utilisateur figure , consommation = graphique_utilisation(dict_user, username, Year_Month) if audio_file is not None: #audio_file = convert_audio_to_mp3(audio_file) # Créer un fichier temporaire with tempfile.NamedTemporaryFile(delete=False) as temp_file: temp_filename = temp_file.name # Écrire les données du fichier téléchargé dans le fichier temporaire temp_file.write(audio_file.read()) # Afficher le chemin du fichier temporaire #st.success(f'Fichier enregistré : {temp_filename}') infos_audio = sf.info(temp_filename) # Extraire la durée en secondes duree_audio_sec = infos_audio.duration print(duree_audio_sec) st.sidebar.header("Ecouter le fichier audio") st.sidebar.audio(audio_file) ### Utilisateur SIDWAYA if user_group == "utilisateurs_sidwaya": date_inscription = dict_user[username]['date_inscription'] format = "%Y-%m-%d %H:%M:%S.%f" datetime_obj = date.strptime(date_inscription, format) # Calculate the difference between the two dates difference = maintenant - datetime_obj # print(type(difference)) # Compare if the difference is less than or equal to one year one_year = td(days=365) is_one_year_before = difference <= one_year if (is_one_year_before): if consommation > quota_20H: st.text("Quota de transcription audio du mois dépassé") text_transcript = "" #audio_name = "" else : # Mise à jour info utilisateurs dict_user[username]["durees_audio_sec"].append(duree_audio_sec) dict_user[username]["dates_transcription"].append(str(maintenant)) with open('users_info.json', 'w') as f: json.dump(dict_user, f) st.sidebar.success("Audio en cours de transcription") audio_name = audio_file.name transcription = model.transcribe(temp_filename) st.sidebar.success("Transcription terminée") st.balloons() text_transcript = transcription["text"] st.markdown(text_transcript) # Ajout boutton de téléchargement st.download_button('Télécharger la transcription', text_transcript) # Streamlit widgets automatically run the script from top to bottom. Since # this button is not connected to any other logic, it just causes a plain # rerun. # st.button("Re-run") # if st.sidebar.button("Enregistrer un audio") : # audio_bytes = audio_recorder() # if st.sidebar.button("Transcrire l'audio"): # if audio_bytes is not None: # st.sidebar.success("Audio en cours de transcription") # transcription = model.transcribe(audio_bytes) # st.sidebar.success("Transcription terminée") # st.balloons() # text_transcript = transcription["text"] # st.markdown(text_transcript) # # Ajout boutton de téléchargement # st.download_button('Télécharger la transcription', text_transcript) # # Streamlit widgets automatically run the script from top to bottom. Since # # this button is not connected to any other logic, it just causes a plain # # rerun. # # st.button("Re-run") # else: # st.sidebar.error("Erreur : Charger un fichier audio") # st.sidebar.header("Ecouter le fichier audio") # st.sidebar.audio(audio_bytes) ### Utilisateurs gratuits et VIP #### if ((user_group == "utilisateurs_vip") or (user_group == "utilisateurs_gratuits")): if consommation > quota_20H: st.text("Quota gratuit dépassé,veuillez contactez l'administrateur pour vous abonner") text_transcript = "" #audio_name = "" else : # Mise à jour info utilisateurs dict_user[username]["durees_audio_sec"].append(duree_audio_sec) dict_user[username]["dates_transcription"].append(str(maintenant)) with open('users_info.json', 'w') as f: json.dump(dict_user, f) st.sidebar.success("Audio en cours de transcription") audio_name = audio_file.name transcription = model.transcribe(temp_filename) st.sidebar.success("Transcription terminée") st.balloons() text_transcript = transcription["text"] st.markdown(text_transcript) # Ajout boutton de téléchargement st.download_button('Télécharger la transcription', text_transcript) # Streamlit widgets automatically run the script from top to bottom. Since # this button is not connected to any other logic, it just causes a plain # rerun. # st.button("Re-run") else: st.sidebar.error("Erreur : Charger un fichier audio") text_transcript = "" #audio_name = "" return text_transcript def convert_audio_to_mp3(input_file): # Créer un nom de fichier de sortie avec l'extension .mp3 output_file = os.path.splitext(input_file.name)[0] + ".mp3" # Utiliser FFmpeg pour convertir le fichier audio en MP3 subprocess.run(["ffmpeg", "-i", input_file.name, "-codec:a", "libmp3lame", "-qscale:a", "2", output_file]) # Ouvrir le fichier MP3 converti en mode lecture mp3_file = open(output_file, "rb") return mp3_file