Spaces:
Running
Running
| import json | |
| import os | |
| from typing import Any, Dict, List, Tuple | |
| def load_teacher_units(teacher_units_dir: str) -> Tuple[Dict[str, Dict[str, Any]], List[str]]: | |
| if not os.path.isdir(teacher_units_dir): | |
| raise FileNotFoundError( | |
| f"Teacher units not found: {teacher_units_dir}. Please generate units offline." | |
| ) | |
| units: Dict[str, Dict[str, Any]] = {} | |
| for name in os.listdir(teacher_units_dir): | |
| unit_dir = os.path.join(teacher_units_dir, name) | |
| if not os.path.isdir(unit_dir): | |
| continue | |
| text_path = os.path.join(unit_dir, "text.json") | |
| align_words_path = os.path.join(unit_dir, "align_words.json") | |
| video_path = os.path.join(unit_dir, "video.mp4") | |
| audio_path = os.path.join(unit_dir, "audio.wav") | |
| align_phones_path = os.path.join(unit_dir, "align_phones.json") | |
| if not all(os.path.exists(p) for p in (text_path, align_words_path, video_path, audio_path)): | |
| continue | |
| with open(text_path, "r", encoding="utf-8") as f: | |
| text_data = json.load(f) | |
| with open(align_words_path, "r", encoding="utf-8") as f: | |
| align_words = json.load(f) | |
| align_phones = [] | |
| if os.path.exists(align_phones_path): | |
| with open(align_phones_path, "r", encoding="utf-8") as f: | |
| align_phones = json.load(f) | |
| units[name] = { | |
| "unit_id": name, | |
| "text": text_data, | |
| "words": align_words, | |
| "video_path": video_path, | |
| "audio_path": audio_path, | |
| "phones": align_phones, | |
| "unit_index": text_data.get("unit_index", 0), | |
| } | |
| if not units: | |
| raise FileNotFoundError("No valid teacher units found.") | |
| ordered = sorted(units.values(), key=lambda x: (x["unit_index"], x["unit_id"])) | |
| unit_ids = [u["unit_id"] for u in ordered] | |
| return units, unit_ids | |