Spaces:
Paused
Paused
Commit Β·
3b13a44
1
Parent(s): 1769a75
fix: auto-submit Q&A - stop_recording + change + JS fallback click
Browse files- .stop_recording calls handle_question_submit directly
- .change as backup with audio_path guard
- JS fallback clicks submit button 1s after stop (triple redundancy)
- Add elem_id to submit button for JS targeting
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
app.py
CHANGED
|
@@ -547,7 +547,7 @@ with gr.Blocks(title="MomsVoice", css=css_code) as demo:
|
|
| 547 |
elem_id="qa_audio_input",
|
| 548 |
)
|
| 549 |
question_text = gr.Textbox(visible=False)
|
| 550 |
-
submit_question_btn = gr.Button("π Get Answer in Narrator's Voice", variant="primary")
|
| 551 |
|
| 552 |
answer_display = gr.HTML(visible=False)
|
| 553 |
answer_audio = gr.Audio(label="Answer in Narrator's Voice", interactive=False, visible=False, autoplay=True)
|
|
@@ -1097,21 +1097,28 @@ with gr.Blocks(title="MomsVoice", css=css_code) as demo:
|
|
| 1097 |
outputs=[answer_display, answer_audio]
|
| 1098 |
)
|
| 1099 |
|
| 1100 |
-
# Auto-submit when voice recording completes
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1101 |
def auto_submit_on_audio(audio_path, question_txt, paragraphs, slider_val, profile_id):
|
| 1102 |
"""Auto-submit when a recording is available."""
|
| 1103 |
if not audio_path:
|
| 1104 |
return gr.update(), gr.update()
|
| 1105 |
return handle_question_submit(question_txt, audio_path, paragraphs, slider_val, profile_id)
|
| 1106 |
|
| 1107 |
-
# .stop_recording fires when user clicks stop or silence detected
|
| 1108 |
-
question_audio.stop_recording(
|
| 1109 |
-
auto_submit_on_audio,
|
| 1110 |
-
inputs=[question_audio, question_text, paragraphs_state, timeline_slider, voice_profile_state],
|
| 1111 |
-
outputs=[answer_display, answer_audio]
|
| 1112 |
-
)
|
| 1113 |
-
|
| 1114 |
-
# .change fires after audio value is committed β backup in case stop_recording misses
|
| 1115 |
question_audio.change(
|
| 1116 |
auto_submit_on_audio,
|
| 1117 |
inputs=[question_audio, question_text, paragraphs_state, timeline_slider, voice_profile_state],
|
|
|
|
| 547 |
elem_id="qa_audio_input",
|
| 548 |
)
|
| 549 |
question_text = gr.Textbox(visible=False)
|
| 550 |
+
submit_question_btn = gr.Button("π Get Answer in Narrator's Voice", variant="primary", elem_id="qa_submit_btn")
|
| 551 |
|
| 552 |
answer_display = gr.HTML(visible=False)
|
| 553 |
answer_audio = gr.Audio(label="Answer in Narrator's Voice", interactive=False, visible=False, autoplay=True)
|
|
|
|
| 1097 |
outputs=[answer_display, answer_audio]
|
| 1098 |
)
|
| 1099 |
|
| 1100 |
+
# Auto-submit when voice recording completes
|
| 1101 |
+
# .stop_recording fires when user clicks stop
|
| 1102 |
+
question_audio.stop_recording(
|
| 1103 |
+
handle_question_submit,
|
| 1104 |
+
inputs=[question_text, question_audio, paragraphs_state, timeline_slider, voice_profile_state],
|
| 1105 |
+
outputs=[answer_display, answer_audio],
|
| 1106 |
+
js="""() => {
|
| 1107 |
+
// Fallback: also click the submit button after a delay in case the event doesn't process
|
| 1108 |
+
setTimeout(() => {
|
| 1109 |
+
const btn = document.querySelector('#qa_submit_btn');
|
| 1110 |
+
if (btn) btn.click();
|
| 1111 |
+
}, 1000);
|
| 1112 |
+
}"""
|
| 1113 |
+
)
|
| 1114 |
+
|
| 1115 |
+
# Also wire .change() as backup β fires when audio value updates
|
| 1116 |
def auto_submit_on_audio(audio_path, question_txt, paragraphs, slider_val, profile_id):
|
| 1117 |
"""Auto-submit when a recording is available."""
|
| 1118 |
if not audio_path:
|
| 1119 |
return gr.update(), gr.update()
|
| 1120 |
return handle_question_submit(question_txt, audio_path, paragraphs, slider_val, profile_id)
|
| 1121 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1122 |
question_audio.change(
|
| 1123 |
auto_submit_on_audio,
|
| 1124 |
inputs=[question_audio, question_text, paragraphs_state, timeline_slider, voice_profile_state],
|