{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": [],
      "gpuType": "T4"
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "VHn9wyClscJH",
        "cellView": "form"
      },
      "outputs": [],
      "source": [
        "#@title 🔧 Установка (запусти один раз)\n",
        "!pip install -q faster-whisper\n",
        "!pip install -q gradio  # для удобного интерфейса\n",
        "\n",
        "print(\"✅ Установка завершена!\")"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "#@title 🚀 Загрузка модели Whisper Large-V3-Turbo\n",
        "from faster_whisper import WhisperModel\n",
        "import torch\n",
        "\n",
        "# Проверяем GPU\n",
        "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
        "compute_type = \"float16\" if device == \"cuda\" else \"int8\"\n",
        "\n",
        "print(f\"🖥️ Устройство: {device.upper()}\")\n",
        "print(\"⏳ Загружаю модель large-v3-turbo (это займёт 1-2 минуты)...\")\n",
        "\n",
        "model = WhisperModel(\n",
        "    \"large-v3-turbo\",\n",
        "    device=device,\n",
        "    compute_type=compute_type\n",
        ")\n",
        "\n",
        "print(\"✅ Модель загружена и готова к работе!\")"
      ],
      "metadata": {
        "id": "LLQDhQZDsfBK",
        "cellView": "form"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "#@title 📝 Функция транскрибации\n",
        "\n",
        "def transcribe_audio(audio_path, language=None, task=\"transcribe\"):\n",
        "    \"\"\"\n",
        "    Транскрибирует аудио/видео файл.\n",
        "\n",
        "    Args:\n",
        "        audio_path: путь к файлу\n",
        "        language: язык ('ru', 'en', 'uk' и т.д.) или None для автоопределения\n",
        "        task: 'transcribe' (транскрибация) или 'translate' (перевод на английский)\n",
        "    \"\"\"\n",
        "    print(f\"🎙️ Обрабатываю: {audio_path}\")\n",
        "    print(\"⏳ Это может занять несколько минут...\")\n",
        "\n",
        "    segments, info = model.transcribe(\n",
        "        audio_path,\n",
        "        language=language,\n",
        "        task=task,\n",
        "        beam_size=5,\n",
        "        vad_filter=True,  # убирает тишину\n",
        "        vad_parameters=dict(min_silence_duration_ms=500)\n",
        "    )\n",
        "\n",
        "    print(f\"📊 Обнаружен язык: {info.language} (вероятность: {info.language_probability:.1%})\")\n",
        "    print(f\"⏱️ Длительность: {info.duration:.1f} сек\\n\")\n",
        "\n",
        "    # Собираем результат\n",
        "    full_text = []\n",
        "    timestamps = []\n",
        "\n",
        "    for segment in segments:\n",
        "        full_text.append(segment.text.strip())\n",
        "        timestamps.append({\n",
        "            \"start\": segment.start,\n",
        "            \"end\": segment.end,\n",
        "            \"text\": segment.text.strip()\n",
        "        })\n",
        "        # Показываем прогресс\n",
        "        print(f\"[{segment.start:.1f}s → {segment.end:.1f}s] {segment.text.strip()}\")\n",
        "\n",
        "    return \"\\n\".join(full_text), timestamps\n",
        "\n",
        "print(\"✅ Функция готова!\")"
      ],
      "metadata": {
        "id": "Q7R9IJQCsmjy",
        "cellView": "form"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "#@title 📤 Загрузи файл и получи транскрипцию\n",
        "from google.colab import files\n",
        "import os\n",
        "\n",
        "# Загрузка файла\n",
        "print(\"📤 Выбери аудио или видео файл (mp3, wav, mp4, m4a, webm и др.):\")\n",
        "uploaded = files.upload()\n",
        "\n",
        "if uploaded:\n",
        "    filename = list(uploaded.keys())[0]\n",
        "    print(f\"\\n✅ Загружен: {filename}\")\n",
        "\n",
        "    #@markdown ---\n",
        "    #@markdown ### Настройки:\n",
        "    language = \"ru\" #@param [\"ru\", \"en\", \"uk\", \"auto\"] {allow-input: true}\n",
        "    task = \"transcribe\" #@param [\"transcribe\", \"translate\"]\n",
        "\n",
        "    # Если auto - передаём None для автоопределения\n",
        "    lang = None if language == \"auto\" else language\n",
        "\n",
        "    # Транскрибация\n",
        "    text, timestamps = transcribe_audio(filename, language=lang, task=task)\n",
        "\n",
        "    print(\"\\n\" + \"=\"*50)\n",
        "    print(\"📄 ПОЛНЫЙ ТЕКСТ:\")\n",
        "    print(\"=\"*50)\n",
        "    print(text)"
      ],
      "metadata": {
        "cellView": "form",
        "id": "bRGEudMrspM4"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "#@title 💾 Сохранить результат в файл\n",
        "\n",
        "#@markdown ### Формат сохранения:\n",
        "save_format = \"txt\" #@param [\"txt\", \"srt\", \"json\"]\n",
        "\n",
        "output_name = os.path.splitext(filename)[0]\n",
        "\n",
        "if save_format == \"txt\":\n",
        "    output_file = f\"{output_name}_transcript.txt\"\n",
        "    with open(output_file, \"w\", encoding=\"utf-8\") as f:\n",
        "        f.write(text)\n",
        "\n",
        "elif save_format == \"srt\":\n",
        "    output_file = f\"{output_name}_subtitles.srt\"\n",
        "    with open(output_file, \"w\", encoding=\"utf-8\") as f:\n",
        "        for i, seg in enumerate(timestamps, 1):\n",
        "            start = seg[\"start\"]\n",
        "            end = seg[\"end\"]\n",
        "            # Форматируем время для SRT\n",
        "            start_srt = f\"{int(start//3600):02d}:{int((start%3600)//60):02d}:{int(start%60):02d},{int((start%1)*1000):03d}\"\n",
        "            end_srt = f\"{int(end//3600):02d}:{int((end%3600)//60):02d}:{int(end%60):02d},{int((end%1)*1000):03d}\"\n",
        "            f.write(f\"{i}\\n{start_srt} --> {end_srt}\\n{seg['text']}\\n\\n\")\n",
        "\n",
        "elif save_format == \"json\":\n",
        "    import json\n",
        "    output_file = f\"{output_name}_transcript.json\"\n",
        "    with open(output_file, \"w\", encoding=\"utf-8\") as f:\n",
        "        json.dump({\"text\": text, \"segments\": timestamps}, f, ensure_ascii=False, indent=2)\n",
        "\n",
        "print(f\"✅ Сохранено: {output_file}\")\n",
        "\n",
        "# Скачиваем файл\n",
        "files.download(output_file)"
      ],
      "metadata": {
        "id": "p-rjq-PPsrkM",
        "cellView": "form"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "vLQW0UPRsue9"
      },
      "execution_count": null,
      "outputs": []
    }
  ]
}