File size: 5,494 Bytes
3796a5e
c43093e
 
 
3796a5e
ff1d740
4094da1
ff1d740
91e84de
ff1d740
 
057830c
c43093e
 
3796a5e
 
c43093e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85df983
c43093e
 
 
 
 
 
0ed9063
c43093e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30e5c47
c43093e
 
 
 
c5f762e
c43093e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c5f762e
 
 
 
 
 
c43093e
 
 
 
 
 
 
 
 
 
 
c5f762e
 
 
 
 
c43093e
 
 
 
 
 
 
49e1c3f
c52bc49
62f3a65
49e1c3f
59716dc
3796a5e
c43093e
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
import gradio as gr
import os 
import json 
import requests

whisper = gr.Interface.load(name="spaces/sanchit-gandhi/whisper-large-v2")

#input_message.submit([input_message, history], [input_message, chatbot, history])
def translate_or_transcribe(audio, task):
    text_result = whisper(audio, None, task, fn_index=0)
    return text_result
    
#Streaming endpoint
API_URL = "https://api.openai.com/v1/chat/completions" #os.getenv("API_URL") + "/generate_stream"


def predict(inputs, top_p, temperature, openai_api_key, history=[]):  

    payload = {
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": f"{inputs}"}],
    "temperature" : 1.0,
    "top_p":1.0,
    "n" : 1,
    "stream": True,
    "presence_penalty":0,
    "frequency_penalty":0,
    }

    headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {openai_api_key}"
    }

    
    history.append(inputs)
    # make a POST request to the API endpoint using the requests.post method, passing in stream=True
    response = requests.post(API_URL, headers=headers, json=payload, stream=True)
    #response = requests.post(API_URL, headers=headers, json=payload, stream=True)
    token_counter = 0 
    partial_words = "" 

    counter=0
    for chunk in response.iter_lines():
        if counter == 0:
          counter+=1
          continue
        counter+=1
        # check whether each line is non-empty
        if chunk :
          # decode each line as response data is in bytes
          if len(json.loads(chunk.decode()[6:])['choices'][0]["delta"]) == 0:
            break
          #print(json.loads(chunk.decode()[6:])['choices'][0]["delta"]["content"])
          partial_words = partial_words + json.loads(chunk.decode()[6:])['choices'][0]["delta"]["content"]
          if token_counter == 0:
            history.append(" " + partial_words)
          else:
            history[-1] = partial_words
          chat = [(history[i], history[i + 1]) for i in range(0, len(history) - 1, 2) ]  # convert to tuples of list
          token_counter+=1
          yield chat, history # resembles {chatbot: chat, state: history}  
        

def reset_textbox():
    return gr.update(value='')

title = """<h1 align="center">🔥ChatGPT API 🚀Streaming🚀 with Whisper</h1>"""
description = """Language models can be conditioned to act like dialogue agents through a conversational prompt that typically takes the form:
```
User: <utterance>
Assistant: <utterance>
User: <utterance>
Assistant: <utterance>
...
```
In this app, you can explore the outputs of a 20B large language model.
"""
#<a href="https://huggingface.co/spaces/ysharma/ChatGPTwithAPI?duplicate=true"><img src="https://bit.ly/3gLdBN6" alt="Duplicate Space"></a>Duplicate Space with GPU Upgrade for fast Inference & no queue<br> 
                
with gr.Blocks(css = """#col_container {width: 700px; margin-left: auto; margin-right: auto;}
                #chatbot {height: 400px; overflow: auto;}""") as demo:
    gr.HTML(title)
    gr.HTML()
    gr.HTML('''<center><a href="https://huggingface.co/spaces/ysharma/ChatGPTwithAPI?duplicate=true"><img src="https://bit.ly/3gLdBN6" alt="Duplicate Space"></a>Duplicate the Space and run securely with your OpenAI API Key</center>''')
    with gr.Column(elem_id = "col_container"):
        openai_api_key = gr.Textbox(type='password', label="Enter your OpenAI API key here")
        chatbot = gr.Chatbot(elem_id='chatbot') #c

        prompt_input_audio = gr.Audio(source="microphone",type="filepath",label="Record Audio Input"
                                    )
        translate_btn = gr.Button("Check Whisper first ? 👍")
            
        whisper_task = gr.Radio(["translate", "transcribe"], value="translate", show_label=False)
        inputs = gr.Textbox(placeholder= "Hi there!", label= "Type an input and press Enter") #t
        state = gr.State([]) #s
        b1 = gr.Button()
    
        #inputs, top_p, temperature, top_k, repetition_penalty
        with gr.Accordion("Parameters", open=False):
            top_p = gr.Slider( minimum=-0, maximum=1.0, value=0.95, step=0.05, interactive=True, label="Top-p (nucleus sampling)",)
            temperature = gr.Slider( minimum=-0, maximum=5.0, value=0.5, step=0.1, interactive=True, label="Temperature",)
            #top_k = gr.Slider( minimum=1, maximum=50, value=4, step=1, interactive=True, label="Top-k",)
            #repetition_penalty = gr.Slider( minimum=0.1, maximum=3.0, value=1.03, step=0.01, interactive=True, label="Repetition Penalty", )
    
    translate_btn.click(fn=translate_or_transcribe, 
                         inputs=[prompt_input_audio,whisper_task], 
                         outputs=inputs
                        )
                    
    inputs.submit( predict, [inputs, top_p, temperature, openai_api_key, state], [chatbot, state],)
    b1.click( predict, [inputs, top_p, temperature, openai_api_key, state], [chatbot, state],)
    b1.click(reset_textbox, [], [inputs])
    inputs.submit(reset_textbox, [], [inputs])
                    
    #gr.Markdown(description)
                    
    gr.HTML('''
         <p>Note: Please be aware that audio records from iOS devices will not be decoded as expected by Gradio. For the best experience, record your voice from a computer instead of your smartphone ;)</p>

        ''')
    gr.Markdown("![visitor badge](https://visitor-badge.glitch.me/badge?page_id=RamAnanth1.chatGPT_voice)")

    demo.queue().launch(debug=True)