Spaces:
Running
Running
fixing narration
Browse files- chatbot.py +20 -19
chatbot.py
CHANGED
|
@@ -100,7 +100,7 @@ def render_chatbot(code, output, error):
|
|
| 100 |
st.session_state.setdefault('conversation', [])
|
| 101 |
st.session_state.setdefault('chat_summary', "")
|
| 102 |
st.session_state.setdefault('chat_display_count', 5)
|
| 103 |
-
st.session_state.setdefault('narrations',
|
| 104 |
|
| 105 |
c1, c2 = st.columns([4, 1], gap='small')
|
| 106 |
with c1:
|
|
@@ -125,9 +125,9 @@ def render_chatbot(code, output, error):
|
|
| 125 |
|
| 126 |
total = len(st.session_state.conversation)
|
| 127 |
start = max(0, total - st.session_state.chat_display_count)
|
| 128 |
-
visible = st.session_state.conversation[start:]
|
| 129 |
|
| 130 |
-
for i, (q, a) in enumerate(
|
| 131 |
st.markdown(f'<div class="chat-message user-message">{escape(q)}</div>', unsafe_allow_html=True)
|
| 132 |
|
| 133 |
def format_response(txt):
|
|
@@ -148,22 +148,23 @@ def render_chatbot(code, output, error):
|
|
| 148 |
st.markdown(f'<div class="chat-message bot-message">{formatted}</div>', unsafe_allow_html=True)
|
| 149 |
|
| 150 |
# π Speak
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
st.
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
|
|
|
| 167 |
|
| 168 |
if start > 0 and st.button("π½ Show more"):
|
| 169 |
st.session_state.chat_display_count += 5
|
|
|
|
| 100 |
st.session_state.setdefault('conversation', [])
|
| 101 |
st.session_state.setdefault('chat_summary', "")
|
| 102 |
st.session_state.setdefault('chat_display_count', 5)
|
| 103 |
+
st.session_state.setdefault('narrations', {}) # key: index, value: (text, file)
|
| 104 |
|
| 105 |
c1, c2 = st.columns([4, 1], gap='small')
|
| 106 |
with c1:
|
|
|
|
| 125 |
|
| 126 |
total = len(st.session_state.conversation)
|
| 127 |
start = max(0, total - st.session_state.chat_display_count)
|
| 128 |
+
visible = list(reversed(st.session_state.conversation[start:])) # reversed
|
| 129 |
|
| 130 |
+
for i, (q, a) in enumerate(visible):
|
| 131 |
st.markdown(f'<div class="chat-message user-message">{escape(q)}</div>', unsafe_allow_html=True)
|
| 132 |
|
| 133 |
def format_response(txt):
|
|
|
|
| 148 |
st.markdown(f'<div class="chat-message bot-message">{formatted}</div>', unsafe_allow_html=True)
|
| 149 |
|
| 150 |
# π Speak
|
| 151 |
+
speak_btn = st.button("π Narrate", key=f"narrate_btn_{i}")
|
| 152 |
+
if speak_btn:
|
| 153 |
+
status_placeholder = st.empty()
|
| 154 |
+
status_placeholder.info("π§ Generating narration...")
|
| 155 |
+
bot = CodeAssistantBot()
|
| 156 |
+
narration = bot.narrate_response(code, output, error, a, st.session_state.chat_summary)
|
| 157 |
+
status_placeholder.info("ποΈ Converting to audio...")
|
| 158 |
+
audio_filename = f"audio_{uuid.uuid4().hex}.mp3"
|
| 159 |
+
asyncio.run(text_to_speech(narration, audio_filename))
|
| 160 |
+
st.session_state.narrations[i] = (narration, audio_filename)
|
| 161 |
+
status_placeholder.success("π Narration ready!")
|
| 162 |
+
st.audio(audio_filename, format="audio/mp3", autoplay=True)
|
| 163 |
+
|
| 164 |
+
# Playback of previously narrated
|
| 165 |
+
if i in st.session_state.narrations:
|
| 166 |
+
narration, audio_file = st.session_state.narrations[i]
|
| 167 |
+
st.audio(audio_file, format="audio/mp3", autoplay=False)
|
| 168 |
|
| 169 |
if start > 0 and st.button("π½ Show more"):
|
| 170 |
st.session_state.chat_display_count += 5
|