Spaces:
Sleeping
Sleeping
Pablo Sampaio
commited on
Commit
•
fd22ae3
1
Parent(s):
5e7c087
Nova versão, com diferentes personalidades e em português
Browse files- app.py +124 -23
- output-001.wav → output-001-echo.wav +0 -0
- output-001-nova.wav +0 -0
app.py
CHANGED
@@ -1,12 +1,34 @@
|
|
|
|
1 |
|
|
|
2 |
from openai import OpenAI
|
3 |
|
4 |
-
import gradio as gr
|
5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
|
7 |
AUDIO_OUTPUT_FILE = "output" # prefixo do nome do arquivo de áudio .wav
|
8 |
|
9 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
|
11 |
|
12 |
# Função para converter o histórico de chat para o formato esperado pela API do OpenAI
|
@@ -47,38 +69,117 @@ def respond(system_prompt, user_message, chat_history, temperature, voice="echo"
|
|
47 |
return "", chat_history, output_audio_file
|
48 |
|
49 |
|
50 |
-
def reset_and_apply(openai_key):
|
51 |
global OPENAI_CLIENT
|
52 |
OPENAI_CLIENT = OpenAI(api_key=openai_key)
|
53 |
-
return [("", "Olá, vamos falar de futebol?")], AUDIO_OUTPUT_FILE + "-001.wav"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
54 |
|
55 |
|
56 |
with gr.Blocks() as demo:
|
57 |
# aqui, é resetado e instanciado o cliente
|
58 |
-
initial_chat_history, initial_audio = reset_and_apply(
|
59 |
|
60 |
-
|
61 |
-
audio_out = gr.Audio(label="
|
62 |
-
|
|
|
|
|
|
|
|
|
|
|
63 |
|
64 |
-
|
65 |
-
system = gr.Textbox(label="System message", lines=3, value="Você é uma acompanhante de uma criança com idade entre 6 e 8 anos que adora futebol. \
|
66 |
-
Fale sobre times do Brasil, Inglaterra e Espanha e sobre seleções. Fale sobre craques do passado e grandes jogos. Fale sobre títulos de Copa do Mundo. Seja divertido e pró-ativo,\
|
67 |
-
tentando iniciar novos assuntos. Fale, no máximo, três frases por mensagem. E faça no máximo 1 pergunta por mensagem.")
|
68 |
-
openai_key = gr.Textbox(label="OPENAI API key", placeholder="Insert your API key here")
|
69 |
-
temperature = gr.Slider(label="temperature", minimum=0.0, maximum=1.0, value=0.5, step=0.1)
|
70 |
-
# opções de vozes, de uma lista predefinida
|
71 |
-
voice = gr.Dropdown(label="Voice", choices=["echo", "nova", "alloy", "fable", "onyx", "shimmer"], value="echo")
|
72 |
-
btnReset = gr.Button("Reset and apply")
|
73 |
-
btnReset.click(reset_and_apply, inputs=[openai_key], outputs=[chatbot, audio_out])
|
74 |
|
75 |
-
|
76 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
77 |
|
78 |
-
|
79 |
-
user_msg.submit( respond, inputs=[system, user_msg, chatbot, temperature, voice], outputs=[user_msg, chatbot, audio_out]) # Press enter to submit - same effect
|
80 |
|
|
|
|
|
|
|
|
|
81 |
|
82 |
-
demo.queue().launch()
|
83 |
|
|
|
84 |
|
|
|
1 |
+
import os
|
2 |
|
3 |
+
import gradio as gr
|
4 |
from openai import OpenAI
|
5 |
|
|
|
6 |
|
7 |
+
LOAD_SHARED_KEY = True
|
8 |
+
|
9 |
+
# Load OpenAI API key, if the file exists
|
10 |
+
if LOAD_SHARED_KEY and os.path.exists('KEY_OPENAI'):
|
11 |
+
with open('KEY_OPENAI', 'r') as file:
|
12 |
+
os.environ['OPENAI_API_KEY'] = file.read().replace('\n', '')
|
13 |
+
else:
|
14 |
+
LOAD_SHARED_KEY = False
|
15 |
|
16 |
AUDIO_OUTPUT_FILE = "output" # prefixo do nome do arquivo de áudio .wav
|
17 |
|
18 |
+
TEMPLATE_SYSTEM_MESSAGE = """Sua função é entreter uma criança com idade entre 6 e 8 anos que adora futebol. Diretrizes para a conversa:
|
19 |
+
- Seu nome é {NAME}
|
20 |
+
- Pergunte o nome da criança.
|
21 |
+
- Fale sobre futebol, times, jogadores, seleções e grandes jogos.
|
22 |
+
- Em especial, foque no futebol do Brasil, Inglaterra e Espanha.
|
23 |
+
- {PERSONALITY}
|
24 |
+
- Fale, no máximo, três frases por mensagem.
|
25 |
+
"""
|
26 |
+
|
27 |
+
# Mapeia a personalidade no template e na temperatura
|
28 |
+
PERSONALITIES = {
|
29 |
+
"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),
|
30 |
+
"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)
|
31 |
+
}
|
32 |
|
33 |
|
34 |
# Função para converter o histórico de chat para o formato esperado pela API do OpenAI
|
|
|
69 |
return "", chat_history, output_audio_file
|
70 |
|
71 |
|
72 |
+
def reset_and_apply(openai_key, voice):
|
73 |
global OPENAI_CLIENT
|
74 |
OPENAI_CLIENT = OpenAI(api_key=openai_key)
|
75 |
+
return [("", "Olá, vamos falar de futebol?")], AUDIO_OUTPUT_FILE + f"-001-{voice}.wav"
|
76 |
+
|
77 |
+
def reset_openai_client(openai_key):
|
78 |
+
global OPENAI_CLIENT
|
79 |
+
OPENAI_CLIENT = OpenAI(api_key=openai_key)
|
80 |
+
|
81 |
+
def on_voice_change(voice):
|
82 |
+
persona_description, persona_temperature = PERSONALITIES[voice]
|
83 |
+
return TEMPLATE_SYSTEM_MESSAGE.format(NAME=voice.upper(), PERSONALITY=persona_description), persona_temperature
|
84 |
+
|
85 |
+
|
86 |
+
USE_ASR_PIPELINE = False
|
87 |
+
|
88 |
+
# With Pipeline (downloaded model)
|
89 |
+
if USE_ASR_PIPELINE:
|
90 |
+
from transformers import pipeline
|
91 |
+
import numpy as np
|
92 |
+
|
93 |
+
global ASR_PIPELINE
|
94 |
+
ASR_PIPELINE = pipeline(task="automatic-speech-recognition",
|
95 |
+
model="distil-whisper/distil-small.en")
|
96 |
+
|
97 |
+
else:
|
98 |
+
import requests
|
99 |
+
with open('KEY_HF', 'r') as file:
|
100 |
+
HF_KEY = file.read().replace('\n', '')
|
101 |
+
|
102 |
+
global ASR_API_URL, ASR_API_HEADERS
|
103 |
+
|
104 |
+
# Serverless API endpoint for OpenAI's Whisper model
|
105 |
+
ASR_API_URL = "https://api-inference.huggingface.co/models/openai/whisper-large-v3"
|
106 |
+
ASR_API_HEADERS = {"Authorization": f"Bearer {HF_KEY}"}
|
107 |
+
|
108 |
+
|
109 |
+
def transcribe(audio_in):
|
110 |
+
if USE_ASR_PIPELINE:
|
111 |
+
# sampling rate and audio data
|
112 |
+
sr, y = audio_in
|
113 |
+
y2 = y.astype(np.float32)
|
114 |
+
y2 /= np.max(np.abs(y))
|
115 |
+
response = ASR_PIPELINE({"sampling_rate": sr, "raw": y})
|
116 |
+
else:
|
117 |
+
# Option2: serverless API
|
118 |
+
with open(audio_in, "rb") as f:
|
119 |
+
data = f.read()
|
120 |
+
response = requests.post(ASR_API_URL, headers=ASR_API_HEADERS, data=data)
|
121 |
+
response = response.json()
|
122 |
+
|
123 |
+
#print(response)
|
124 |
+
return response['text']
|
125 |
+
|
126 |
+
|
127 |
+
def transcribe_and_respond(audio_in, system_txtbox, user_msg_txb, *args):
|
128 |
+
user_message = transcribe(audio_in)
|
129 |
+
outputs = respond(system_txtbox, user_message, *args)
|
130 |
+
return outputs
|
131 |
+
#return *outputs, audio_in
|
132 |
+
|
133 |
+
|
134 |
+
OPENAI_CLIENT = None
|
135 |
+
INITIAL_VOICE = "nova"
|
136 |
|
137 |
|
138 |
with gr.Blocks() as demo:
|
139 |
# aqui, é resetado e instanciado o cliente
|
140 |
+
initial_chat_history, initial_audio = reset_and_apply(os.environ['OPENAI_API_KEY'], INITIAL_VOICE)
|
141 |
|
142 |
+
chatbot_area = gr.Chatbot(value=initial_chat_history)
|
143 |
+
audio_out = gr.Audio(label="Escute a última mensagem", value=initial_audio, autoplay=True, interactive=False)
|
144 |
+
|
145 |
+
user_msg_txb = gr.Textbox(label="Mensagem")
|
146 |
+
#if USE_ASR_PIPELINE:
|
147 |
+
# audio_in = gr.Audio(label="Mensagem de Áudio", sources=['microphone'], interactive=True, type='numpy')
|
148 |
+
#else:
|
149 |
+
# audio_in = gr.Audio(label="Mensagem de Áudio", sources=['microphone'], interactive=True, type='filepath')
|
150 |
|
151 |
+
submit_btn = gr.Button("Enviar")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
152 |
|
153 |
+
#clear_btn = gr.ClearButton(components=[user_msg, chatbot], value="Clear console")
|
154 |
+
reset_btn = gr.Button("Reiniciar")
|
155 |
+
|
156 |
+
with gr.Accordion(label="Configurações",open=False):
|
157 |
+
if LOAD_SHARED_KEY:
|
158 |
+
openai_key = gr.Textbox(label="OPENAI API Key", value=os.environ['OPENAI_API_KEY'])
|
159 |
+
else:
|
160 |
+
openai_key = gr.Textbox(label="OPENAI API Key", placeholder="Insert your API key here")
|
161 |
+
openai_key.change(reset_openai_client, inputs=[openai_key])
|
162 |
+
|
163 |
+
# opções de vozes e personalidades
|
164 |
+
voice_ddown = gr.Dropdown(label="Personalidade (muda os dois abaixo)", choices=["nova", "echo"], value=INITIAL_VOICE)
|
165 |
+
|
166 |
+
initial_system_message, initial_temperature = on_voice_change(INITIAL_VOICE)
|
167 |
+
temperature_sldr = gr.Slider(label="Diversidade de respostas", minimum=0.0, maximum=1.0, value=initial_temperature, step=0.1)
|
168 |
+
|
169 |
+
with gr.Accordion(label="Avançado",open=False):
|
170 |
+
# o valor inicial é dado pela system message com o nome e personalidade dados pelos controles acima
|
171 |
+
system_txtbox = gr.Textbox(label="System message", lines=3, value=initial_system_message)
|
172 |
+
|
173 |
+
voice_ddown.change(on_voice_change, inputs=[voice_ddown], outputs=[system_txtbox, temperature_sldr])
|
174 |
+
#gr.Markdown("*Clique em 'Reiniciar' para aplicar as (a maior parte das) configurações.*")
|
175 |
|
176 |
+
reset_btn.click(reset_and_apply, inputs=[openai_key, voice_ddown], outputs=[chatbot_area, audio_out])
|
|
|
177 |
|
178 |
+
#audio_in.stop_recording( transcribe, inputs=[audio_in], outputs=[user_msg_txb] )
|
179 |
+
#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] )
|
180 |
+
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
|
181 |
+
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
|
182 |
|
|
|
183 |
|
184 |
+
demo.queue().launch(share=False)
|
185 |
|
output-001.wav → output-001-echo.wav
RENAMED
File without changes
|
output-001-nova.wav
ADDED
Binary file (34.6 kB). View file
|
|