{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "WLiXr-BwCshq",
        "outputId": "4f856ecb-6706-4313-9a33-8a68e8802088"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Mounted at /content/drive\n"
          ]
        }
      ],
      "source": [
        "from google.colab import drive\n",
        "drive.mount('/content/drive')"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from google.colab import drive\n",
        "drive.mount('/content/drive')"
      ],
      "metadata": {
        "id": "9ZwEHulCsY0G"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "f8kM9tJItJZK",
        "outputId": "12145bc9-fd11-4414-df85-4127e5986cd2"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "오디오 분할이 완료되었습니다.\n"
          ]
        }
      ],
      "source": [
        "import subprocess\n",
        "\n",
        "def split_audio(input_file, segment_length, output_pattern):\n",
        "    # ffmpeg 명령어 구성\n",
        "    command = [\n",
        "        \"ffmpeg\",\n",
        "        \"-i\", input_file,\n",
        "        \"-f\", \"segment\",\n",
        "        \"-segment_time\", str(segment_length),\n",
        "        \"-c\", \"copy\",\n",
        "        output_pattern\n",
        "    ]\n",
        "\n",
        "    # ffmpeg 실행\n",
        "    result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n",
        "\n",
        "    # 오류 처리\n",
        "    if result.returncode != 0:\n",
        "        print(\"오디오 분할 중 오류 발생:\")\n",
        "        print(result.stderr.decode())  # 오류 메시지 출력\n",
        "        raise Exception(\"오디오 분할 실패\")\n",
        "\n",
        "# 파일 이름 정의\n",
        "voice_file_name = \"/content/drive/MyDrive/Colab Notebooks/input_manual\"\n",
        "\n",
        "# 10분(600초) 간격으로 MP3 파일 분할\n",
        "try:\n",
        "    split_audio(f\"{voice_file_name}.mp3\", 600, f\"{voice_file_name}_output%03d.mp3\")\n",
        "    print(\"오디오 분할이 완료되었습니다.\")\n",
        "except Exception as e:\n",
        "    print(f\"오류: {e}\")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "s8ehR3NFOA24",
        "outputId": "c359f5e0-44f4-425c-fcbc-8e90d15fc26f"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Collecting git+https://github.com/openai/whisper.git\n",
            "  Cloning https://github.com/openai/whisper.git to /tmp/pip-req-build-m6amxjw1\n",
            "  Running command git clone --filter=blob:none --quiet https://github.com/openai/whisper.git /tmp/pip-req-build-m6amxjw1\n",
            "  Resolved https://github.com/openai/whisper.git to commit 86098128c0b4f24f0e2aa2994de830614b474227\n",
            "  Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n",
            "  Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n",
            "  Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n",
            "Requirement already satisfied: more-itertools in /usr/local/lib/python3.13/dist-packages (from openai-whisper==20250625) (10.8.0)\n",
            "Requirement already satisfied: numba in /usr/local/lib/python3.13/dist-packages (from openai-whisper==20250625) (0.61.2)\n",
            "Requirement already satisfied: numpy in /usr/local/lib/python3.13/dist-packages (from openai-whisper==20250625) (2.1.3)\n",
            "Requirement already satisfied: tiktoken in /usr/local/lib/python3.13/dist-packages (from openai-whisper==20250625) (0.14.0)\n",
            "Requirement already satisfied: torch in /usr/local/lib/python3.13/dist-packages (from openai-whisper==20250625) (2.11.0+cu128)\n",
            "Requirement already satisfied: tqdm in /usr/local/lib/python3.13/dist-packages (from openai-whisper==20250625) (4.67.3)\n",
            "Requirement already satisfied: triton>=2 in /usr/local/lib/python3.13/dist-packages (from openai-whisper==20250625) (3.6.0)\n",
            "Requirement already satisfied: llvmlite<0.45,>=0.44.0dev0 in /usr/local/lib/python3.13/dist-packages (from numba->openai-whisper==20250625) (0.44.0)\n",
            "Requirement already satisfied: regex in /usr/local/lib/python3.13/dist-packages (from tiktoken->openai-whisper==20250625) (2025.11.3)\n",
            "Requirement already satisfied: requests in /usr/local/lib/python3.13/dist-packages (from tiktoken->openai-whisper==20250625) (2.32.4)\n",
            "Requirement already satisfied: filelock in /usr/local/lib/python3.13/dist-packages (from torch->openai-whisper==20250625) (3.32.5)\n",
            "Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.13/dist-packages (from torch->openai-whisper==20250625) (4.16.0)\n",
            "Requirement already satisfied: setuptools<82 in /usr/local/lib/python3.13/dist-packages (from torch->openai-whisper==20250625) (80.10.2)\n",
            "Requirement already satisfied: sympy>=1.13.3 in /usr/local/lib/python3.13/dist-packages (from torch->openai-whisper==20250625) (1.14.0)\n",
            "Requirement already satisfied: networkx>=2.5.1 in /usr/local/lib/python3.13/dist-packages (from torch->openai-whisper==20250625) (3.6.1)\n",
            "Requirement already satisfied: jinja2 in /usr/local/lib/python3.13/dist-packages (from torch->openai-whisper==20250625) (3.1.6)\n",
            "Requirement already satisfied: fsspec>=0.8.5 in /usr/local/lib/python3.13/dist-packages (from torch->openai-whisper==20250625) (2025.12.0)\n",
            "Requirement already satisfied: cuda-toolkit==12.8.1 in /usr/local/lib/python3.13/dist-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==12.8.1; platform_system == \"Linux\"->torch->openai-whisper==20250625) (12.8.1)\n",
            "Requirement already satisfied: cuda-bindings<13,>=12.9.4 in /usr/local/lib/python3.13/dist-packages (from torch->openai-whisper==20250625) (12.9.7)\n",
            "Requirement already satisfied: nvidia-cudnn-cu12==9.19.0.56 in /usr/local/lib/python3.13/dist-packages (from torch->openai-whisper==20250625) (9.19.0.56)\n",
            "Requirement already satisfied: nvidia-cusparselt-cu12==0.7.1 in /usr/local/lib/python3.13/dist-packages (from torch->openai-whisper==20250625) (0.7.1)\n",
            "Requirement already satisfied: nvidia-nccl-cu12==2.28.9 in /usr/local/lib/python3.13/dist-packages (from torch->openai-whisper==20250625) (2.28.9)\n",
            "Requirement already satisfied: nvidia-nvshmem-cu12==3.4.5 in /usr/local/lib/python3.13/dist-packages (from torch->openai-whisper==20250625) (3.4.5)\n",
            "Requirement already satisfied: nvidia-cublas-cu12==12.8.4.1.* in /usr/local/lib/python3.13/dist-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==12.8.1; platform_system == \"Linux\"->torch->openai-whisper==20250625) (12.8.4.1)\n",
            "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.8.90.* in /usr/local/lib/python3.13/dist-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==12.8.1; platform_system == \"Linux\"->torch->openai-whisper==20250625) (12.8.90)\n",
            "Requirement already satisfied: nvidia-cufft-cu12==11.3.3.83.* in /usr/local/lib/python3.13/dist-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==12.8.1; platform_system == \"Linux\"->torch->openai-whisper==20250625) (11.3.3.83)\n",
            "Requirement already satisfied: nvidia-cufile-cu12==1.13.1.3.* in /usr/local/lib/python3.13/dist-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==12.8.1; platform_system == \"Linux\"->torch->openai-whisper==20250625) (1.13.1.3)\n",
            "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.8.90.* in /usr/local/lib/python3.13/dist-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==12.8.1; platform_system == \"Linux\"->torch->openai-whisper==20250625) (12.8.90)\n",
            "Requirement already satisfied: nvidia-curand-cu12==10.3.9.90.* in /usr/local/lib/python3.13/dist-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==12.8.1; platform_system == \"Linux\"->torch->openai-whisper==20250625) (10.3.9.90)\n",
            "Requirement already satisfied: nvidia-cusolver-cu12==11.7.3.90.* in /usr/local/lib/python3.13/dist-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==12.8.1; platform_system == \"Linux\"->torch->openai-whisper==20250625) (11.7.3.90)\n",
            "Requirement already satisfied: nvidia-cusparse-cu12==12.5.8.93.* in /usr/local/lib/python3.13/dist-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==12.8.1; platform_system == \"Linux\"->torch->openai-whisper==20250625) (12.5.8.93)\n",
            "Requirement already satisfied: nvidia-nvjitlink-cu12==12.8.93.* in /usr/local/lib/python3.13/dist-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==12.8.1; platform_system == \"Linux\"->torch->openai-whisper==20250625) (12.8.93)\n",
            "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.8.93.* in /usr/local/lib/python3.13/dist-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==12.8.1; platform_system == \"Linux\"->torch->openai-whisper==20250625) (12.8.93)\n",
            "Requirement already satisfied: nvidia-nvtx-cu12==12.8.90.* in /usr/local/lib/python3.13/dist-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==12.8.1; platform_system == \"Linux\"->torch->openai-whisper==20250625) (12.8.90)\n",
            "Requirement already satisfied: cuda-pathfinder~=1.1 in /usr/local/lib/python3.13/dist-packages (from cuda-bindings<13,>=12.9.4->torch->openai-whisper==20250625) (1.8.0)\n",
            "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.13/dist-packages (from sympy>=1.13.3->torch->openai-whisper==20250625) (1.3.0)\n",
            "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.13/dist-packages (from jinja2->torch->openai-whisper==20250625) (3.0.3)\n",
            "Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.13/dist-packages (from requests->tiktoken->openai-whisper==20250625) (3.4.9)\n",
            "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.13/dist-packages (from requests->tiktoken->openai-whisper==20250625) (3.19)\n",
            "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.13/dist-packages (from requests->tiktoken->openai-whisper==20250625) (2.5.0)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.13/dist-packages (from requests->tiktoken->openai-whisper==20250625) (2026.7.22)\n"
          ]
        }
      ],
      "source": [
        "!pip install git+https://github.com/openai/whisper.git\n",
        "\n",
        "import whisper"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ab9dc6c4",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "ce05220a-d4df-489a-9ca0-e478629cb7b8"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "기존 결과 파일을 삭제했습니다.\n"
          ]
        }
      ],
      "source": [
        "import os\n",
        "\n",
        "output_text_file = \"/content/drive/MyDrive/Colab Notebooks/total_transcriptions_kr.txt\"\n",
        "\n",
        "if os.path.exists(output_text_file):\n",
        "    os.remove(output_text_file)\n",
        "    print(\"기존 결과 파일을 삭제했습니다.\")\n",
        "else:\n",
        "    print(\"기존 결과 파일이 없습니다. 새로 생성합니다.\")\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "8a48b169"
      },
      "source": [
        "## Mp3ToText7kr — 한국어 MP3 → 한국어 텍스트\n",
        "\n",
        "- 원본 MP3: `Google Drive/Colab Notebooks/input_manual.mp3`\n",
        "- MP3를 10분 단위로 분할합니다.\n",
        "- Whisper `large` 모델로 한국어 음성을 한국어 텍스트로 전사합니다.\n",
        "- 결과 파일: `Google Drive/Colab Notebooks/total_transcriptions_kr.txt`\n",
        "- 기존 결과 파일은 재실행 시 삭제한 후 새로 생성합니다."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "yzR6aM4xO7bi",
        "outputId": "48b24954-ffa9-4fac-8ca9-a33496075e66"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "GPU 사용 가능: True\n",
            "모델이 이미 로드되어 있습니다.\n",
            "텍스트가 추가되었습니다: /content/drive/MyDrive/Colab Notebooks/total_transcriptions_kr.txt\n",
            "텍스트가 추가되었습니다: /content/drive/MyDrive/Colab Notebooks/total_transcriptions_kr.txt\n",
            "텍스트가 추가되었습니다: /content/drive/MyDrive/Colab Notebooks/total_transcriptions_kr.txt\n"
          ]
        }
      ],
      "source": [
        "import whisper\n",
        "import torch\n",
        "import glob  # ← 추가\n",
        "\n",
        "print(\"GPU 사용 가능:\", torch.cuda.is_available())\n",
        "\n",
        "# 모델이 이미 로드되어 있는지 확인\n",
        "if 'model' not in globals():  # 'model' 변수가 전역 범위에 없는 경우\n",
        "    device = \"cuda\" if torch.cuda.is_available() else \"cpu\" #GPT 추천\n",
        "    model_size = \"large\" if device == \"cuda\" else \"medium\"  #GPT 추천\n",
        "    model = whisper.load_model(model_size).to(device)\n",
        "    # model = whisper.load_model(\"large\")  이전버젼 주석처리\n",
        "else:\n",
        "    print(\"모델이 이미 로드되어 있습니다.\")\n",
        "\n",
        "def process_audio(input_path, output_text_file):\n",
        "    try:\n",
        "        if torch.cuda.is_available():\n",
        "           torch.cuda.empty_cache()\n",
        "\n",
        "        result = model.transcribe(\n",
        "            input_path,          # MP3 직접 전달\n",
        "            task=\"transcribe\",\n",
        "            language=\"ko\",\n",
        "            fp16=(device == \"cuda\")\n",
        "        )\n",
        "        segments = result[\"segments\"]\n",
        "\n",
        "        with open(output_text_file, \"a\", encoding=\"utf-8\") as text_file:\n",
        "            for seg in segments:\n",
        "                start = seg[\"start\"]\n",
        "                end = seg[\"end\"]\n",
        "                text = seg[\"text\"]\n",
        "                text_file.write(f\"[{start:.1f}s ~ {end:.1f}s] {text}\\n\")\n",
        "\n",
        "        print(f\"텍스트가 추가되었습니다: {output_text_file}\")\n",
        "\n",
        "    except Exception as e:\n",
        "        print(f\"Error: {str(e)}\")\n",
        "\n",
        "output_text_file = \"/content/drive/MyDrive/Colab Notebooks/total_transcriptions_kr.txt\"\n",
        "try:\n",
        "    mp3_files = sorted(glob.glob(f\"{voice_file_name}_output*.mp3\"))\n",
        "    for mp3_file in mp3_files:\n",
        "        process_audio(mp3_file, output_text_file)\n",
        "except NameError as e:\n",
        "    print(f\"Error: {str(e)} - 필요한 변수가 정의되지 않았습니다.\")\n",
        "except FileNotFoundError as e:\n",
        "    print(f\"Error: {str(e)} - 파일을 찾을 수 없습니다. 파일 경로를 확인하세요.\")\n",
        "except Exception as e:\n",
        "    print(f\"Error: {str(e)} - 예상치 못한 오류가 발생했습니다.\")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "5nPe0xeA3vm2"
      },
      "outputs": [],
      "source": []
    }
  ],
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "gpuType": "T4",
      "provenance": []
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}