0 of 0

File information

Last updated

Original upload

Created by

ToxicDrake

Uploaded by

ToxicDrake

Virus scan

Some manually verified files

About this mod

Replace Narrator's with AI's Text-to-speech voice

Permissions and credits
Donations
CREDIT
Inspired by KasadaWolfduaSnk4211NolesterXiaokuii

DESCRIPTION


My game, my money, I do what I want
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<<
>>Female version<<

The video using Low 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 ================]")

       hire Me for any Voice request █