ejercicios/utilities/text_to_voice.py

59 lines
1.6 KiB
Python

import re
import pyttsx3
def show_voices_available():
engine = pyttsx3.init()
voices = engine.getProperty('voices')
for i, voice in enumerate(voices):
print(f"Voice {i}: {voice.name}, {voice.id}, {voice.languages}")
def read_srt_file_in_blocks(subtitles, block_size=500):
subtitles_split = subtitles.split(". ")
for i in range(0, len(subtitles_split), block_size):
yield " ".join(subtitles_split[i:i + block_size])
def process_in_blocks(engine, subtitles):
for i, text_block in enumerate(read_srt_file_in_blocks(subtitles)):
audio_file = f"audio_part_{i + 1}.mp3"
engine.save_to_file(text_block, audio_file)
print(f"Generating: {audio_file}")
engine.runAndWait()
def process_all(engine, subtitles):
engine.save_to_file(subtitles, "audio.mp3")
engine.runAndWait()
def generate_voice(text_path):
engine = pyttsx3.init()
rate = engine.getProperty('rate')
engine.setProperty('rate', rate - 50)
engine.setProperty('volume', 0.9)
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[1].id)
with open(text_path, "r") as file:
content = file.read()
text = re.findall(
r"(?<=\n\n)(?:\d+\n)?\d{2}:\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3}\n(.+?)(?=\n\n|\Z)", content,
re.DOTALL)
subtitles = " ".join(text)
# process_in_blocks(engine, subtitles)
process_all(engine, subtitles)
print("Audio generated successfully!")
if __name__ == "__main__":
generate_voice("subtitles.srt")