|
import json |
|
import torch |
|
from TTS.api import TTS |
|
import gradio as gr |
|
from bs4 import BeautifulSoup |
|
|
|
|
|
def parse_html_to_dict(file_path): |
|
with open(file_path, 'r', encoding='utf-8') as file: |
|
html_content = file.read() |
|
|
|
soup = BeautifulSoup(html_content, 'html.parser') |
|
language_dict = {} |
|
for p in soup.find_all('p')[1:]: |
|
parts = p.get_text().split() |
|
if len(parts) >= 2: |
|
code = parts[0].strip() |
|
name = " ".join(parts[1:]).strip() |
|
language_dict[name] = code |
|
return language_dict |
|
|
|
|
|
file_path = '1100_lan.htm' |
|
language_dict = parse_html_to_dict(file_path) |
|
languages = list(language_dict.keys()) |
|
iso_codes = list(language_dict.values()) |
|
|
|
|
|
device = "cuda" if torch.cuda.is_available() else "cpu" |
|
|
|
|
|
def generate_audio(text, language_code): |
|
model_name = f"tts_models/{language_code}/fairseq/vits" |
|
tts = TTS(model_name=model_name, progress_bar=False).to(device) |
|
output_path = "output_file.wav" |
|
tts.tts_to_file(text=text, file_path=output_path) |
|
return output_path |
|
|
|
|
|
def filter_languages(search_term): |
|
if not search_term: |
|
return gr.update(choices=languages, value=None) |
|
filtered = [lang for lang in languages if search_term.lower() in lang.lower()] |
|
return gr.update(choices=filtered, value=None if not filtered else filtered[0]) |
|
|
|
|
|
def update_iso_code(selected_language): |
|
return language_dict.get(selected_language, "Unknown") |
|
|
|
|
|
def run_interface(): |
|
with gr.Blocks() as demo: |
|
with gr.Row(): |
|
search_input = gr.Textbox( |
|
label="Search Language", |
|
placeholder="Type to search...", |
|
show_label=True |
|
) |
|
with gr.Row(): |
|
language_dropdown = gr.Dropdown( |
|
choices=languages, |
|
label="Select Language", |
|
show_label=True, |
|
interactive=True |
|
) |
|
with gr.Row(): |
|
text_input = gr.Textbox(label="Enter Text", lines=4, placeholder="Type your text here...") |
|
generate_button = gr.Button("Generate Audio") |
|
output_audio = gr.Audio(label="Generated Audio", type="filepath") |
|
|
|
|
|
search_input.change( |
|
fn=filter_languages, |
|
inputs=[search_input], |
|
outputs=language_dropdown |
|
) |
|
|
|
|
|
generate_button.click( |
|
fn=lambda text, lang: generate_audio(text, update_iso_code(lang)), |
|
inputs=[text_input, language_dropdown], |
|
outputs=[output_audio] |
|
) |
|
|
|
demo.launch() |
|
|
|
|
|
if __name__ == "__main__": |
|
run_interface() |
|
|