Pablo Sampaio commited on
Commit
8ca0441
1 Parent(s): ce12d21

Using Google API

Browse files
Files changed (1) hide show
  1. app.py +99 -51
app.py CHANGED
@@ -2,37 +2,63 @@ import os
2
 
3
  import gradio as gr
4
  from openai import OpenAI
 
5
 
6
 
7
  LOAD_KEYS_FROM_FILES = False
 
 
8
 
9
  if LOAD_KEYS_FROM_FILES:
10
  # Load OpenAI API key
11
  with open('KEY_OPENAI', 'r') as file:
12
- os.environ['OPENAI_API_KEY'] = file.read().replace('\n', '')
13
 
14
  # Hugging Face API key, used for the serverless access to ASR model
15
  with open('KEY_HF', 'r') as file:
16
  os.environ['HUGGINGFACE_API_KEY'] = file.read().replace('\n', '')
17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
  AUDIO_OUT_FILE_PREFIX = "output" # prefixo do nome do arquivo de áudio .wav
20
 
21
- TEMPLATE_SYSTEM_MESSAGE = """Sua função é entreter uma criança com idade entre 6 e 8 anos que adora futebol. Diretrizes para a conversa:
22
- - Seu nome é {NAME}
23
  - Pergunte o nome da criança.
24
  - Fale sobre futebol, times, jogadores, seleções e grandes jogos.
25
  - Em especial, foque no futebol do Brasil, Inglaterra e Espanha.
26
  - {PERSONALITY}
27
- - Fale, no máximo, três frases por mensagem.
28
  """
29
 
30
  # Mapeia a personalidade no template e na temperatura
31
  PERSONALITIES = {
32
- "nova": ("Seja amigável e alegre, como uma criança. Tente iniciar novos assuntos, quando a conversa estiver repetitiva. Conte piadas de futebol, de vez em quando.", 0.8),
33
- "echo": ("Seja amigável e objetivo. Tente manter-se no mesmo assunto. Conte alguma curiosidade sobre um grande craque, de vez em quando.", 0.2)
34
  }
35
 
 
 
36
 
37
  # Função para converter o histórico de chat para o formato esperado pela API do OpenAI
38
  def to_openai_chat_history(system_prompt, curr_message, chat_history):
@@ -41,21 +67,46 @@ def to_openai_chat_history(system_prompt, curr_message, chat_history):
41
  chat_history = chat_history[0:3] + chat_history[-5:]
42
  for turn in chat_history:
43
  user_message, bot_message = turn
44
- prompt.append( {'role': 'user', 'content' : user_message} )
45
- prompt.append( {'role': 'assistant', 'content' : bot_message} )
46
- prompt.append( {'role': 'user', 'content' : curr_message } )
 
 
 
 
 
 
 
 
 
 
 
 
47
  return prompt
48
 
49
 
50
  def respond(system_prompt, user_message, chat_history, temperature, voice="echo"):
51
- openai_history = to_openai_chat_history(system_prompt, user_message, chat_history)
 
52
 
53
- bot_response = OPENAI_CLIENT.chat.completions.create(
54
- messages=openai_history,
55
- temperature=temperature,
56
- model="gpt-3.5-turbo")
57
 
58
- assistant_msg = bot_response.choices[0].message.content
 
 
 
 
 
 
 
 
 
 
 
 
59
 
60
  # salva o audio
61
  response = OPENAI_CLIENT.audio.speech.create(
@@ -74,21 +125,25 @@ def respond(system_prompt, user_message, chat_history, temperature, voice="echo"
74
  return "", chat_history, output_audio_file
75
 
76
 
77
- def reset_and_apply(openai_key, voice):
78
- global OPENAI_CLIENT
79
- OPENAI_CLIENT = OpenAI(api_key=openai_key)
80
  return [("", "Olá, vamos falar de futebol?")], AUDIO_OUT_FILE_PREFIX + f"-001-{voice}.wav"
81
 
82
  def reset_openai_client(openai_key):
83
- global OPENAI_CLIENT
84
- OPENAI_CLIENT = OpenAI(api_key=openai_key)
 
 
85
 
86
- def on_voice_change(voice):
87
- persona_description, persona_temperature = PERSONALITIES[voice]
88
- return TEMPLATE_SYSTEM_MESSAGE.format(NAME=voice.upper(), PERSONALITY=persona_description), persona_temperature
 
89
 
 
 
 
 
90
 
91
- USE_LOCAL_ASR_PIPELINE = True
92
 
93
  # With pipeline (downloaded model)
94
  if USE_LOCAL_ASR_PIPELINE:
@@ -111,19 +166,17 @@ else:
111
 
112
 
113
  def transcribe(audio_in):
114
- if USE_LOCAL_ASR_PIPELINE:
115
- # sampling rate and audio data
116
- #sr, y = audio_in
117
- #y2 = y.astype(np.float32)
118
- #y2 /= np.max(np.abs(y))
119
- #response = ASR_PIPELINE({"sampling_rate": sr, "raw": y})
120
- response = ASR_PIPELINE(audio_in)
121
- else:
122
- # Option2: serverless API
123
- with open(audio_in, "rb") as f:
124
- data = f.read()
125
- response = requests.post(ASR_API_URL, headers=ASR_API_HEADERS, data=data)
126
- response = response.json()
127
 
128
  #print(response)
129
  return response['text']
@@ -135,21 +188,17 @@ def transcribe_and_respond(audio_in, system_txtbox, user_msg_txb, *args):
135
  return outputs
136
 
137
 
138
- OPENAI_CLIENT = None
139
- INITIAL_VOICE = "nova"
140
-
141
 
142
  with gr.Blocks() as demo:
143
  # aqui, é resetado e instanciado o cliente
144
- initial_chat_history, initial_audio = reset_and_apply(os.environ['OPENAI_API_KEY'], INITIAL_VOICE)
145
 
146
  chatbot_area = gr.Chatbot(value=initial_chat_history)
147
  audio_out = gr.Audio(label="Escute a última mensagem", value=initial_audio, autoplay=True, interactive=False)
148
 
149
  user_msg_txb = gr.Textbox(label="Mensagem")
150
 
151
- #audio_in = gr.Audio(label="Mensagem de Áudio", sources=['microphone'], interactive=True, type='numpy')
152
- audio_in = gr.Audio(label="Mensagem de Áudio", sources=['microphone'], interactive=True, type='filepath')
153
 
154
  submit_btn = gr.Button("Enviar")
155
 
@@ -157,16 +206,16 @@ with gr.Blocks() as demo:
157
  reset_btn = gr.Button("Reiniciar")
158
 
159
  with gr.Accordion(label="Configurações",open=False):
160
- if LOAD_KEYS_FROM_FILES:
161
- openai_key = gr.Textbox(label="OPENAI API Key", value=os.environ['OPENAI_API_KEY'])
162
- else:
163
- openai_key = gr.Textbox(label="OPENAI API Key", placeholder="Insert your API key here")
164
  openai_key.change(reset_openai_client, inputs=[openai_key])
165
 
 
 
 
166
  # opções de vozes e personalidades
167
- voice_ddown = gr.Dropdown(label="Personalidade (muda os dois abaixo)", choices=["nova", "echo"], value=INITIAL_VOICE)
168
 
169
- initial_system_message, initial_temperature = on_voice_change(INITIAL_VOICE)
170
  temperature_sldr = gr.Slider(label="Diversidade de respostas", minimum=0.0, maximum=1.0, value=initial_temperature, step=0.1)
171
 
172
  with gr.Accordion(label="Avançado",open=False):
@@ -178,8 +227,7 @@ with gr.Blocks() as demo:
178
 
179
  reset_btn.click(reset_and_apply, inputs=[openai_key, voice_ddown], outputs=[chatbot_area, audio_out])
180
 
181
- #audio_in.stop_recording( transcribe, inputs=[audio_in], outputs=[user_msg_txb] )
182
- audio_in.stop_recording( transcribe_and_respond, inputs=[audio_in, system_txtbox, user_msg_txb, chatbot_area, temperature_sldr, voice_ddown], outputs=[user_msg_txb, chatbot_area, audio_out] )
183
  submit_btn.click(respond, inputs=[system_txtbox, user_msg_txb, chatbot_area, temperature_sldr, voice_ddown], outputs=[user_msg_txb, chatbot_area, audio_out]) # Click on the button
184
  user_msg_txb.submit(respond, inputs=[system_txtbox, user_msg_txb, chatbot_area, temperature_sldr, voice_ddown], outputs=[user_msg_txb, chatbot_area, audio_out]) # Press enter to submit - same effect
185
 
 
2
 
3
  import gradio as gr
4
  from openai import OpenAI
5
+ import google.generativeai as genai
6
 
7
 
8
  LOAD_KEYS_FROM_FILES = False
9
+ USE_LOCAL_ASR_PIPELINE = True
10
+
11
 
12
  if LOAD_KEYS_FROM_FILES:
13
  # Load OpenAI API key
14
  with open('KEY_OPENAI', 'r') as file:
15
+ OPENAI_API_KEY = file.read().replace('\n', '')
16
 
17
  # Hugging Face API key, used for the serverless access to ASR model
18
  with open('KEY_HF', 'r') as file:
19
  os.environ['HUGGINGFACE_API_KEY'] = file.read().replace('\n', '')
20
 
21
+ # Google AI API key, to acces Gemini model
22
+ with open('KEY_GOOGLE_AI', 'r') as file:
23
+ GOOGLE_API_KEY = file.read().replace('\n', '')
24
+ else:
25
+ # testar se existe a variável OPENAI_API_KEY
26
+ OPENAI_API_KEY = "" if 'OPENAI_API_KEY' not in os.environ else os.environ['OPENAI_API_KEY']
27
+ GOOGLE_API_KEY = "" if 'GOOGLE_API_KEY' not in os.environ else os.environ['GOOGLE_API_KEY']
28
+ assert 'HUUGINGFACE_API_KEY' in os.environ, "Hugging Face API key not found in environment variables"
29
+
30
+
31
+ USE_OPENAI_LLM = (GOOGLE_API_KEY == "")
32
+
33
+ OPENAI_CLIENT = None
34
+ if USE_OPENAI_LLM:
35
+ OPENAI_CLIENT = OpenAI(api_key=OPENAI_API_KEY)
36
+ else:
37
+ genai.configure(api_key=GOOGLE_API_KEY)
38
+
39
+ GOOGLE_GEN_CONFIG = genai.types.GenerationConfig(
40
+ candidate_count=1,
41
+ temperature=0.5)
42
 
43
  AUDIO_OUT_FILE_PREFIX = "output" # prefixo do nome do arquivo de áudio .wav
44
 
45
+ TEMPLATE_SYSTEM_MESSAGE = """Você é assistente virtual com a função é entreter uma criança de idade entre 6 e 8 anos que adora futebol. Diretrizes para a conversa:
46
+ - Você é {GENRE}, seu nome é {NAME}.
47
  - Pergunte o nome da criança.
48
  - Fale sobre futebol, times, jogadores, seleções e grandes jogos.
49
  - Em especial, foque no futebol do Brasil, Inglaterra e Espanha.
50
  - {PERSONALITY}
51
+ - Fale, no máximo, três frases por mensagem.
52
  """
53
 
54
  # Mapeia a personalidade no template e na temperatura
55
  PERSONALITIES = {
56
+ "nova": ("Sua personalidade é bastante amigável e alegre, como uma criança. Tente iniciar novos assuntos, quando a conversa estiver repetitiva. Conte piadas de futebol, de vez em quando.", 0.5, "F"),
57
+ "echo": ("Sua personalidade é amigável, mas objetivo. Tente manter-se no mesmo assunto. Conte alguma curiosidade sobre um grande craque, de vez em quando.", 0.2, "M")
58
  }
59
 
60
+ INITIAL_PERSON = "nova"
61
+
62
 
63
  # Função para converter o histórico de chat para o formato esperado pela API do OpenAI
64
  def to_openai_chat_history(system_prompt, curr_message, chat_history):
 
67
  chat_history = chat_history[0:3] + chat_history[-5:]
68
  for turn in chat_history:
69
  user_message, bot_message = turn
70
+ prompt.append( {'role': 'user', 'content': user_message} )
71
+ prompt.append( {'role': 'assistant', 'content': bot_message} )
72
+ prompt.append( {'role': 'user', 'content': curr_message } )
73
+ return prompt
74
+
75
+
76
+ # Função para converter o histórico de chat para o formato esperado pela API do Google AI
77
+ def to_google_history(curr_message, chat_history):
78
+ prompt = []
79
+ for turn in chat_history:
80
+ user_message, bot_message = turn
81
+ prompt.append( {'role':'user', 'parts': [user_message]} )
82
+ prompt.append( {'role': 'model', 'parts': [bot_message]} )
83
+ prompt.append( {'role': 'user', 'parts': [curr_message]} )
84
+
85
  return prompt
86
 
87
 
88
  def respond(system_prompt, user_message, chat_history, temperature, voice="echo"):
89
+ if USE_OPENAI_LLM:
90
+ openai_history = to_openai_chat_history(system_prompt, user_message, chat_history)
91
 
92
+ bot_response = OPENAI_CLIENT.chat.completions.create(
93
+ messages=openai_history,
94
+ temperature=temperature,
95
+ model="gpt-3.5-turbo")
96
 
97
+ assistant_msg = bot_response.choices[0].message.content
98
+
99
+ else:
100
+ GOOGLE_GEN_CONFIG.temperature = temperature
101
+ model = genai.GenerativeModel('gemini-1.5-pro-latest',
102
+ system_instruction=system_prompt,
103
+ generation_config=GOOGLE_GEN_CONFIG)
104
+
105
+ google_history = to_google_history(user_message, chat_history)
106
+
107
+ bot_response = model.generate_content(google_history, generation_config=GOOGLE_GEN_CONFIG)
108
+
109
+ assistant_msg = bot_response.text
110
 
111
  # salva o audio
112
  response = OPENAI_CLIENT.audio.speech.create(
 
125
  return "", chat_history, output_audio_file
126
 
127
 
128
+ def reset_and_apply(voice):
 
 
129
  return [("", "Olá, vamos falar de futebol?")], AUDIO_OUT_FILE_PREFIX + f"-001-{voice}.wav"
130
 
131
  def reset_openai_client(openai_key):
132
+ global USE_OPENAI_LLM, OPENAI_CLIENT, OPENAI_API_KEY, GOOGLE_API_KEY
133
+ USE_OPENAI_LLM = (GOOGLE_API_KEY != "")
134
+ OPENAI_API_KEY = openai_key
135
+ OPENAI_CLIENT = OpenAI(api_key=OPENAI_API_KEY)
136
 
137
+ def reset_google_client(google_key):
138
+ global GOOGLE_API_KEY, USE_OPENAI_LLM
139
+ GOOGLE_API_KEY = google_key
140
+ USE_OPENAI_LLM = (google_key != "")
141
 
142
+ def on_voice_change(voice):
143
+ persona_description, persona_temperature, sex = PERSONALITIES[voice]
144
+ genre = "menina" if sex=="F" else "menino"
145
+ return TEMPLATE_SYSTEM_MESSAGE.format(NAME=voice.upper(), PERSONALITY=persona_description, GENRE=genre), persona_temperature
146
 
 
147
 
148
  # With pipeline (downloaded model)
149
  if USE_LOCAL_ASR_PIPELINE:
 
166
 
167
 
168
  def transcribe(audio_in):
169
+ # from numpy data:
170
+ #sr, y = audio_in # sampling rate and audio data
171
+ #y2 = y.astype(np.float32)
172
+ #y2 /= np.max(np.abs(y))
173
+ #response = ASR_PIPELINE({"sampling_rate": sr, "raw": y})
174
+
175
+ # using serverless API
176
+ with open(audio_in, "rb") as f:
177
+ data = f.read()
178
+ response = requests.post(ASR_API_URL, headers=ASR_API_HEADERS, data=data)
179
+ response = response.json()
 
 
180
 
181
  #print(response)
182
  return response['text']
 
188
  return outputs
189
 
190
 
 
 
 
191
 
192
  with gr.Blocks() as demo:
193
  # aqui, é resetado e instanciado o cliente
194
+ initial_chat_history, initial_audio = reset_and_apply(INITIAL_PERSON)
195
 
196
  chatbot_area = gr.Chatbot(value=initial_chat_history)
197
  audio_out = gr.Audio(label="Escute a última mensagem", value=initial_audio, autoplay=True, interactive=False)
198
 
199
  user_msg_txb = gr.Textbox(label="Mensagem")
200
 
201
+ #audio_in = gr.Audio(label="Mensagem de Áudio", sources=['microphone'], interactive=True, type='filepath') # TODO: tentar type='numpy'
 
202
 
203
  submit_btn = gr.Button("Enviar")
204
 
 
206
  reset_btn = gr.Button("Reiniciar")
207
 
208
  with gr.Accordion(label="Configurações",open=False):
209
+ openai_key = gr.Textbox(label="OpenAI API Key (GPT 3.5)", value="", placeholder="Insira a chave aqui")
 
 
 
210
  openai_key.change(reset_openai_client, inputs=[openai_key])
211
 
212
+ openai_key = gr.Textbox(label="Google API Key (Gemini 1.5)", value="", placeholder="Insira a chave aqui")
213
+ openai_key.change(reset_google_client, inputs=[openai_key])
214
+
215
  # opções de vozes e personalidades
216
+ voice_ddown = gr.Dropdown(label="Personalidade (muda os dois abaixo)", choices=["nova", "echo"], value=INITIAL_PERSON)
217
 
218
+ initial_system_message, initial_temperature = on_voice_change(INITIAL_PERSON)
219
  temperature_sldr = gr.Slider(label="Diversidade de respostas", minimum=0.0, maximum=1.0, value=initial_temperature, step=0.1)
220
 
221
  with gr.Accordion(label="Avançado",open=False):
 
227
 
228
  reset_btn.click(reset_and_apply, inputs=[openai_key, voice_ddown], outputs=[chatbot_area, audio_out])
229
 
230
+ #audio_in.stop_recording( transcribe_and_respond, inputs=[audio_in, system_txtbox, user_msg_txb, chatbot_area, temperature_sldr, voice_ddown], outputs=[user_msg_txb, chatbot_area, audio_out] )
 
231
  submit_btn.click(respond, inputs=[system_txtbox, user_msg_txb, chatbot_area, temperature_sldr, voice_ddown], outputs=[user_msg_txb, chatbot_area, audio_out]) # Click on the button
232
  user_msg_txb.submit(respond, inputs=[system_txtbox, user_msg_txb, chatbot_area, temperature_sldr, voice_ddown], outputs=[user_msg_txb, chatbot_area, audio_out]) # Press enter to submit - same effect
233