minhahwang Copilot commited on
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>

Files changed (1) hide show
  1. app.py +17 -10
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 β€” use BOTH events for reliability
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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],