Pablo Sampaio commited on
Commit
fd22ae3
1 Parent(s): 5e7c087

Nova versão, com diferentes personalidades e em português

Browse files
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
- OPENAI_CLIENT = None
 
 
 
 
 
 
 
 
 
 
 
 
 
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("no-key")
59
 
60
- chatbot = gr.Chatbot(value=initial_chat_history)
61
- audio_out = gr.Audio(label="Listen to the response", value=initial_audio, autoplay=True, interactive=False)
62
- user_msg = gr.Textbox(label="Prompt")
 
 
 
 
 
63
 
64
- with gr.Accordion(label="Advanced options",open=False):
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
- submit_btn = gr.Button("Submit")
76
- clear_btn = gr.ClearButton(components=[user_msg, chatbot], value="Clear console")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
 
78
- submit_btn.click(respond, inputs=[system, user_msg, chatbot, temperature, voice], outputs=[user_msg, chatbot, audio_out]) # Click on the button
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