Spaces:
Runtime error
Runtime error
import gradio as gr | |
from transformers import pipeline, SpeechT5Processor, SpeechT5ForTextToSpeech, SpeechT5HifiGan | |
from datasets import load_dataset | |
import torch | |
replacements = [ | |
("á", "a"), | |
("í", "i"), | |
("ñ", "n"), | |
("ó", "o"), | |
("ú", "u"), | |
("ü", "u"), | |
] | |
def cleanup_text(text): | |
for src, dst in replacements: | |
text = text.replace(src, dst) | |
return text | |
def modelo1(image): | |
imageToText = pipeline( | |
"image-to-text", model="Salesforce/blip-image-captioning-large") | |
resultado = imageToText(image) | |
resultado = resultado[0]["generated_text"].replace("araffe ", "") | |
return resultado | |
def modelo2(text): | |
enToEs = pipeline("translation", model="Helsinki-NLP/opus-mt-en-es") | |
resultado = enToEs(text) | |
return resultado[0]["translation_text"] | |
def modelo3En(text): | |
processor = SpeechT5Processor.from_pretrained("microsoft/speecht5_tts") | |
model = SpeechT5ForTextToSpeech.from_pretrained("microsoft/speecht5_tts") | |
vocoder = SpeechT5HifiGan.from_pretrained("microsoft/speecht5_hifigan") | |
embeddings_dataset = load_dataset("Matthijs/cmu-arctic-xvectors", split="validation") | |
speaker_embeddings = torch.tensor(embeddings_dataset[7306]["xvector"]).unsqueeze(0) | |
inputs = processor(text=text, return_tensors="pt") | |
speech = model.generate_speech(inputs["input_ids"], speaker_embeddings, vocoder=vocoder) | |
return (16000, speech.cpu().numpy()) | |
def modelo3Es(text): | |
model = SpeechT5ForTextToSpeech.from_pretrained("Sandiago21/speecht5_finetuned_facebook_voxpopuli_spanish") | |
vocoder = SpeechT5HifiGan.from_pretrained("microsoft/speecht5_hifigan") | |
embeddings_dataset = load_dataset("Matthijs/cmu-arctic-xvectors", split="validation") | |
processor = SpeechT5Processor.from_pretrained("microsoft/speecht5_tts") | |
speaker_embeddings = torch.tensor(embeddings_dataset[7440]["xvector"]).unsqueeze(0) | |
text = cleanup_text(text) | |
inputs = processor(text=text, return_tensors="pt") | |
speech = model.generate_speech(inputs["input_ids"], speaker_embeddings, vocoder=vocoder) | |
return (16000, speech.cpu().numpy()) | |
def executionIMG(image, lan): | |
if lan == 'english': | |
model1res = modelo1(image) | |
model3res = modelo3En(model1res) | |
return model3res | |
elif lan == 'spanish': | |
model1res = modelo1(image) | |
model2res = modelo2(model1res) | |
model3res = modelo3Es(model2res) | |
return model3res | |
def executionTEXT(text, lan): | |
if lan == 'english': | |
model3res = modelo3En(text) | |
return model3res | |
elif lan == 'spanish': | |
model3res = modelo3Es(text) | |
return model3res | |
with gr.Blocks() as demo: | |
gr.Markdown( | |
""" | |
Se quiere hacer un programa que saque un audio de una imagen o de un texto, el cual tiene que ser introducido por el usuario. Para resolver este problema se realiza el siguiente programa. Se van a usar | |
tres modelos (Salesforce/blip-image-captioning-large, Helsinki-NLP/opus-mt-en-es, microsoft/speecht5_tts), los cuales se describen a continuación cuál es la función de cada uno: \n | |
- Primero necesitaremos dos Tabs, uno con un input tipo Image (IMAGE) en el que pasaremos una imagen y otro con un input tipo Textbox (TEXT) en el que pasaremos un texto. \n | |
- En el caso de la imagen, la pasaremos a texto usando un modelo con esta función (Salesforce/blip-image-captioning-large). Este modelo está entrenado para sacar texto describiendo qué hay en la | |
foto. El modelo nos sacará un texto en inglés. \n | |
- En caso del texto, no hace falta usar el modelo anterior ya que directamente tenemos el texto que queremos pasar a audio. \n | |
- Luego, tenemos un evento de tipo Radio, con el cual podemos elegir el idioma en el que vamos a sacar el audio. En el caso de la imagen, dado que el modelo saca el texto de esta imagen en inglés, | |
si hemos seleccionado que queremos sacar el audio en español tendremos que traducir este texto de inglés a español. En el caso del texto se da por hecho que el texto va a ser introducido en el | |
mismo idioma que se quiere sacar el audio. \n | |
- Para traducir el texto usaremos un modelo que está entrenado para pasar texto de inglés a español (Helsinki-NLP/opus-mt-en-es), por lo que nos devolverá un texto casi perfectamente traducido al | |
español. \n | |
- Una vez tenemos el texto que queremos pasar a audio en el idioma deseado, con el último modelo pasaremos este texto a audio (microsoft/speecht5_tts). Este modelo está entrenado para sacar audio a | |
raíz de un texto, en el que | |
se escucha justo lo que pone en el texto que le mandamos. \n | |
- Por último tendremos un output de tipo Audio que nos mostrará el audio que hemos conseguido con el último modelo. | |
""") | |
with gr.Tab("IMAGE"): | |
inp = gr.Image(type="pil") | |
language = gr.Radio(["english", "spanish"], label="Language", info="Choose the language in which you want the audio to appear", value='english', interactive=True) | |
out = gr.Audio() | |
btn = gr.Button("RUN") | |
btn.click(fn=executionIMG, inputs=[inp, language], outputs=out) | |
with gr.Tab("TEXT"): | |
inp = gr.Textbox() | |
language = gr.Radio(["english", "spanish"], label="Language", info="Choose the language in which you want the audio to appear", value='english', interactive=True) | |
out = gr.Audio() | |
btn = gr.Button("RUN") | |
btn.click(fn=executionTEXT, inputs=[inp, language], outputs=out) | |
demo.launch() | |