Yoad commited on
Commit
1165618
·
1 Parent(s): 7b3ae60

Add manual Entry mode

Browse files
Files changed (3) hide show
  1. src/app.py +30 -21
  2. src/manual_evlaution.py +37 -0
  3. src/utils.py +30 -0
src/app.py CHANGED
@@ -9,10 +9,12 @@ import requests
9
  import streamlit as st
10
  from huggingface_hub import HfFileSystem
11
 
 
12
  from st_fixed_container import st_fixed_container
 
13
  from visual_eval.evaluator import HebrewTextNormalizer
14
  from visual_eval.visualization import render_visualize_jiwer_result_html
15
- from substitutions_visualizer import visualize_substitutions
16
 
17
  HF_API_TOKEN = None
18
  try:
@@ -35,6 +37,8 @@ if "audio_cache" not in st.session_state:
35
 
36
  if "audio_preview_active" not in st.session_state:
37
  st.session_state.audio_preview_active = {}
 
 
38
 
39
  if "uploaded_file" not in st.session_state:
40
  st.session_state.results_file = None
@@ -85,7 +89,7 @@ def on_file_upload():
85
  st.session_state.results_file = None
86
 
87
 
88
- def on_local_file_upload():
89
  if "lb_result_file" in st.query_params:
90
  st.query_params.pop("lb_result_file")
91
  st.session_state.consumed_query_lb_file = None
@@ -140,19 +144,6 @@ def read_results_csv(uploaded_file):
140
  results_df = pd.read_csv(uploaded_file)
141
  return results_df
142
 
143
-
144
- def display_rtl(html):
145
- """Render an RTL container with the provided HTML string"""
146
- st.markdown(
147
- f"""
148
- <div dir="rtl" lang="he">
149
- {html}
150
- </div>
151
- """,
152
- unsafe_allow_html=True,
153
- )
154
-
155
-
156
  @st.cache_data
157
  def calculate_final_metrics(uploaded_file, _df):
158
  """Calculate final metrics for all entries
@@ -307,6 +298,9 @@ def main():
307
  page_title="ASR Evaluation Visualizer", page_icon="🎤", layout="wide"
308
  )
309
 
 
 
 
310
  # Check for URL parameter for preloading leaderboard results
311
  lb_result_file_param = st.query_params.get("lb_result_file")
312
  if (
@@ -332,22 +326,32 @@ def main():
332
  uploaded_file = st.file_uploader(
333
  "Upload evaluation results CSV",
334
  type=["csv"],
335
- on_change=on_local_file_upload,
336
  key="uploaded_file",
337
  )
338
 
339
  if st.session_state.consumed_query_lb_file is not None:
340
- st.subheader(
341
- f"Loaded: {st.session_state.consumed_query_lb_file or uploaded_file}"
342
- )
 
 
 
 
 
 
343
 
344
  if uploaded_file is not None:
345
  st.session_state.results_file = uploaded_file
346
 
347
- if uploaded_file is None:
348
  st.write("Or:")
349
  if st.button("Choose from leaderboard"):
350
  choose_input_file_from_leaderboard()
 
 
 
 
351
 
352
  if st.session_state.results_file is not None:
353
  uploaded_file = st.session_state.results_file
@@ -355,7 +359,6 @@ def main():
355
  try:
356
  eval_results = read_results_csv(uploaded_file)
357
  st.session_state.total_entry_count = len(eval_results)
358
- st.success("File uploaded successfully!")
359
 
360
  with st.sidebar:
361
  # Toggle for calculating total metrics
@@ -525,6 +528,12 @@ def main():
525
 
526
  except Exception as e:
527
  st.error(f"Error processing file: {str(e)}")
 
 
 
 
 
 
528
  else:
529
  st.info(
530
  "Please upload an evaluation results CSV file to visualize the results."
 
9
  import streamlit as st
10
  from huggingface_hub import HfFileSystem
11
 
12
+ from manual_evlaution import render_manual_eval
13
  from st_fixed_container import st_fixed_container
14
+ from substitutions_visualizer import visualize_substitutions
15
  from visual_eval.evaluator import HebrewTextNormalizer
16
  from visual_eval.visualization import render_visualize_jiwer_result_html
17
+ from utils import display_rtl, ltr_tag
18
 
19
  HF_API_TOKEN = None
20
  try:
 
37
 
38
  if "audio_preview_active" not in st.session_state:
39
  st.session_state.audio_preview_active = {}
40
+ if "manual_mode" not in st.session_state:
41
+ st.session_state.manual_mode = False
42
 
43
  if "uploaded_file" not in st.session_state:
44
  st.session_state.results_file = None
 
89
  st.session_state.results_file = None
90
 
91
 
92
+ def reset_upload_state():
93
  if "lb_result_file" in st.query_params:
94
  st.query_params.pop("lb_result_file")
95
  st.session_state.consumed_query_lb_file = None
 
144
  results_df = pd.read_csv(uploaded_file)
145
  return results_df
146
 
 
 
 
 
 
 
 
 
 
 
 
 
 
147
  @st.cache_data
148
  def calculate_final_metrics(uploaded_file, _df):
149
  """Calculate final metrics for all entries
 
298
  page_title="ASR Evaluation Visualizer", page_icon="🎤", layout="wide"
299
  )
300
 
301
+ # RTL some tags
302
+ ltr_tag("textarea")
303
+
304
  # Check for URL parameter for preloading leaderboard results
305
  lb_result_file_param = st.query_params.get("lb_result_file")
306
  if (
 
326
  uploaded_file = st.file_uploader(
327
  "Upload evaluation results CSV",
328
  type=["csv"],
329
+ on_change=reset_upload_state(),
330
  key="uploaded_file",
331
  )
332
 
333
  if st.session_state.consumed_query_lb_file is not None:
334
+ clear_col1, clear_col2 = st.columns([10, 1], gap="large")
335
+ with clear_col1:
336
+ st.info(
337
+ f"Loaded: {st.session_state.consumed_query_lb_file or uploaded_file}"
338
+ )
339
+ with clear_col2:
340
+ if st.button("Unload"):
341
+ reset_upload_state()
342
+ st.rerun()
343
 
344
  if uploaded_file is not None:
345
  st.session_state.results_file = uploaded_file
346
 
347
+ if st.session_state.results_file is None:
348
  st.write("Or:")
349
  if st.button("Choose from leaderboard"):
350
  choose_input_file_from_leaderboard()
351
+ if st.button("Enter Manually"):
352
+ st.session_state.manual_mode = True
353
+ reset_upload_state()
354
+ st.rerun()
355
 
356
  if st.session_state.results_file is not None:
357
  uploaded_file = st.session_state.results_file
 
359
  try:
360
  eval_results = read_results_csv(uploaded_file)
361
  st.session_state.total_entry_count = len(eval_results)
 
362
 
363
  with st.sidebar:
364
  # Toggle for calculating total metrics
 
528
 
529
  except Exception as e:
530
  st.error(f"Error processing file: {str(e)}")
531
+ elif st.session_state.manual_mode:
532
+ st.info(
533
+ "Please enter the evaluation results CSV file to visualize the results."
534
+ )
535
+ render_manual_eval()
536
+
537
  else:
538
  st.info(
539
  "Please upload an evaluation results CSV file to visualize the results."
src/manual_evlaution.py ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+
3
+ from visual_eval.evaluator import HebrewTextNormalizer
4
+ from visual_eval.visualization import render_visualize_jiwer_result_html
5
+ from substitutions_visualizer import visualize_substitutions
6
+ from utils import display_rtl
7
+
8
+ norm = HebrewTextNormalizer()
9
+
10
+
11
+ @st.fragment
12
+ def manual_eval_viz(ref, hyp):
13
+ show_subs = st.toggle("Show Substitutions", value=False)
14
+ norm_texts = st.toggle("Normalize Texts", value=True)
15
+ if norm_texts:
16
+ ref = norm(ref)
17
+ hyp = norm(hyp)
18
+ html = render_visualize_jiwer_result_html(ref, hyp)
19
+ display_rtl(html)
20
+ if show_subs:
21
+ visualize_substitutions(ref, hyp)
22
+
23
+
24
+ def render_manual_eval():
25
+ col_ref, col_hyp = st.columns([1, 1], gap="small")
26
+ ref = None
27
+ hyp = None
28
+ with col_ref:
29
+ ref = st.text_area("Reference Text", height=100)
30
+ with col_hyp:
31
+ hyp = st.text_area("Hypothesis Text", height=100)
32
+
33
+ if st.button("Visualize"):
34
+ if hyp and ref:
35
+ manual_eval_viz(ref, hyp)
36
+ else:
37
+ st.error("Please enter both reference and hypothesis text.")
src/utils.py ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+
3
+
4
+ def ltr_tag(tag):
5
+ style = """
6
+ {
7
+ unicode-bidi:bidi-override;
8
+ direction: RTL;
9
+ }
10
+ """
11
+ st.markdown(
12
+ f"""
13
+ <style>
14
+ {tag}, .rtl {style}
15
+ </style>
16
+ """,
17
+ unsafe_allow_html=True,
18
+ )
19
+
20
+
21
+ def display_rtl(html):
22
+ """Render an RTL container with the provided HTML string"""
23
+ st.markdown(
24
+ f"""
25
+ <div dir="rtl" lang="he">
26
+ {html}
27
+ </div>
28
+ """,
29
+ unsafe_allow_html=True,
30
+ )