aleegr10's picture
update
fff53af
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()