File information
Created by
ToxicDrakeUploaded by
ToxicDrakeVirus scan
Inspired by Kasada, Wolfdua, Snk4211, Nolester, Xiaokuii
DESCRIPTION
I don't know if it good or not so please post some comments (y)
Also I don't speak Russian
This mod let TTS (Text-to-speech) AI read Narrator's dialogue, which extracted by STT (Speech-to-text) program
Listen to compare: Samples
>>Male version<<
>>Girl version<<
>>Italian<<
>>French<<
The video using High accurary version
All my mods of Narrator's replacement will base on this from now on
This is a 72-hour transcribed product, it has been edited to sound as real as possible
Do enjoy, give your comments and maybe, a little donation for my time <3
INSTALLATION
Install with BG3ModManager (enable it, allow it) or manually, it's just a single .pak file
OTHER
STT's script ( Google Colaboratory ):
from google.colab import drive
drive.mount('/content/drive')
!pip install git+https://github.com/openai/whisper.git
!sudo apt update && sudo apt install ffmpeg
from google.colab import drive
drive.mount('/content/drive')
import os
import shutil
import time
import re
# Define the directory containing .wav files
audio_dir = "/content/drive/MyDrive/audios"
# Define the output directory in Google Drive
output_dir = "/content/drive/MyDrive/Narrator_Out_Large"
# Define the completed directory in Google Drive
completed_dir = "/content/drive/MyDrive/Completed/audios"
# Counter for processed files
counter = 0
# Get the total number of .wav files
total_files = len([name for name in os.listdir(audio_dir) if name.endswith(".wav")])
# Function to replace any existing file or folder
def replace_existing(path):
if os.path.exists(path):
if os.path.isfile(path):
os.remove(path)
else:
shutil.rmtree(path)
# Create the output and completed directories if they don't exist
for dir in [output_dir, completed_dir]:
if not os.path.exists(dir):
os.makedirs(dir)
# Check if there are .txt files in the output directory that have similar names to any .wav files in the audio directory
for filename in os.listdir(output_dir):
if filename.endswith(".txt"):
wav_file = os.path.join(audio_dir, os.path.splitext(filename)[0] + ".wav")
if os.path.exists(wav_file):
shutil.move(wav_file, completed_dir)
# Check if there are .wav files in the completed directory that don't have similar names to any .txt files in the output directory
for filename in os.listdir(completed_dir):
if filename.endswith(".wav"):
txt_file = os.path.join(output_dir, os.path.splitext(filename)[0] + ".txt")
if not os.path.exists(txt_file):
shutil.move(os.path.join(completed_dir, filename), audio_dir)
# Iterate over all files in the directory
for filename in os.listdir(audio_dir):
if filename.endswith(".wav"):
# Full path to the .wav file
wav_file = os.path.join(audio_dir, filename)
# Attempt to transcribe the file up to 5 times
for attempt in range(5):
try:
# Transcribe the .wav file
!whisper "$wav_file" --model large
# If transcription is successful, move the .txt file to Google Drive and print a number
txt_file = "/content/" + os.path.splitext(filename)[0] + ".txt"
# Open the transcribed text file and read its content
with open(txt_file, 'r') as file:
data = file.read()
# Replace multiple "." with a single "."
data = re.sub('\.+', '.', data)
# Replace newline characters with a space to ensure the transcribed text does not contain more than one line
data = data.replace('\n', ' ')
# Write the modified content back to the file
with open(txt_file, 'w') as file:
file.write(data)
# Replace any existing file or folder
replace_existing(os.path.join(output_dir, os.path.basename(txt_file)))
shutil.move(txt_file, output_dir)
# Move the .wav file to the completed directory
shutil.move(wav_file, completed_dir)
# Print the counter for successful transcriptions along with the filename
print(f"Successfully transcribed file number {counter + 1} - {filename}")
print(f"Transcribed content: \n{data}")
# If successful, break the loop and move on to the next file
break
except Exception as e:
print(f"Failed attempt {attempt+1} for {filename}: {e}")
# Wait for a bit before trying again
time.sleep(5)
# Increment the counter for processed files
counter += 1
# Print the progress percentage
print(f"Progress: {round((counter / total_files) * 100, 2)}%")
print("[================ TRANSCRIPTION COMPLETED ================]")