add english transcriptions tests

This commit is contained in:
shuler7 2026-04-29 23:53:32 +03:00
parent 88a17d528b
commit 4764b4cb6e
4 changed files with 323 additions and 10 deletions

128
tests/english-tester.py Normal file
View file

@ -0,0 +1,128 @@
#!/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-Республика_Адыгея", "2-Республикаашкортостан"]
recognizer_script = Path.home() / "zeroclaw-bot" / "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"
with open(output_file, "w", encoding="utf-8") as f:
json.dump(results, 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()