91 lines
3.4 KiB
Python
91 lines
3.4 KiB
Python
import os
|
|
import datetime
|
|
from glob import glob
|
|
import whisper
|
|
from torch import cuda, Generator
|
|
import colorama
|
|
from colorama import Back,Fore
|
|
colorama.init(autoreset=True)
|
|
|
|
|
|
# Get the path
|
|
def get_path(path):
|
|
glob_file = glob(path + '/*')
|
|
return glob_file
|
|
|
|
# Main function
|
|
def transcribe(path, glob_file, model=None, language=None, verbose=False):
|
|
"""
|
|
Transcribes audio files in a specified folder using OpenAI's Whisper model.
|
|
|
|
Args:
|
|
path (str): Path to the folder containing the audio files.
|
|
glob_file (list): List of audio file paths to transcribe.
|
|
model (str, optional): Name of the Whisper model to use for transcription.
|
|
Defaults to None, which uses the default model.
|
|
language (str, optional): Language code for transcription. Defaults to None,
|
|
which enables automatic language detection.
|
|
verbose (bool, optional): If True, enables verbose mode with detailed information
|
|
during the transcription process. Defaults to False.
|
|
|
|
Returns:
|
|
str: A message indicating the result of the transcription process.
|
|
|
|
Raises:
|
|
RuntimeError: If an invalid file is encountered, it will be skipped.
|
|
|
|
Notes:
|
|
- The function downloads the specified model if not available locally.
|
|
- The transcribed text files will be saved in a "transcriptions" folder
|
|
within the specified path.
|
|
|
|
"""
|
|
# Check for GPU acceleration
|
|
if cuda.is_available():
|
|
Generator('cuda').manual_seed(42)
|
|
else:
|
|
Generator().manual_seed(42)
|
|
# Load model
|
|
model = whisper.load_model(model)
|
|
# Start main loop
|
|
files_transcripted=[]
|
|
for file in glob_file:
|
|
title = os.path.basename(file).split('.')[0]
|
|
print(Back.CYAN + '\nTrying to transcribe file named: {}\U0001f550'.format(title))
|
|
try:
|
|
result = model.transcribe(
|
|
file,
|
|
language=language,
|
|
verbose=verbose
|
|
)
|
|
files_transcripted.append(result)
|
|
# Make folder if missing
|
|
try:
|
|
os.makedirs('{}/transcriptions'.format(path), exist_ok=True)
|
|
except FileExistsError:
|
|
pass
|
|
# Create segments for text files
|
|
start = []
|
|
end = []
|
|
text = []
|
|
for segment in result['segments']:
|
|
start.append(str(datetime.timedelta(seconds=segment['start'])))
|
|
end.append(str(datetime.timedelta(seconds=segment['end'])))
|
|
text.append(segment['text'])
|
|
# Save files to transcriptions folder
|
|
with open("{}/transcriptions/{}.txt".format(path, title), 'w', encoding='utf-8') as file:
|
|
file.write(title)
|
|
for i in range(len(result['segments'])):
|
|
file.write('\n[{} --> {}]:{}'.format(start[i], end[i], text[i]))
|
|
# Skip invalid files
|
|
except RuntimeError:
|
|
print(Fore.RED + 'Not a valid file, skipping.')
|
|
pass
|
|
# Check if any files were processed.
|
|
if len(files_transcripted) > 0:
|
|
output_text = 'Finished transcription, {} files can be found in {}/transcriptions'.format(len(files_transcripted), path)
|
|
else:
|
|
output_text = 'No files elligible for transcription, try adding audio or video files to this folder or choose another folder!'
|
|
# Return output text
|
|
return output_text
|