Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -106,14 +106,18 @@ def transcribe_and_chat(audio):
|
|
106 |
def create_demo():
|
107 |
with gr.Blocks(css="""
|
108 |
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;700&display=swap');
|
109 |
-
body { font-family: 'Poppins', sans-serif; margin: 0; padding: 0;
|
110 |
-
#
|
111 |
-
|
112 |
-
#audio-
|
113 |
-
#
|
114 |
-
#
|
115 |
-
button {
|
116 |
-
|
|
|
|
|
|
|
|
|
117 |
footer {display: none;}
|
118 |
@media (max-width: 768px) {
|
119 |
#audio-input, #chat-output, #audio-output { width: 100%; }
|
@@ -122,9 +126,8 @@ def create_demo():
|
|
122 |
""") as demo:
|
123 |
gr.Markdown(
|
124 |
"""
|
125 |
-
<div
|
126 |
-
<p style='text-align:center;
|
127 |
-
<p style='text-align:center; color:#8ecae6;'>Powered by advanced AI models for real-time interaction.</p>
|
128 |
""",
|
129 |
elem_id="header"
|
130 |
)
|
@@ -139,16 +142,13 @@ def create_demo():
|
|
139 |
chat_output = gr.Textbox(label="π¬ AI Response", elem_id="chat-output", lines=5, interactive=False)
|
140 |
audio_output = gr.Audio(label="π AI Voice Response", autoplay=True, elem_id="audio-output")
|
141 |
|
142 |
-
|
143 |
-
gr.Markdown("<hr style='border: 1px solid #8ecae6;'/>")
|
144 |
|
145 |
-
# Processing the audio input
|
146 |
def process_audio(audio, volume):
|
147 |
logging.info(f"Received audio: {audio}")
|
148 |
if audio is None:
|
149 |
return "No audio detected. Please try recording again.", None
|
150 |
response, audio_path = transcribe_and_chat(audio)
|
151 |
-
# Adjust volume for the response audio
|
152 |
adjusted_audio_path = asyncio.run(text_to_speech_stream(response, volume))
|
153 |
logging.info(f"Response: {response}, Audio path: {adjusted_audio_path}")
|
154 |
return response, adjusted_audio_path
|
@@ -160,21 +160,18 @@ def create_demo():
|
|
160 |
demo.load(None, js="""
|
161 |
function() {
|
162 |
var recordButton;
|
163 |
-
|
164 |
function findRecordButton() {
|
165 |
var buttons = document.querySelectorAll('button');
|
166 |
-
for (var i = 0;
|
167 |
if (buttons[i].textContent.includes('Record from microphone')) {
|
168 |
return buttons[i];
|
169 |
}
|
170 |
}
|
171 |
-
return null;
|
172 |
}
|
173 |
|
174 |
function startListening() {
|
175 |
-
|
176 |
-
recordButton = findRecordButton();
|
177 |
-
}
|
178 |
if (recordButton) {
|
179 |
recordButton.click();
|
180 |
}
|
@@ -202,7 +199,6 @@ def create_demo():
|
|
202 |
setTimeout(playAssistantAudio, 100);
|
203 |
});
|
204 |
|
205 |
-
// Prevent audio from stopping when switching tabs
|
206 |
document.addEventListener("visibilitychange", function() {
|
207 |
var audioElements = document.querySelectorAll('audio');
|
208 |
audioElements.forEach(function(audio) {
|
|
|
106 |
def create_demo():
|
107 |
with gr.Blocks(css="""
|
108 |
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;700&display=swap');
|
109 |
+
body { font-family: 'Poppins', sans-serif; margin: 0; padding: 0; background-color: #f0f4f8; color: #333; }
|
110 |
+
#header { font-size: 30px; font-weight: 700; color: #333; }
|
111 |
+
p { font-size: 18px; color: #666; }
|
112 |
+
#audio-input {border: 2px solid #9b51e0; padding: 10px; border-radius: 10px; background-color: #ffffff;}
|
113 |
+
#chat-output {background-color: #2f3640; color: #ffffff; font-size: 1.2em; border-radius: 10px; padding: 15px;}
|
114 |
+
#audio-output {border: 2px solid #9b51e0; padding: 10px; border-radius: 10px; background-color: #ffffff;}
|
115 |
+
#clear-button {background-color: #ff6b6b; color: white; border-radius: 5px;}
|
116 |
+
#voice-volume {background-color: #51a3ff;}
|
117 |
+
button {font-size: 16px; padding: 10px 20px; border-radius: 5px; cursor: pointer;}
|
118 |
+
button:hover { background-color: #ff6b6b; color: white;}
|
119 |
+
audio {border-radius: 10px; background-color: #9b51e0; padding: 10px;}
|
120 |
+
hr { border: 1px solid #9b51e0; margin-top: 20px; }
|
121 |
footer {display: none;}
|
122 |
@media (max-width: 768px) {
|
123 |
#audio-input, #chat-output, #audio-output { width: 100%; }
|
|
|
126 |
""") as demo:
|
127 |
gr.Markdown(
|
128 |
"""
|
129 |
+
<div id='header'>π£οΈ AI Voice Assistant</div>
|
130 |
+
<p style='text-align:center;'>Talk to your personal AI! Record your voice, and get a response in both text and audio.</p>
|
|
|
131 |
""",
|
132 |
elem_id="header"
|
133 |
)
|
|
|
142 |
chat_output = gr.Textbox(label="π¬ AI Response", elem_id="chat-output", lines=5, interactive=False)
|
143 |
audio_output = gr.Audio(label="π AI Voice Response", autoplay=True, elem_id="audio-output")
|
144 |
|
145 |
+
gr.Markdown("<hr />")
|
|
|
146 |
|
|
|
147 |
def process_audio(audio, volume):
|
148 |
logging.info(f"Received audio: {audio}")
|
149 |
if audio is None:
|
150 |
return "No audio detected. Please try recording again.", None
|
151 |
response, audio_path = transcribe_and_chat(audio)
|
|
|
152 |
adjusted_audio_path = asyncio.run(text_to_speech_stream(response, volume))
|
153 |
logging.info(f"Response: {response}, Audio path: {adjusted_audio_path}")
|
154 |
return response, adjusted_audio_path
|
|
|
160 |
demo.load(None, js="""
|
161 |
function() {
|
162 |
var recordButton;
|
163 |
+
|
164 |
function findRecordButton() {
|
165 |
var buttons = document.querySelectorAll('button');
|
166 |
+
for (var i = 0; buttons.length; i++) {
|
167 |
if (buttons[i].textContent.includes('Record from microphone')) {
|
168 |
return buttons[i];
|
169 |
}
|
170 |
}
|
|
|
171 |
}
|
172 |
|
173 |
function startListening() {
|
174 |
+
recordButton = findRecordButton();
|
|
|
|
|
175 |
if (recordButton) {
|
176 |
recordButton.click();
|
177 |
}
|
|
|
199 |
setTimeout(playAssistantAudio, 100);
|
200 |
});
|
201 |
|
|
|
202 |
document.addEventListener("visibilitychange", function() {
|
203 |
var audioElements = document.querySelectorAll('audio');
|
204 |
audioElements.forEach(function(audio) {
|