logo
banner
Rating
Voted0

Nimi Narrator

0
Mod version:2
Game version:4.1.1.6897358
The mod has been successfully tested for the absence of viruses
image

Baldur's Gate 3

Report mod

  • image
modalImage

About This Mod

This mod let TTS (Text-to-speech) AI read Narrator's dialogue, which extracted by STT (Speech-to-text) program

‧˚₊꒷꒦︶꒷꒦꒷︶꒦꒷₊˚‧


Nimi Nightmare as Narrator's voice actor

Inspired by KasadaWolfduaSnk4211NolesterXiaokuii


Script of STT:

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 ================]")

Similar Mods/Addons

Game Version *

4.1.1.6897358 (Nimi Narrator-4113-2-1756183538.rar) Nimi Narrator

4.1.1.6897358 (Full audios pack-4113-1-1699629855.rar) Nimi Narrator (Audio)

4.1.1.6897358 (Narrator voice lines-4113-1-1756091396.rar) Narrator Voice Lines as Text