File size: 5,013 Bytes
c5047d6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
from gtts import gTTS
import gradio as gr
from translate import Translator

# os.environ['TF_CPP_MIN_LOG_LEVEL']='3'

# auth_token = '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'   # For accessing HuggingFace Facebook Model. 

class Languages:
    """ Languages currently supported by the application. """
# Language code
# lang (string, optional) – The language (IETF language tag) to read the text in. Default is en.
    lang = {'Afrikaans': 'af','Arabic':'ar','Bulgarian':'bg','Bengali':'bn','Bosnian':'bs',
    'Catalan':'ca','Czech':'cs','Danish':'da','German':'de','Greek':'el','English':'en',
    'Spanish':'es','Estonian':'et','Finnish':'fi','French':'fr','Gujarati':'gu','Hindi':'hi',
    'Croatian':'hr','Hungarian':'hu','Indonesian':'id','Icelandic':'is','Italian':'it',
    'Hebrew':'iw','Japanese':'ja','Javanese':'jw','Khmer':'km','Kannada':'kn','Korean':'ko',
    'Latin':'la','Latvian':'lv','Malayalam':'ml','Marathi':'mr','Malay':'ms',
    'Myanmar (Burmese)':'my','Nepali':'ne', 'Dutch':'nl','Norwegian':'no',
    'Polish':'pl','Portuguese':'pt','Romanian':'ro','Russian':'ru','Sinhala':'si',
    'Slovak':'sk', 'Albanian':'sq','Serbian':'sr','Sundanese':'su','Swedish':'sv',
    'Swahili':'sw','Tamil':'ta','Telugu':'te','Thai':'th','Filipino':'tl','Turkish':'tr',
    'Ukrainian':'uk','Urdu':'ur','Vietnamese':'vi','Chinese (Simplified)':'zh-CN',
    'Chinese (Mandarin/Taiwan)':'zh-TW',
    'Chinese (Mandarin)':'zh'}

class TLD:
    """ Depending on the top-level domain, gTTS can speak in different accents. """

    tld = {'English(Australia)':'com.au', 'English (United Kingdom)':'co.uk',
    'English (United States)':'us', 'English (Canada)':'ca','English (India)':'co.in',
    'English (Ireland)':'ie','English (South Africa)':'co.za','French (Canada)':'ca',
    'French (France)':'fr','Portuguese (Brazil)':'com.br','Portuguese (Portugal)':'pt',
    'Spanish (Mexico)':'com.mx','Spanish (Spain)':'es','Spanish (United States)':'us'}

class TTSLayer():
    """ Layer on top of gTTS - providing text to speech for """

    def __init__(self, text, tld, lang) -> None:
        """ [Constructor takes in text, the top-level domain and the language in which the text is : ] """
        self.text = text
        self.tld = tld    
        self.lang = lang
    
    def tts(self):
        """ [Converts the text to speech.] """
        tts = gTTS(text=self.text,tld= TLD.tld[self.tld], lang=Languages.lang[self.lang])
        tts.save('tts.mp3')
        with open('tts.mp3') as fp:
            return fp.name

langs = Languages()
top_level_domain = TLD()

""" [Utiility Functions] """

def T2TConversion(text, dest):
    """ [(Utility Function) : Converts sentence from english to another language ] """
    translator = Translator(to_lang=langs.lang[dest])
    return translator.translate(text)

def convert_text(Text,Language, Accent):
    """ [(Utility Function) : Performs Text-To-Speech provided language and accent.] """
    tts = TTSLayer(Text,Accent, Language)
    return tts.tts()


class GRadioInterface:
    """ [Class for managing UI for the application.] """
    def __init__(self, function) -> None:
        """ [Interface for packaging GRadio Application] """
        
        # Necessary for interface
        self._function = function
        self._inputs = [
                gr.TextArea(label = 'The Text to be Converted to Audio'),
                gr.Dropdown([key for key,_ in langs.lang.items()], label='Languages Available',), 
                gr.Dropdown([key for key,_ in top_level_domain.tld.items()])]

        self.outputs = gr.Audio()

        # Necessary for descriptive content
        self.title = 'A Text-To-Speech Converter for Low Resource Languages'
        self.description = 'Support over 50 languages !'
        self.article = 'How does it work ? Just write a sentence (in target language) in the space provided and select the target language and accent and press submit. That is it. Wait and Enjoy.'
    
    def start(self):
        """ [Launching the interface in a tabbed manner.] """

        it_1 = gr.Interface(fn=self._function, inputs=self._inputs,outputs=self.outputs,
            title = self.title,
            description=  self.description,
            article= self.article)
            
        it_2 =  gr.Interface(fn=T2TConversion, 
            inputs = [ 
                gr.Text(label='Write a sentence in English'),
                gr.Dropdown([key for key,_ in langs.lang.items()])], 
            outputs= gr.Text(label='The Converted Text'),
            title = 'Translation from English',
            description='Write a sentence in english and convert to other languages for speech synthesis',
            article='What if you do not have a sentence in a particular language? Just write the sentence in english and let us do the magic.')

        demo = gr.TabbedInterface([it_1,it_2],['Speech Synthesis', 'Sentence Translation'])
        demo.launch()

demo_app = GRadioInterface(function=convert_text)
demo_app.start()