VeuReu commited on
Commit
332f818
·
1 Parent(s): 2ecd9f2

Upload 5 files

Browse files
Files changed (1) hide show
  1. page_modules/analyze_transcriptions.py +159 -16
page_modules/analyze_transcriptions.py CHANGED
@@ -2,14 +2,72 @@
2
 
3
  from __future__ import annotations
4
 
 
5
  from pathlib import Path
6
- from typing import Dict
7
 
8
  import streamlit as st
9
 
10
  from utils import save_bytes
11
 
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  def render_analyze_transcriptions_page(api, permissions: Dict[str, bool]) -> None:
14
  st.header("Analitzar video-transcripcions")
15
  base_dir = Path("/tmp/data/videos")
@@ -33,6 +91,9 @@ def render_analyze_transcriptions_page(api, permissions: Dict[str, bool]) -> Non
33
  if "version_selector" in st.session_state:
34
  del st.session_state["version_selector"]
35
  st.session_state.add_ad_checkbox = False
 
 
 
36
  st.rerun()
37
 
38
  if not seleccio:
@@ -53,6 +114,17 @@ def render_analyze_transcriptions_page(api, permissions: Dict[str, bool]) -> Non
53
  placeholder="Tria una versió…" if subcarpetas_ad else "No hi ha versions",
54
  key="version_selector",
55
  )
 
 
 
 
 
 
 
 
 
 
 
56
 
57
  video_ad_path = vid_dir / subcarpeta_seleccio / "une_ad.mp4" if subcarpeta_seleccio else None
58
  is_ad_video_available = video_ad_path is not None and video_ad_path.exists()
@@ -147,14 +219,30 @@ def render_analyze_transcriptions_page(api, permissions: Dict[str, bool]) -> Non
147
  key=f"editor_{seleccio}_{subcarpeta_seleccio}_{ad_filename}",
148
  )
149
 
150
- if st.button(
151
- "▶️ Reproduir narració",
152
- use_container_width=True,
153
- disabled=not new_text.strip(),
154
- key="play_button_editor",
155
- ):
156
- with st.spinner("Generant àudio..."):
157
- pass
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
 
159
  if st.button("Desar canvis", use_container_width=True, type="primary"):
160
  if ad_path:
@@ -172,17 +260,50 @@ def render_analyze_transcriptions_page(api, permissions: Dict[str, bool]) -> Non
172
 
173
  can_rate = permissions.get("valorar", False)
174
  controls_disabled = not can_rate
 
 
 
175
 
176
  c1, c2, c3 = st.columns(3)
177
  with c1:
178
- transcripcio = st.slider("Transcripció", 1, 10, 7, disabled=controls_disabled)
179
- identificacio = st.slider("Identificació de personatges", 1, 10, 7, disabled=controls_disabled)
 
 
 
 
 
 
 
 
 
 
180
  with c2:
181
- localitzacions = st.slider("Localitzacions", 1, 10, 7, disabled=controls_disabled)
182
- activitats = st.slider("Activitats", 1, 10, 7, disabled=controls_disabled)
 
 
 
 
 
 
 
 
 
 
183
  with c3:
184
- narracions = st.slider("Narracions", 1, 10, 7, disabled=controls_disabled)
185
- expressivitat = st.slider("Expressivitat", 1, 10, 7, disabled=controls_disabled)
 
 
 
 
 
 
 
 
 
 
186
 
187
  comments = st.text_area(
188
  "Comentaris (opcional)",
@@ -197,7 +318,8 @@ def render_analyze_transcriptions_page(api, permissions: Dict[str, bool]) -> Non
197
  if st.button("Enviar valoració", type="primary", use_container_width=True):
198
  try:
199
  from database import add_feedback_ad
200
-
 
201
  add_feedback_ad(
202
  video_name=seleccio,
203
  user_id=st.session_state.user["id"],
@@ -209,6 +331,27 @@ def render_analyze_transcriptions_page(api, permissions: Dict[str, bool]) -> Non
209
  expressivitat=expressivitat,
210
  comments=comments or None,
211
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
212
  st.success("Gràcies! La teva valoració s'ha desat correctament.")
213
  except Exception as e:
214
  st.error(f"S'ha produït un error en desar la valoració: {e}")
 
2
 
3
  from __future__ import annotations
4
 
5
+ import csv
6
  from pathlib import Path
7
+ from typing import Dict, Optional
8
 
9
  import streamlit as st
10
 
11
  from utils import save_bytes
12
 
13
 
14
+ def load_eval_values(vid_dir: Path, version: str) -> Optional[Dict[str, int]]:
15
+ """Carga los valores de evaluación desde eval.csv si existe.
16
+
17
+ Args:
18
+ vid_dir: Directorio del vídeo
19
+ version: Versión seleccionada (MoE/Salamandra)
20
+
21
+ Returns:
22
+ Diccionario con los valores de evaluación o None si no existe el CSV
23
+ """
24
+ csv_path = vid_dir / version / "eval.csv"
25
+
26
+ if not csv_path.exists():
27
+ return None
28
+
29
+ try:
30
+ with open(csv_path, 'r', encoding='utf-8') as f:
31
+ reader = csv.DictReader(f)
32
+ row = next(reader, None)
33
+
34
+ if not row:
35
+ return None
36
+
37
+ # Mapeo de nombres de columnas CSV a claves internas
38
+ # Usamos los nombres nuevos del CSV
39
+ mappings = {
40
+ 'transcripcio': ['Precisió Descriptiva', 'Precisió Descriptiva'],
41
+ 'identificacio': ['Sincronització Temporal', 'Sincronització Temporal'],
42
+ 'localitzacions': ['Claredat i Concisió', 'Claredat i Concisió'],
43
+ 'activitats': ['Inclusió de Diàleg/So', 'Inclusió de Diàleg', 'Inclusió de Diàleg/So'],
44
+ 'narracions': ['Contextualització', 'Contextualització'],
45
+ 'expressivitat': ['Flux i Ritme de la Narració', 'Flux i Ritme de la Narració']
46
+ }
47
+
48
+ values = {}
49
+ for key, possible_names in mappings.items():
50
+ for name in possible_names:
51
+ if name in row and row[name]:
52
+ try:
53
+ # Convertir a int y asegurar que está en rango 0-7
54
+ val = int(float(row[name]))
55
+ values[key] = max(0, min(7, val))
56
+ break
57
+ except (ValueError, TypeError):
58
+ continue
59
+
60
+ # Si no se encontró valor, usar 7 por defecto
61
+ if key not in values:
62
+ values[key] = 7
63
+
64
+ return values
65
+
66
+ except Exception as e:
67
+ # Si hay cualquier error, simplemente ignorar y devolver None
68
+ return None
69
+
70
+
71
  def render_analyze_transcriptions_page(api, permissions: Dict[str, bool]) -> None:
72
  st.header("Analitzar video-transcripcions")
73
  base_dir = Path("/tmp/data/videos")
 
91
  if "version_selector" in st.session_state:
92
  del st.session_state["version_selector"]
93
  st.session_state.add_ad_checkbox = False
94
+ # Limpiar valores de evaluación al cambiar de vídeo
95
+ if "eval_values" in st.session_state:
96
+ del st.session_state["eval_values"]
97
  st.rerun()
98
 
99
  if not seleccio:
 
114
  placeholder="Tria una versió…" if subcarpetas_ad else "No hi ha versions",
115
  key="version_selector",
116
  )
117
+
118
+ # Cargar valores de evaluación cuando cambia la versión
119
+ if subcarpeta_seleccio:
120
+ current_version_key = f"{seleccio}_{subcarpeta_seleccio}"
121
+ if "last_version_key" not in st.session_state or st.session_state.last_version_key != current_version_key:
122
+ st.session_state.last_version_key = current_version_key
123
+ eval_values = load_eval_values(vid_dir, subcarpeta_seleccio)
124
+ if eval_values:
125
+ st.session_state.eval_values = eval_values
126
+ elif "eval_values" in st.session_state:
127
+ del st.session_state["eval_values"]
128
 
129
  video_ad_path = vid_dir / subcarpeta_seleccio / "une_ad.mp4" if subcarpeta_seleccio else None
130
  is_ad_video_available = video_ad_path is not None and video_ad_path.exists()
 
219
  key=f"editor_{seleccio}_{subcarpeta_seleccio}_{ad_filename}",
220
  )
221
 
222
+ # Solo mostrar botón de reproducción para narración libre
223
+ if tipus_ad_seleccio == "narració lliure":
224
+ if st.button(
225
+ "▶️ Reproduir narració",
226
+ use_container_width=True,
227
+ disabled=not new_text.strip(),
228
+ key="play_button_editor",
229
+ ):
230
+ with st.spinner("Generant àudio..."):
231
+ try:
232
+ # Generar audio a partir del texto editado
233
+ voice = "central/grau"
234
+ response = api.tts_matxa(text=new_text.strip(), voice=voice)
235
+
236
+ if "mp3_bytes" in response:
237
+ # Mostrar el reproductor de audio
238
+ st.audio(response["mp3_bytes"], format="audio/mp3")
239
+ st.success("✅ Àudio generat correctament")
240
+ else:
241
+ st.error(f"Error en la generació de l'àudio: {response.get('error', 'Desconegut')}")
242
+ except Exception as e:
243
+ st.error(f"S'ha produït un error: {e}")
244
+ else:
245
+ st.info("📝 L'audiodescripció UNE-153010 està en format SRT. Per reproduir-la, genera el vídeo amb el botó de reconstrucció.")
246
 
247
  if st.button("Desar canvis", use_container_width=True, type="primary"):
248
  if ad_path:
 
260
 
261
  can_rate = permissions.get("valorar", False)
262
  controls_disabled = not can_rate
263
+
264
+ # Obtener valores por defecto desde el CSV si existen
265
+ eval_values = st.session_state.get("eval_values", {})
266
 
267
  c1, c2, c3 = st.columns(3)
268
  with c1:
269
+ transcripcio = st.slider(
270
+ "Precisió Descriptiva",
271
+ 0, 7,
272
+ eval_values.get('transcripcio', 7),
273
+ disabled=controls_disabled
274
+ )
275
+ identificacio = st.slider(
276
+ "Sincronització Temporal",
277
+ 0, 7,
278
+ eval_values.get('identificacio', 7),
279
+ disabled=controls_disabled
280
+ )
281
  with c2:
282
+ localitzacions = st.slider(
283
+ "Claredat i Concisió",
284
+ 0, 7,
285
+ eval_values.get('localitzacions', 7),
286
+ disabled=controls_disabled
287
+ )
288
+ activitats = st.slider(
289
+ "Inclusió de Diàleg",
290
+ 0, 7,
291
+ eval_values.get('activitats', 7),
292
+ disabled=controls_disabled
293
+ )
294
  with c3:
295
+ narracions = st.slider(
296
+ "Contextualització",
297
+ 0, 7,
298
+ eval_values.get('narracions', 7),
299
+ disabled=controls_disabled
300
+ )
301
+ expressivitat = st.slider(
302
+ "Flux i Ritme de la Narració",
303
+ 0, 7,
304
+ eval_values.get('expressivitat', 7),
305
+ disabled=controls_disabled
306
+ )
307
 
308
  comments = st.text_area(
309
  "Comentaris (opcional)",
 
318
  if st.button("Enviar valoració", type="primary", use_container_width=True):
319
  try:
320
  from database import add_feedback_ad
321
+
322
+ # Guardar en la base de datos
323
  add_feedback_ad(
324
  video_name=seleccio,
325
  user_id=st.session_state.user["id"],
 
331
  expressivitat=expressivitat,
332
  comments=comments or None,
333
  )
334
+
335
+ # También guardar en CSV
336
+ video_dir = Path("demo/videos") / seleccio
337
+ version = st.session_state.get("selected_version", "MoE")
338
+ csv_path = video_dir / version / "eval.csv"
339
+
340
+ csv_data = [
341
+ {"Caracteristica": "Precisió Descriptiva", "Valoracio (0-7)": str(transcripcio), "Justificacio": comments or ""},
342
+ {"Caracteristica": "Sincronització Temporal", "Valoracio (0-7)": str(identificacio), "Justificacio": comments or ""},
343
+ {"Caracteristica": "Claredat i Concisió", "Valoracio (0-7)": str(localitzacions), "Justificacio": comments or ""},
344
+ {"Caracteristica": "Inclusió de Diàleg/So", "Valoracio (0-7)": str(activitats), "Justificacio": comments or ""},
345
+ {"Caracteristica": "Contextualització", "Valoracio (0-7)": str(narracions), "Justificacio": comments or ""},
346
+ {"Caracteristica": "Flux i Ritme de la Narració", "Valoracio (0-7)": str(expressivitat), "Justificacio": comments or ""}
347
+ ]
348
+
349
+ csv_path.parent.mkdir(parents=True, exist_ok=True)
350
+ with open(csv_path, 'w', newline='', encoding='utf-8') as f:
351
+ writer = csv.DictWriter(f, fieldnames=["Caracteristica", "Valoracio (0-7)", "Justificacio"])
352
+ writer.writeheader()
353
+ writer.writerows(csv_data)
354
+
355
  st.success("Gràcies! La teva valoració s'ha desat correctament.")
356
  except Exception as e:
357
  st.error(f"S'ha produït un error en desar la valoració: {e}")