File size: 5,639 Bytes
8ec42f8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fff53af
8ec42f8
 
 
 
 
 
 
 
 
 
 
 
 
 
fff53af
8ec42f8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1c9ce5b
8ec42f8
 
 
 
 
 
1c9ce5b
8ec42f8
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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()