Spaces:
Running
Running
Pablo Sampaio
commited on
Commit
•
8ca0441
1
Parent(s):
ce12d21
Using Google API
Browse files
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 |
-
|
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 = """
|
22 |
-
-
|
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": ("
|
33 |
-
"echo": ("
|
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'
|
45 |
-
prompt.append( {'role': 'assistant', 'content'
|
46 |
-
prompt.append( {'role': 'user', 'content'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
return prompt
|
48 |
|
49 |
|
50 |
def respond(system_prompt, user_message, chat_history, temperature, voice="echo"):
|
51 |
-
|
|
|
52 |
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
|
58 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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(
|
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 |
-
|
|
|
|
|
85 |
|
86 |
-
def
|
87 |
-
|
88 |
-
|
|
|
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 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
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(
|
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 |
-
|
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=
|
168 |
|
169 |
-
initial_system_message, initial_temperature = on_voice_change(
|
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(
|
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 |
|