135 lines
4.8 KiB
Python
135 lines
4.8 KiB
Python
#!/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()
|