File size: 8,786 Bytes
1445f6b
 
 
 
 
 
 
 
 
 
 
 
 
 
0154429
1445f6b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
import gradio as gr

from PIL import Image
import os

import openai

#api_key = os.environ.get('api_key')

from share_btn import community_icon_html, loading_icon_html, share_js

token = os.environ.get('HF_TOKEN')
whisper = gr.Interface.load(name="spaces/sanchit-gandhi/whisper-large-v2")
tts = gr.Interface.load(name="spaces/Flux9665/IMS-Toucan")
talking_face = gr.Blocks.load(name="spaces/gradio-tests/one-shot-talking-face", api_key=token)

def infer(audio, openai_api_key):
    
    whisper_result = whisper(audio, None, "translate", fn_index=0)
    
    gpt_response = try_api(whisper_result, openai_api_key)
    
    audio_response = tts(gpt_response[0], "English Text", "English Accent", "English Speaker's Voice", fn_index=0)
    
    portrait_link = talking_face("wise_woman_portrait.png", audio_response, fn_index=0)
    
    return gr.Textbox.update(value=whisper_result, visible=True), portrait_link, gr.Textbox.update(value=gpt_response[1], visible=True), gr.Group.update(visible=True), gr.Button.update(visible=True)

def try_api(message, openai_api_key):

    try:
        response = call_api(message, openai_api_key)
        return response, "<span class='openai_clear'>no error</span>"
    except openai.error.Timeout as e:
        #Handle timeout error, e.g. retry or log
        print(f"OpenAI API request timed out: {e}")
        return "oups", f"<span class='openai_error'>OpenAI API request timed out: <br />{e}</span>"
    except openai.error.APIError as e:
        #Handle API error, e.g. retry or log
        print(f"OpenAI API returned an API Error: {e}")
        return "oups", f"<span class='openai_error'>OpenAI API returned an API Error: <br />{e}</span>"
    except openai.error.APIConnectionError as e:
        #Handle connection error, e.g. check network or log
        print(f"OpenAI API request failed to connect: {e}")
        return "oups", f"<span class='openai_error'>OpenAI API request failed to connect: <br />{e}</span>"
    except openai.error.InvalidRequestError as e:
        #Handle invalid request error, e.g. validate parameters or log
        print(f"OpenAI API request was invalid: {e}")
        return "oups", f"<span class='openai_error'>OpenAI API request was invalid: <br />{e}</span>"
    except openai.error.AuthenticationError as e:
        #Handle authentication error, e.g. check credentials or log
        print(f"OpenAI API request was not authorized: {e}")
        return "oups", f"<span class='openai_error'>OpenAI API request was not authorized: <br />{e}</span>"
    except openai.error.PermissionError as e:
        #Handle permission error, e.g. check scope or log
        print(f"OpenAI API request was not permitted: {e}")
        return "oups", f"<span class='openai_error'>OpenAI API request was not permitted: <br />{e}</span>"
    except openai.error.RateLimitError as e:
        #Handle rate limit error, e.g. wait or log
        print(f"OpenAI API request exceeded rate limit: {e}")
        return "oups", f"<span class='openai_error'>OpenAI API request exceeded rate limit: <br />{e}</span>"

def call_api(message, openai_api_key):
          
    print("starting open ai")
    augmented_prompt = message + prevent_code_gen
    openai.api_key = openai_api_key
    
    response = openai.Completion.create(
        model="text-davinci-003",
        prompt=augmented_prompt,
        temperature=0.5,
        max_tokens=2048,
        top_p=1,
        frequency_penalty=0,
        presence_penalty=0.6
    )

    print(response)

    #return str(response.choices[0].text).split("\n",2)[2]
    return str(response.choices[0].text)

def clean_components():
    return gr.Audio.update(value=None), gr.HTML.update(visible=False), gr.Textbox.update(visible=False), gr.Video.update(value=None), gr.Group.update(visible=False), gr.Button.update(visible=False)

title = """
    <div style="text-align: center; max-width: 500px; margin: 0 auto;">
        <div
        style="
            display: inline-flex;
            align-items: center;
            gap: 0.8rem;
            font-size: 1.75rem;
            margin-bottom: 10px;
        "
        >
        <h1 style="font-weight: 600; margin-bottom: 7px;">
            GPT Talking Portrait
        </h1>
        </div>
        <p style="margin-bottom: 10px;font-size: 94%;font-weight: 100;line-height: 1.5em;">
        Use Whisper to ask, alive portrait responds  !
        </p>
    </div>
"""

article = """
    <div class="footer">
        <p>
        Whisper & chatGPT by <a href="https://openai.com/" target="_blank">OpenAI</a> - 
        Follow πŸ€— <a href="https://twitter.com/fffiloni" target="_blank">Sylvain Filoni</a> for demo updates
        </p>
    </div>

    <div id="may-like-container" style="display: flex;justify-content: center;flex-direction: column;align-items: center;margin-bottom: 30px;">
        <p style="font-size: 0.8em;margin-bottom: 4px;">You may also like: </p>
        <div id="may-like" style="display:flex;flex-wrap: wrap;align-items:center; justify-content: center;height:20px;">
            <svg height="20" width="200" style="margin-left:4px;margin-bottom: 6px;">       
                 <a href="https://huggingface.co/spaces/camenduru/one-shot-talking-face" target="_blank">
                    <image href="https://img.shields.io/badge/πŸ€— Spaces-One Shot Talking Face-blue" src="https://img.shields.io/badge/πŸ€— Spaces-One Shot Talking Face-blue.png" height="20"/>
                 </a>
            </svg>
            <svg height="20" width="108" style="margin-left:4px;margin-bottom: 6px;">       
                 <a href="https://huggingface.co/spaces/Pie31415/rome" target="_blank">
                    <image href="https://img.shields.io/badge/πŸ€— Spaces-ROME-blue" src="https://img.shields.io/badge/πŸ€— Spaces-ROME-blue.png" height="20"/>
                 </a>
            </svg>
            <svg height="20" width="208" style="margin-left:4px;margin-bottom: 6px;">       
                 <a href="https://huggingface.co/spaces/CVPR/Image-Animation-using-Thin-Plate-Spline-Motion-Model" target="_blank">
                    <image href="https://img.shields.io/badge/πŸ€— Spaces-Thin_Plate_Spline_Motion-blue" src="https://img.shields.io/badge/πŸ€— Spaces-Thin_Plate_Spline_Motion-blue.png" height="20"/>
                 </a>
            </svg>
            <svg height="20" width="200" style="margin-left:4px;margin-bottom: 6px;">       
                 <a href="https://huggingface.co/spaces/vumichien/lip_movement_reading" target="_blank">
                    <image href="https://img.shields.io/badge/πŸ€— Spaces-Lip_Movement_Reading-blue" src="https://img.shields.io/badge/πŸ€— Spaces-Lip_Movement_Reading-blue.png" height="20"/>
                 </a>
            </svg>
        </div>
    </div>
"""

prevent_code_gen = """
If i am asking for code generation, do not provide me with code. Instead, give me a summury of good hints about how i could do what i asked, but shortly.
If i am not asking for code generation, do as usual.
"""
with gr.Blocks(css="style.css") as demo:
    
    with gr.Column(elem_id="col-container"):
        
        gr.HTML(title)
   
        gpt_response = gr.Video(label="Talking Portrait response", elem_id="video_out")
        whisper_tr = gr.Textbox(label="whisper english translation", elem_id="text_inp", visible=False)

        with gr.Row(elem_id="secondary-buttons"):
            clean_btn = gr.Button(value="Clean", elem_id="clean-btn", visible=False)
            with gr.Group(elem_id="share-btn-container", visible=False) as share_group:
                    community_icon = gr.HTML(community_icon_html)
                    loading_icon = gr.HTML(loading_icon_html)
                    share_button = gr.Button("Share to community", elem_id="share-btn")
        
        error_handler = gr.HTML(visible=False, show_label=False, elem_id="error_handler")
             
    with gr.Column(elem_id="col-container-2"):
        with gr.Column():
            with gr.Row():
                record_input = gr.Audio(source="microphone",type="filepath", label="Audio input", show_label=True, elem_id="record_btn")
                openai_api_key = gr.Textbox(max_lines=1, type="password", label="πŸ” Your OpenAI API Key", placeholder="sk-123abc...")
                        
        send_btn = gr.Button("Send my request !")

        gr.HTML(article)
    
    clean_btn.click(clean_components, scroll_to_output=True, inputs=[], outputs=[record_input, error_handler, whisper_tr, gpt_response, share_group, clean_btn])   
    send_btn.click(infer, inputs=[record_input, openai_api_key], outputs=[whisper_tr, gpt_response, error_handler, share_group, clean_btn])
    share_button.click(None, [], [], _js=share_js)

demo.queue(max_size=32, concurrency_count=20).launch(debug=True)