ege-skill/tests/english-tester.py

135 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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), "--output", "transcript", 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 = ["1-Республика Адыгея"]
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,
"file_path": str(ogg_path),
}
)
# Сохраняем JSON
output_file = Path.cwd() / "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()