lec2note / app.py
LRU1's picture
fix the language problem
34365ef
raw
history blame
3.52 kB
import streamlit as st
from pathlib import Path
import tempfile, subprocess, threading, queue
import textwrap
import streamlit.components.v1 as components
st.set_page_config(page_title="Lec2Note2 – Lecture-to-Notes", layout="wide")
st.title("πŸ“ Lec2Note – Automatic Lecture Notes Generator")
# Inject MathJax once for LaTeX rendering
MATHJAX = "<script src='https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js'></script>"
components.html(MATHJAX, height=0)
st.markdown(
textwrap.dedent(
"""
Upload a lecture **video** and receive a fully-formatted **Markdown** study note – complete with key images and structured sections.
The processing pipeline performs ASR transcription, vision & semantic segmentation, then invokes an LLM to produce rich notes.
"""
)
)
video_file = st.file_uploader("🎬 Upload MP4/MKV/AVI", type=["mp4", "mkv", "avi"])
run_btn = st.button("πŸš€ Generate Notes", disabled=video_file is None)
if run_btn and video_file:
# Save upload to a temporary file
tmp_dir = tempfile.TemporaryDirectory()
vid_path = Path(tmp_dir.name) / video_file.name
with vid_path.open("wb") as f:
f.write(video_file.read())
output_md = vid_path.with_suffix(".md")
st.info("Processing started. This may take several minutes depending on video length …")
# container for live log streaming
log_container = st.container()
log_placeholder = log_container.code("", language="bash", height=300)
# Run pipeline via subprocess to avoid blocking UI; capture logs
with st.spinner("Running Lec2Note2 pipeline …"):
# launch pipeline in subprocess with unbuffered output
cmd = [
"python",
"-u", # unbuffer stdout
"-m",
"lec2note.scripts.run_pipeline",
"--video",
str(vid_path),
"--output",
str(output_md),
]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
log_queue: "queue.Queue[str]" = queue.Queue()
def _enqueue_output(pipe, q):
for line in iter(pipe.readline, ""):
q.put(line)
pipe.close()
threading.Thread(target=_enqueue_output, args=(proc.stdout, log_queue), daemon=True).start()
logs = ""
line_count = 0
while True:
try:
line = log_queue.get(timeout=0.1)
except queue.Empty:
if proc.poll() is not None:
# process finished and queue empty
break
continue
logs += line
line_count += 1
if line_count % 5 == 0: # update UI every 5 lines to reduce overhead
log_placeholder.code(logs, language="bash", height=300)
# final flush
log_placeholder.code(logs, language="bash", height=300)
result_code = proc.wait()
if result_code != 0:
st.error("❌ Pipeline failed. See logs below.")
with st.expander("Show logs"):
st.code(logs)
else:
st.success("βœ… Notes generated!")
md_content = output_md.read_text()
with st.container(border=True):
st.markdown(md_content, unsafe_allow_html=True)
st.download_button(
label="πŸ’Ύ Download notes.md",
data=md_content,
file_name="lecture_notes.md",
mime="text/markdown",
)
tmp_dir.cleanup()