import argparse import re def sum_seconds(time, seconds): # Get time in seconds time = time.split(",") time_milisecons = time[1] time_milisecons = int(time_milisecons)/1000 time = time[0].split(":") time = int(time[0])*3600 + int(time[1])*60 + int(time[2]) # Get integer and decimal part of seconds seconds, seconds_miliseconds = divmod(seconds, 1) seconds = int(seconds) seconds_miliseconds = round(seconds_miliseconds, 3) # Add seconds time = time + seconds time_milisecons = time_milisecons + seconds_miliseconds if time_milisecons >= 1: time = time + 1 time_milisecons = time_milisecons - 1 time_milisecons = round(time_milisecons, 3) # Get time in hh:mm:ss,mmm format hours = int(time) // 3600 minutes = (int(time) % 3600) // 60 seconds = (int(time) % 3600) % 60 time_milisecons = str(time_milisecons).split(".")[1] time = f"{hours:02d}:{minutes:02d}:{seconds:02d},{time_milisecons}" return time def hmsms_to_seconds(time): # Get time in seconds time = time.split(",") milisecons = time[1] time = time[0].split(":") time = int(time[0])*3600 + int(time[1])*60 + int(time[2]) time = time + int(milisecons)/1000 return time def concatenate_transcriptions(chunk_files, seconds): chunk_folder = "transcriptions" output_folder = "concatenated_transcriptions" transcription_extension = "srt" # Read chunk files with open(chunk_files, "r") as f: files = f.read().splitlines() # Concatenate transcriptions transcription = "" num_transcriptions = 1 for i, file in enumerate(files): chunk = file _, file = chunk.split("/") file, _ = file.split(".") transcription_chunk_file = f"{chunk_folder}/{file}.{transcription_extension}" with open(transcription_chunk_file, "r") as f: transcription_chunk = f.read().splitlines() for line in transcription_chunk: # if line is dd:dd:dd,ddd --> dd:dd:dd,ddd if re.match(r"\d\d:\d\d:\d\d,\d\d\d --> \d\d:\d\d:\d\d,\d\d\d", line): # Get start time (dd:dd:dd,ddd) and end time (dd:dd:dd,ddd) start, end = line.split(" --> ") # Add seconds to start and end time start = sum_seconds(start, i*seconds) end = sum_seconds(end, i*seconds) # Add to transcription transcription += f"{start} --> {end}\n" # if line is a number and carriage return --> number elif re.match(r"\d+$", line): transcription += f"{num_transcriptions}\n" num_transcriptions += 1 else: transcription += f"{line}\n" # Write transcription file_split = file.split("_")[:-1] file = "_".join(file_split) output_file = f"{output_folder}/{file}.{transcription_extension}" with open(output_file, "w") as f: f.write(transcription) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("chunk_files", help="Path to the file containing the paths to the chunk files") parser.add_argument("seconds", help="Duration of each chunk in seconds") parser.add_argument('speakers_file', help='File with the number of speakers') args = parser.parse_args() chunk_files = args.chunk_files seconds = int(args.seconds) with open(args.speakers_file, 'r') as f: speakers = f.read().splitlines() speakers = int(speakers[0]) if speakers > 0: for speaker in range(speakers): pass else: concatenate_transcriptions(chunk_files, seconds)