<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Whisper Web Service</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>

<div class="container mt-5">
    <h1>Аудио -> Транскрипция</h1>

    <form method="post" action="" enctype="multipart/form-data">
        <div class="form-group">
            <label for="audioFile" class="form-label">Выберите аудиофайл:</label>
            <input type="file" class="form-control" id="audioFile" name="audioFile" accept="audio/*">
        </div>
        <button type="submit" class="btn btn-primary">Транскрибировать</button>
    </form>

    <?php
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        $uploadDir = "C:\\OSPanel\\home\\example.local\\"; // Временная директория для загруженных файлов.  Измените на подходящую!
        $audioFile = $uploadDir . basename($_FILES["audioFile"]["name"]);

        // Проверка расширения и размера файла
        $allowed_extensions = array("wav", "mp3", "ogg");
        $file_extension = strtolower(pathinfo($_FILES["audioFile"]["name"], PATHINFO_EXTENSION));

        if (!in_array($file_extension, $allowed_extensions) || $_FILES["audioFile"]["size"] > 10 * 1024 * 1024) {
            echo "<div class='text-danger mt-3'>Недопустимый тип файла или слишком большой размер.</div>";
            exit;
        }

        if (move_uploaded_file($_FILES["audioFile"]["tmp_name"], $audioFile)) {
            echo "<div class='mt-3'>Загружен файл: " . htmlspecialchars($audioFile) . "</div>";

            // Проверка наличия Whisper
            $whisperPath = escapeshellarg("C:\\Users\\Evgen\\AppData\\Local\\Programs\\Python\\Python313\\Scripts\\whisper"); // Замените на фактический путь к Whisper. ОЧЕНЬ ВАЖНО!
            //if (file_exists($whisperPath)) {
                $command = "set PYTHONIOENCODING=utf-8 && $whisperPath --model large --language Russian \"$audioFile\"";

                // Установка лимита времени выполнения
                set_time_limit(300); // 5 минут

                $output = shell_exec($command . " 2>&1");  // Перенаправление stderr в stdout

                if ($lastError = error_get_last()) {
                    echo "<div class='text-danger mt-3'>Ошибка выполнения команды: " . htmlspecialchars($lastError['message']) . "</div>";
                } else {
                    echo "<div class='mt-3'>Результат транскрипции:</div>";
                    echo "<pre>" . htmlspecialchars($output) . "</pre>";
                }

                unlink($audioFile); // Удаление временного файла
            //} else {
                //echo "<div class='text-danger mt-3'>Whisper не найден по указанному пути.</div>";
            //}

        } else {
            echo "<div class='text-danger mt-3'>Ошибка загрузки файла.</div>";
        }
    }
    ?>
</div>

<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.3/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body>
</html> предложи доработки по скрипту