#!/usr/bin/env python3 import subprocess import json import os import sys from pathlib import Path def transcribe_file( file_path: Path, script_path: Path, timeout_seconds: int = 60 ) -> str: """ Вызывает recognition.py для одного файла, возвращает транскрипцию. """ cmd = ["python3", str(script_path), str(file_path)] try: result = subprocess.run( cmd, capture_output=True, text=True, check=True, encoding="utf-8", timeout=timeout_seconds, ) # Предполагаем, что скрипт выводит транскрипцию в stdout transcript = result.stdout.strip() if not transcript: print(f"Предупреждение: пустая транскрипция для {file_path}") return transcript except subprocess.TimeoutExpired: error_msg = f"TIMEOUT: превышен лимит в {timeout_seconds} секунд" print(f"Ошибка: {error_msg} для {file_path}") return f"ERROR: {error_msg}" except subprocess.CalledProcessError as e: print(f"Ошибка при обработке {file_path}: {e}") print(f"stderr: {e.stderr}") return f"ERROR: {e.stderr}" def main(): # Пути base_dir = Path( r"/mnt/c/proga/projects/ege-skill-dev/.scans/Сложные работы_Английский язык УЧ часть 1/" ) regions = ["2-Республика Башкортостан", "3-Республика Бурятия"] recognizer_script = Path.home() / ".zeroclaw" / "workspace" / "skills" / "ege-checker" / "recognition.py" # Таймаут на транскрипцию одного файла (в секундах) TIMEOUT_PER_FILE = 120 # Проверки if not base_dir.exists(): print(f"Ошибка: директория {base_dir} не найдена") sys.exit(1) if not recognizer_script.exists(): print(f"Ошибка: скрипт {recognizer_script} не найден") sys.exit(1) # Собираем все .ogg файлы, кроме тех, где озвузичвается код участника ogg_files = [] for region in regions: ogg_files.extend( [ file for i, file in enumerate(list(Path(f"{base_dir}/{region}/").rglob("*.ogg"))) if i % 5 != 0 ] ) print(f"Найдено {len(ogg_files)} .ogg файлов") results = [] for idx, ogg_path in enumerate(ogg_files, 1): print(f"\n[{idx}/{len(ogg_files)}] Обработка: {ogg_path}") # Структура: .../{region}/{fio}/{file} region = ogg_path.parent.parent.name fio = ogg_path.parent.name print(f" Регион: {region}") print(f" ФИО: {fio}") print( f" Транскрибирование (таймаут: {TIMEOUT_PER_FILE} сек)...", end=" ", flush=True, ) transcript = transcribe_file(ogg_path, recognizer_script, TIMEOUT_PER_FILE) print("готово") # Показываем первые 100 символов транскрипции, если она есть preview = transcript[:100].replace("\n", " ") if preview and not transcript.startswith("ERROR:"): print(f" Транскрипция (начало): {preview}...") elif transcript.startswith("ERROR:"): print(f" {transcript}") results.append( { "region": region, "fio": fio, "transcript": transcript } ) # Сохраняем JSON output_file = Path.cwd() / "tests" / "transcriptions.json" if Path.exists(output_file): with open(output_file, "r", encoding="utf-8") as f: results_to_file: list = json.load(f) results_to_file.extend(results) else: results_to_file = results with open(output_file, "w", encoding="utf-8") as f: json.dump(results_to_file, f, ensure_ascii=False, indent=2) # Статистика total_files = len(results) error_files = sum(1 for r in results if r["transcript"].startswith("ERROR:")) timeout_files = sum(1 for r in results if "TIMEOUT" in r["transcript"]) success_files = total_files - error_files print(f"\n✅ Готово! Результаты сохранены в {output_file}") print(f"Всего обработано файлов: {total_files}") print(f" - Успешно: {success_files}") print(f" - Ошибок: {error_files} (из них timeout: {timeout_files})") if __name__ == "__main__": main()