{ "cells": [ { "cell_type": "markdown", "id": "6bdb36f6-b229-4e41-b32b-fb8fc00cbf97", "metadata": {}, "source": [ "# b. 使用大模型 API 对视频进行快速摘要(音频处理)- 精简版\n", "\n", "> 指导文章:[15. 用 API 实现 AI 视频摘要:动手制作属于你的 AI 视频助手](https://github.com/Hoper-J/AI-Guide-and-Demos-zh_CN/blob/master/Guide/15.%20用%20API%20实现%20AI%20视频摘要:动手制作属于你的%20AI%20视频助手.md)\n", "> \n", "\n", "这是精简的核心代码,非交互版,直接对应于文章内容,变量名相比于交互版会稍微修改,以更清晰的反映作用。\n", "\n", "![Pipeline](../Guide/assets/image-20240926154540268.png)\n", "\n", "你可以一键执行直接看到结果。\n", "\n", "如果你想在本地试试参数交互,访问:[a. 交互完整版](https://github.com/Hoper-J/AI-Guide-and-Demos-zh_CN/blob/master/Demos/13a.%20轻松开始你的第一次%20AI%20视频总结(API%20版)%20-%20完整版.ipynb)\n", "\n", "在线链接(精简版):[Kaggle](https://www.kaggle.com/code/aidemos/13b-ai-api) | [Colab](https://colab.research.google.com/drive/1uMMSKCoht1p3niW5NqUfi62hYCbe2yr-?usp=sharing)\n", "\n", "这里还有一个简单的 [🎡 AI Summarizer 脚本](https://github.com/Hoper-J/AI-Guide-and-Demos-zh_CN/blob/master/CodePlayground/summarizer.py)供你尝试。命令行执行:\n", "```bash\n", "python summarizer.py ./example_video.mp4\n", "```" ] }, { "cell_type": "markdown", "id": "418eee53-2d5b-407a-a9f4-c9604d51d561", "metadata": {}, "source": [ "## 第 1 部分 - 准备工作\n", "\n", "\n", "### 安装和导入" ] }, { "cell_type": "code", "execution_count": 1, "id": "7e8a3db1-98c2-492e-a07a-90484445bea1", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Looking in indexes: http://mirrors.aliyun.com/pypi/simple\n", "Requirement already satisfied: srt==3.5.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (3.5.3)\n", "Requirement already satisfied: datasets==4.0.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from datasets[audio]==4.0.0) (4.0.0)\n", "Requirement already satisfied: openai==2.32.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (2.32.0)\n", "Requirement already satisfied: openai-whisper==20250625 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (20250625)\n", "Requirement already satisfied: soundfile==0.13.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (0.13.1)\n", "Requirement already satisfied: ipywidgets==8.1.8 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (8.1.8)\n", "Requirement already satisfied: librosa==0.11.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (0.11.0)\n", "Requirement already satisfied: torchcodec==0.5 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (0.5)\n", "Requirement already satisfied: filelock in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from datasets==4.0.0->datasets[audio]==4.0.0) (3.29.0)\n", "Requirement already satisfied: numpy>=1.17 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from datasets==4.0.0->datasets[audio]==4.0.0) (2.2.6)\n", "Requirement already satisfied: pyarrow>=15.0.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from datasets==4.0.0->datasets[audio]==4.0.0) (23.0.1)\n", "Requirement already satisfied: dill<0.3.9,>=0.3.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from datasets==4.0.0->datasets[audio]==4.0.0) (0.3.8)\n", "Requirement already satisfied: pandas in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from datasets==4.0.0->datasets[audio]==4.0.0) (2.3.3)\n", "Requirement already satisfied: requests>=2.32.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from datasets==4.0.0->datasets[audio]==4.0.0) (2.33.1)\n", "Requirement already satisfied: tqdm>=4.66.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from datasets==4.0.0->datasets[audio]==4.0.0) (4.67.3)\n", "Requirement already satisfied: xxhash in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from datasets==4.0.0->datasets[audio]==4.0.0) (3.6.0)\n", "Requirement already satisfied: multiprocess<0.70.17 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from datasets==4.0.0->datasets[audio]==4.0.0) (0.70.16)\n", "Requirement already satisfied: fsspec<=2025.3.0,>=2023.1.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from fsspec[http]<=2025.3.0,>=2023.1.0->datasets==4.0.0->datasets[audio]==4.0.0) (2025.3.0)\n", "Requirement already satisfied: huggingface-hub>=0.24.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from datasets==4.0.0->datasets[audio]==4.0.0) (0.36.2)\n", "Requirement already satisfied: packaging in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from datasets==4.0.0->datasets[audio]==4.0.0) (26.1)\n", "Requirement already satisfied: pyyaml>=5.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from datasets==4.0.0->datasets[audio]==4.0.0) (6.0.3)\n", "Requirement already satisfied: anyio<5,>=3.5.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from openai==2.32.0) (4.13.0)\n", "Requirement already satisfied: distro<2,>=1.7.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from openai==2.32.0) (1.9.0)\n", "Requirement already satisfied: httpx<1,>=0.23.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from openai==2.32.0) (0.28.1)\n", "Requirement already satisfied: jiter<1,>=0.10.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from openai==2.32.0) (0.14.0)\n", "Requirement already satisfied: pydantic<3,>=1.9.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from openai==2.32.0) (2.12.3)\n", "Requirement already satisfied: sniffio in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from openai==2.32.0) (1.3.1)\n", "Requirement already satisfied: typing-extensions<5,>=4.11 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from openai==2.32.0) (4.15.0)\n", "Requirement already satisfied: more-itertools in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from openai-whisper==20250625) (11.0.2)\n", "Requirement already satisfied: numba in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from openai-whisper==20250625) (0.61.2)\n", "Requirement already satisfied: tiktoken in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from openai-whisper==20250625) (0.12.0)\n", "Requirement already satisfied: torch in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from openai-whisper==20250625) (2.7.1)\n", "Requirement already satisfied: triton>=2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from openai-whisper==20250625) (3.3.1)\n", "Requirement already satisfied: cffi>=1.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from soundfile==0.13.1) (2.0.0)\n", "Requirement already satisfied: comm>=0.1.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from ipywidgets==8.1.8) (0.2.3)\n", "Requirement already satisfied: ipython>=6.1.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from ipywidgets==8.1.8) (9.12.0)\n", "Requirement already satisfied: traitlets>=4.3.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from ipywidgets==8.1.8) (5.14.3)\n", "Requirement already satisfied: widgetsnbextension~=4.0.14 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from ipywidgets==8.1.8) (4.0.15)\n", "Requirement already satisfied: jupyterlab_widgets~=3.0.15 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from ipywidgets==8.1.8) (3.0.16)\n", "Requirement already satisfied: audioread>=2.1.9 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from librosa==0.11.0) (3.1.0)\n", "Requirement already satisfied: scipy>=1.6.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from librosa==0.11.0) (1.17.1)\n", "Requirement already satisfied: scikit-learn>=1.1.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from librosa==0.11.0) (1.8.0)\n", "Requirement already satisfied: joblib>=1.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from librosa==0.11.0) (1.5.3)\n", "Requirement already satisfied: decorator>=4.3.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from librosa==0.11.0) (5.2.1)\n", "Requirement already satisfied: pooch>=1.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from librosa==0.11.0) (1.9.0)\n", "Requirement already satisfied: soxr>=0.3.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from librosa==0.11.0) (1.0.0)\n", "Requirement already satisfied: lazy_loader>=0.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from librosa==0.11.0) (0.5)\n", "Requirement already satisfied: msgpack>=1.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from librosa==0.11.0) (1.1.2)\n", "Requirement already satisfied: idna>=2.8 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from anyio<5,>=3.5.0->openai==2.32.0) (3.11)\n", "Requirement already satisfied: aiohttp!=4.0.0a0,!=4.0.0a1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from fsspec[http]<=2025.3.0,>=2023.1.0->datasets==4.0.0->datasets[audio]==4.0.0) (3.13.5)\n", "Requirement already satisfied: certifi in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from httpx<1,>=0.23.0->openai==2.32.0) (2026.2.25)\n", "Requirement already satisfied: httpcore==1.* in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from httpx<1,>=0.23.0->openai==2.32.0) (1.0.9)\n", "Requirement already satisfied: h11>=0.16 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai==2.32.0) (0.16.0)\n", "Requirement already satisfied: annotated-types>=0.6.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from pydantic<3,>=1.9.0->openai==2.32.0) (0.7.0)\n", "Requirement already satisfied: pydantic-core==2.41.4 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from pydantic<3,>=1.9.0->openai==2.32.0) (2.41.4)\n", "Requirement already satisfied: typing-inspection>=0.4.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from pydantic<3,>=1.9.0->openai==2.32.0) (0.4.2)\n", "Requirement already satisfied: aiohappyeyeballs>=2.5.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets==4.0.0->datasets[audio]==4.0.0) (2.6.1)\n", "Requirement already satisfied: aiosignal>=1.4.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets==4.0.0->datasets[audio]==4.0.0) (1.4.0)\n", "Requirement already satisfied: attrs>=17.3.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets==4.0.0->datasets[audio]==4.0.0) (26.1.0)\n", "Requirement already satisfied: frozenlist>=1.1.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets==4.0.0->datasets[audio]==4.0.0) (1.8.0)\n", "Requirement already satisfied: multidict<7.0,>=4.5 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets==4.0.0->datasets[audio]==4.0.0) (6.7.1)\n", "Requirement already satisfied: propcache>=0.2.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets==4.0.0->datasets[audio]==4.0.0) (0.4.1)\n", "Requirement already satisfied: yarl<2.0,>=1.17.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets==4.0.0->datasets[audio]==4.0.0) (1.23.0)\n", "Requirement already satisfied: pycparser in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from cffi>=1.0->soundfile==0.13.1) (3.0)\n", "Requirement already satisfied: hf-xet<2.0.0,>=1.1.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from huggingface-hub>=0.24.0->datasets==4.0.0->datasets[audio]==4.0.0) (1.4.3)\n", "Requirement already satisfied: ipython-pygments-lexers>=1.0.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from ipython>=6.1.0->ipywidgets==8.1.8) (1.1.1)\n", "Requirement already satisfied: jedi>=0.18.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from ipython>=6.1.0->ipywidgets==8.1.8) (0.19.2)\n", "Requirement already satisfied: matplotlib-inline>=0.1.6 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from ipython>=6.1.0->ipywidgets==8.1.8) (0.2.1)\n", "Requirement already satisfied: pexpect>4.6 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from ipython>=6.1.0->ipywidgets==8.1.8) (4.9.0)\n", "Requirement already satisfied: prompt_toolkit<3.1.0,>=3.0.41 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from ipython>=6.1.0->ipywidgets==8.1.8) (3.0.52)\n", "Requirement already satisfied: pygments>=2.14.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from ipython>=6.1.0->ipywidgets==8.1.8) (2.20.0)\n", "Requirement already satisfied: stack_data>=0.6.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from ipython>=6.1.0->ipywidgets==8.1.8) (0.6.3)\n", "Requirement already satisfied: wcwidth in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from prompt_toolkit<3.1.0,>=3.0.41->ipython>=6.1.0->ipywidgets==8.1.8) (0.6.0)\n", "Requirement already satisfied: parso<0.9.0,>=0.8.4 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from jedi>=0.18.2->ipython>=6.1.0->ipywidgets==8.1.8) (0.8.6)\n", "Requirement already satisfied: llvmlite<0.45,>=0.44.0dev0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from numba->openai-whisper==20250625) (0.44.0)\n", "Requirement already satisfied: ptyprocess>=0.5 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from pexpect>4.6->ipython>=6.1.0->ipywidgets==8.1.8) (0.7.0)\n", "Requirement already satisfied: platformdirs>=2.5.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from pooch>=1.1->librosa==0.11.0) (4.9.6)\n", "Requirement already satisfied: charset_normalizer<4,>=2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from requests>=2.32.2->datasets==4.0.0->datasets[audio]==4.0.0) (3.4.7)\n", "Requirement already satisfied: urllib3<3,>=1.26 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from requests>=2.32.2->datasets==4.0.0->datasets[audio]==4.0.0) (2.6.3)\n", "Requirement already satisfied: threadpoolctl>=3.2.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from scikit-learn>=1.1.0->librosa==0.11.0) (3.6.0)\n", "Requirement already satisfied: executing>=1.2.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from stack_data>=0.6.0->ipython>=6.1.0->ipywidgets==8.1.8) (2.2.1)\n", "Requirement already satisfied: asttokens>=2.1.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from stack_data>=0.6.0->ipython>=6.1.0->ipywidgets==8.1.8) (3.0.1)\n", "Requirement already satisfied: pure-eval in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from stack_data>=0.6.0->ipython>=6.1.0->ipywidgets==8.1.8) (0.2.3)\n", "Requirement already satisfied: setuptools in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (79.0.1)\n", "Requirement already satisfied: sympy>=1.13.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (1.14.0)\n", "Requirement already satisfied: networkx in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (3.6.1)\n", "Requirement already satisfied: jinja2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (3.1.6)\n", "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.6.77 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (12.6.77)\n", "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.6.77 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (12.6.77)\n", "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.6.80 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (12.6.80)\n", "Requirement already satisfied: nvidia-cudnn-cu12==9.5.1.17 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (9.5.1.17)\n", "Requirement already satisfied: nvidia-cublas-cu12==12.6.4.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (12.6.4.1)\n", "Requirement already satisfied: nvidia-cufft-cu12==11.3.0.4 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (11.3.0.4)\n", "Requirement already satisfied: nvidia-curand-cu12==10.3.7.77 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (10.3.7.77)\n", "Requirement already satisfied: nvidia-cusolver-cu12==11.7.1.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (11.7.1.2)\n", "Requirement already satisfied: nvidia-cusparse-cu12==12.5.4.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (12.5.4.2)\n", "Requirement already satisfied: nvidia-cusparselt-cu12==0.6.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (0.6.3)\n", "Requirement already satisfied: nvidia-nccl-cu12==2.26.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (2.26.2)\n", "Requirement already satisfied: nvidia-nvtx-cu12==12.6.77 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (12.6.77)\n", "Requirement already satisfied: nvidia-nvjitlink-cu12==12.6.85 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (12.6.85)\n", "Requirement already satisfied: nvidia-cufile-cu12==1.11.1.6 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch->openai-whisper==20250625) (1.11.1.6)\n", "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from sympy>=1.13.3->torch->openai-whisper==20250625) (1.3.0)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from jinja2->torch->openai-whisper==20250625) (3.0.3)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from pandas->datasets==4.0.0->datasets[audio]==4.0.0) (2.9.0.post0)\n", "Requirement already satisfied: pytz>=2020.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from pandas->datasets==4.0.0->datasets[audio]==4.0.0) (2026.1.post1)\n", "Requirement already satisfied: tzdata>=2022.7 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from pandas->datasets==4.0.0->datasets[audio]==4.0.0) (2026.1)\n", "Requirement already satisfied: six>=1.5 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas->datasets==4.0.0->datasets[audio]==4.0.0) (1.17.0)\n", "Requirement already satisfied: regex>=2022.1.18 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from tiktoken->openai-whisper==20250625) (2026.4.4)\n", "Note: you may need to restart the kernel to use updated packages.\n", "Looking in indexes: http://mirrors.aliyun.com/pypi/simple\n", "Requirement already satisfied: OpenCC in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (1.3.1)\n", "Requirement already satisfied: openpyxl in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (3.1.5)\n", "Requirement already satisfied: et-xmlfile in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from openpyxl) (2.0.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install \\\n", " \"srt==3.5.3\" \\\n", " \"datasets[audio]==4.0.0\" \\\n", " \"openai==2.32.0\" \\\n", " \"openai-whisper==20250625\" \\\n", " \"soundfile==0.13.1\" \\\n", " \"ipywidgets==8.1.8\" \\\n", " \"librosa==0.11.0\" \\\n", " \"torchcodec==0.5\" # 注意,该库需要匹配torch版本进行安装:https://github.com/meta-pytorch/torchcodec#installing-torchcodec\n", "%pip install OpenCC openpyxl\n", "#%pip install 'httpx<0.28.0' # 降级 httpx 以解决关键字 'proxies' 被移除的问题,最新的 openai 库不会引发该问题,故默认注释" ] }, { "cell_type": "code", "execution_count": 2, "id": "04567cf9-0147-43af-ae37-5ee5df721b37", "metadata": {}, "outputs": [], "source": [ "# 标准库\n", "import os\n", "# 设置模型下载镜像,用于非本地数据集\n", "os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\n", "import time\n", "import re\n", "import pathlib\n", "import textwrap\n", "import datetime\n", "\n", "# 第三方库\n", "import numpy as np\n", "import srt\n", "import soundfile as sf\n", "from tqdm import tqdm\n", "\n", "# 项目相关库\n", "import whisper\n", "from datasets import load_dataset\n", "from openai import OpenAI" ] }, { "cell_type": "markdown", "id": "212aab92-ac84-4d28-b56d-37440efbe094", "metadata": {}, "source": [ "### 下载数据\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "7c073e30-3421-48d5-bd4e-f1aae59298b7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "现在我们将转录音频: 李琳山教授 信号与人生 (2023) (NTU-GenAI-2024-HW9.mp3)。\n" ] } ], "source": [ "# 加载数据集\n", "# dataset_name = \"kuanhuggingface/NTU-GenAI-2024-HW9\"\n", "# dataset = load_dataset(dataset_name)\n", "\n", "# 加载本地 Parquet 格式的数据集\n", "dataset = load_dataset('parquet', data_files={'test': './data/13/test-00000-of-00001.parquet'})\n", "\n", "# 准备音频\n", "input_audio = dataset[\"test\"][0][\"audio\"]\n", "input_audio_name = dataset[\"test\"][0][\"file\"]\n", "samples = input_audio.get_all_samples()\n", "input_audio_array = samples.data.numpy().mean(axis=0).astype(np.float32)\n", "sampling_rate = samples.sample_rate\n", "\n", "print(f\"现在我们将转录音频: 李琳山教授 信号与人生 (2023) ({input_audio_name})。\")" ] }, { "cell_type": "markdown", "id": "9a0fa7c4-f197-4641-bdea-54ef2a934e1f", "metadata": {}, "source": [ "#### 直接加载 .mp3 文件(和上面二选一)\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "5af8de20-6746-494a-ba6e-8087da1fe6ff", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "采样率: 16000\n", "音频数据形状: (16720000,)\n", "现在我们将转录音频: 李琳山教授 信号与人生 (2023) (audio.mp3)。\n" ] } ], "source": [ "import librosa\n", "\n", "# 指定音频文件路径\n", "mp3_file_path = './data/13/audio.mp3'\n", "\n", "input_audio_name = os.path.basename(mp3_file_path)\n", "\n", "# 加载音频文件,指定采样率为 16000\n", "input_audio_array, sampling_rate = librosa.load(mp3_file_path, sr=16000)\n", "\n", "# 打印音频数据的采样率和形状,确保加载成功\n", "print(f\"采样率: {sampling_rate}\")\n", "print(f\"音频数据形状: {input_audio_array.shape}\")\n", "\n", "print(f\"现在我们将转录音频: 李琳山教授 信号与人生 (2023) ({input_audio_name})。\")" ] }, { "cell_type": "markdown", "id": "693fc7e4-316d-48a1-8bdc-8e8a0e55b5b4", "metadata": {}, "source": [ "## 第 2 部分 - 自动语音识别 (ASR)\n", "\n", "我们将使用 OpenAI 的 Whisper 模型将音频转换为字幕。\n", "\n", "下图是处理的样例过程,对应于之后所使用的音频:\n", "\n", "![image-20240926155512340](../Guide/assets/image-20240926155512340.png)\n", "\n", "### 定义语音识别函数" ] }, { "cell_type": "code", "execution_count": 5, "id": "522d3863-ce0d-4304-aa89-307b2c46d556", "metadata": {}, "outputs": [], "source": [ "def speech_recognition(model_name, input_audio, output_subtitle_path, decode_options, cache_dir=\"./\"):\n", " # 加载模型\n", " model = whisper.load_model(name=model_name, download_root=cache_dir)\n", "\n", " # 转录音频\n", " transcription = model.transcribe(\n", " audio=input_audio,\n", " language=decode_options[\"language\"],\n", " verbose=False,\n", " initial_prompt=decode_options[\"initial_prompt\"],\n", " temperature=decode_options[\"temperature\"]\n", " )\n", "\n", " # 处理转录结果,生成字幕文件\n", " subtitles = []\n", " for i, segment in enumerate(transcription[\"segments\"]):\n", " start_time = datetime.timedelta(seconds=segment[\"start\"])\n", " end_time = datetime.timedelta(seconds=segment[\"end\"])\n", " text = segment[\"text\"]\n", " subtitles.append(srt.Subtitle(index=i, start=start_time, end=end_time, content=text))\n", "\n", " srt_content = srt.compose(subtitles)\n", "\n", " # 保存字幕文件\n", " with open(output_subtitle_path, \"w\", encoding=\"utf-8\") as file:\n", " file.write(srt_content)\n", "\n", " print(f\"字幕已保存到 {output_subtitle_path}\")" ] }, { "cell_type": "markdown", "id": "0353e6dd-e80c-45d9-b162-80a53fbc9a59", "metadata": {}, "source": [ "### 设置参数\n", "\n", "注意,这里设置的参数都是 Whisper 相关的,与后续的 AI 摘要不同。\n", "\n", "你可以通过 model_name 设置不同的模型,使用**标识**指定。通过[官方仓库](https://github.com/openai/whisper)所提供的数据,我们可以看到不同模型需要的显存大小:\n", "\n", "| Size | Parameters | English-only model | Multilingual model | Required VRAM | Relative speed |\n", "| ------ | ---------- | ------------------ | ------------------ | ------------- | -------------- |\n", "| tiny | 39 M | `tiny.en` | `tiny` | ~1 GB | ~32x |\n", "| base | 74 M | `base.en` | `base` | ~1 GB | ~16x |\n", "| small | 244 M | `small.en` | `small` | ~2 GB | ~6x |\n", "| medium | 769 M | `medium.en` | `medium` | ~5 GB | ~2x |\n", "| large | 1550 M | N/A | `large` | ~10 GB | 1x |\n", "\n", "**解释:**\n", "\n", "- **Size (大小)**:表示模型的尺寸,不同大小的模型训练时使用的数据量不同,因此性能和精度也不同。较大的模型通常会有更高的精度。`Medium` 是个不错的选择,`tiny` 和 `base` 效果一般,用于学习的话也可以。\n", "- **Parameters (参数量)**:模型的参数数量,表示模型的复杂度。参数越多,模型的性能通常越好,但也会占用更多的计算资源。\n", "- **English-only model (仅限英文模型)**:模型的**标识**名称,只用于处理英文音频转录,适用于仅需要处理英文语音的场景。\n", "- **Multilingual model (多语言模型)**:模型的**标识**名称,用于在代码中加载相应的模型,对应于接下来的 `model_name` 参数。\n", "- **Required VRAM (所需显存)**:指运行该模型时所需的显存大小。如果你对参数和显存的对应关系感兴趣,可以阅读之前的文章:[《07. 探究模型参数与显存的关系以及不同精度造成的影响.md》](https://github.com/Hoper-J/AI-Guide-and-Demos-zh_CN/blob/master/Guide/07.%20探究模型参数与显存的关系以及不同精度造成的影响.md)。\n", "- **Relative speed (相对速度)**:相对速度表示模型处理语音转录任务的效率。数字越大,模型处理速度越快,与模型的参数量成反比。" ] }, { "cell_type": "code", "execution_count": 6, "id": "aac5b7aa-1f0a-4a53-90a3-250b13ea51d7", "metadata": {}, "outputs": [], "source": [ "# 模型名称,可选 'tiny', 'base', 'small', 'medium', 'large-v3'\n", "model_name = 'medium'\n", "\n", "# 语言\n", "language = 'zh' # 选择语音识别的目标语言,如 'zh' 表示中文\n", "\n", "# 初始 prompt,可选\n", "initial_prompt = '请用中文' # 如果需要,可以为 Whisper 模型设置初始 prompt 语句\n", "\n", "# 采样温度,控制模型的输出多样性\n", "temperature = 0.0 # 0 表示最确定性的输出,范围为 0-1\n", "\n", "# 输出文件后缀\n", "suffix = '信号与人生'\n", "\n", "# 字幕文件路径\n", "output_subtitle_path = f\"./output-{suffix}.srt\"\n", "\n", "# 模型缓存目录\n", "cache_dir = './'" ] }, { "cell_type": "markdown", "id": "f04e8038-ba29-4818-b6ed-213bd8cc5b49", "metadata": {}, "source": [ "### 运行语音识别\n" ] }, { "cell_type": "code", "execution_count": 7, "id": "769eea63-59a1-4f7d-a9dd-e01e876543ec", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 104500/104500 [01:42<00:00, 1018.23frames/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "字幕已保存到 ./output-信号与人生.srt\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "# 构建解码选项\n", "decode_options = {\n", " \"language\": language,\n", " \"initial_prompt\": initial_prompt,\n", " \"temperature\": temperature\n", "}\n", "\n", "# 运行 ASR\n", "speech_recognition(\n", " model_name=model_name,\n", " input_audio=input_audio_array,\n", " output_subtitle_path=output_subtitle_path,\n", " decode_options=decode_options,\n", " cache_dir=cache_dir\n", ")" ] }, { "cell_type": "markdown", "id": "1fc7ce55-820e-4b63-a6dd-a8413f1dd55e", "metadata": {}, "source": [ "### 检查结果\n" ] }, { "cell_type": "code", "execution_count": 8, "id": "3d884844-13a7-4e70-acda-6bd242e571bc", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "00:00:00,000 --> 00:00:04,000\n", "每次说学问是做出来的\n", "\n", "2\n", "00:00:06,000 --> 00:00:08,000\n", "什么意思?\n", "\n", "3\n", "00:00:08,000 --> 00:00:12,000\n", "要做才会获得学问\n", "\n", "4\n", "00:00:13,000 --> 00:00:16,000\n", "你如果每天光是坐在那里听\n", "\n", "5\n", "00:00:17,000 --> 00:00:20,000\n", "学问很可能是左耳进右耳出的\n", "\n", "6\n", "00:00:21,000 --> 00:00:23,000\n", "你光是坐在那儿读\n", "\n", "7\n", "00:00:23,000 --> 00:00:26,000\n", "学问可能从眼睛进入脑海之后就忘掉了\n", "\n", "8\n", "00:00:26,000 --> 00:00:29,000\n", "如何能够学问在脑海里面\n", "\n", "9\n", "00:00:31,000 --> 00:00:33,000\n", "真的变成你自己学问\n", "\n", "10\n", "00:00:33,000 --> 00:00:35,000\n", "就是要做\n", "\n", "11\n", "00:00:36,000 --> 00:00:39,000\n", "可能有很多同学有这个经验\n", "\n", "12\n", "00:00:39,000 --> 00:00:41,000\n", "你如果去修某一门课\n", "\n", "13\n", "00:00:41,000 --> 00:00:44,000\n", "或者做某一个实验\n", "\n", "14\n", "00:00:44,000 --> 00:00:47,000\n", "在期末就是要教一个final project\n", "\n", "15\n", "00:00:48,000 --> 00:00:50,000\n", "那个final project就是要你把\n", "\n", "16\n", "00:00:51,000 --> 00:00:53,000\n", "学到的很多东西\n", "\n", "17\n", "00:00:53,000 --> 00:00:56,000\n", "最后整合在你的final project里面\n", "\n", "18\n", "00:00:56,000 --> 00:00:58,000\n", "最后做出来的时候\n", "\n", "19\n", "00:00:58,000 --> 00:01:00,000\n", "就是把它们都整合了\n", "\n", "20\n", "00:01:00,000 --> 00:01:02,000\n", "当你学期结束\n", "\n", "21\n", "00:01:02,000 --> 00:01:04,000\n", "真的把final project做完的时候\n", "\n", "22\n", "00:01:04,000 --> 00:01:05,000\n", "你会忽然发现\n", "\n", "23\n", "00:01:05,000 --> 00:01:07,000\n", "我真的学到很多东西\n", "\n", "24\n", "00:01:07,000 --> 00:01:10,000\n", "那就是做出来的学问\n", "\n", "25\n", "00:01:10,000 --> 00:01:12,000\n", "也许有\n", "\n", "26\n", "00:01:12,000 --> 00:01:13,000\n", "可以举另外一个例子\n", "\n", "27\n", "00:01:13,000 --> 00:01:14,000\n", "就是你如果学了\n", "\n", "28\n", "00:01:14,000 --> 00:01:17,000\n", "某一些很复杂的演算法或者什么\n", "\n", "29\n", "00:01:17,000 --> 00:01:21,000\n", "好像觉得那些不见得在你的脑海里\n", "\n", "30\n", "00:01:21,000 --> 00:01:24,000\n", "可是后来老师出了个习题\n", "\n", "31\n", "00:01:24,000 --> 00:01:26,000\n", "那个习题叫你写一个很大的程式\n", "\n", "32\n", "00:01:26,000 --> 00:01:28,000\n", "要把所有东西都包进去\n", "\n", "33\n", "00:01:28,000 --> 00:01:32,000\n", "当你把这个程式写完的时候你会发现\n", "\n", "34\n", "00:01:32,000 --> 00:01:35,000\n", "你忽然把演算法你所有东西都弄通了\n", "\n", "35\n", "00:01:35,000 --> 00:01:38,000\n", "那就是学问是做出来的\n", "\n", "36\n", "00:01:38,000 --> 00:01:40,000\n", "所以我们永远要记得\n", "\n", "37\n", "00:01:40,000 --> 00:01:44,000\n", "尽量多动手多做\n", "\n", "38\n", "00:01:44,000 --> 00:01:46,000\n", "在动手跟做的过程之中\n", "\n", "39\n", "00:01:46,000 --> 00:01:50,000\n", "学问才可以变成是自己的\n", "\n", "40\n", "00:01:50,000 --> 00:01:52,000\n", "同样的情形就是说\n", "\n", "41\n", "00:01:52,000 --> 00:01:55,000\n", "很多时候这样动手或者做的\n", "\n", "42\n", "00:01:55,000 --> 00:01:58,000\n", "表现或者成绩\n", "\n", "43\n", "00:01:58,000 --> 00:02:01,000\n", "没有一个成绩单上的数字\n", "\n", "44\n", "00:02:01,000 --> 00:02:04,000\n", "使得很多人觉得那不重要\n", "\n", "45\n", "00:02:04,000 --> 00:02:06,000\n", "很多人甚至觉得\n", "\n", "46\n", "00:02:06,000 --> 00:02:08,000\n", "这门课要做final project\n", "\n", "47\n", "00:02:08,000 --> 00:02:09,000\n", "我就不修了太累了\n", "\n", "48\n", "00:02:09,000 --> 00:02:11,000\n", "或者说那门课需要\n", "\n", "49\n", "00:02:11,000 --> 00:02:14,000\n", "怎么样怎么样太累我就不要做了\n", "\n", "50\n", "00:02:14,000 --> 00:02:15,000\n", "而不知道\n", "\n", "51\n", "00:02:15,000 --> 00:02:18,000\n", "其实那个才是让你做的机会\n", "\n", "52\n", "00:02:18,000 --> 00:02:20,000\n", "然后可以学到最多\n", "\n", "53\n", "00:02:20,000 --> 00:02:23,000\n", "也就是说虽然很可能\n", "\n", "54\n", "00:02:23,000 --> 00:02:26,000\n", "那么辛苦的做很多事\n", "\n", "55\n", "00:02:26,000 --> 00:02:29,000\n", "没有让你获得什么具体成绩\n", "\n", "56\n", "00:02:29,000 --> 00:02:31,000\n", "对你的overfitting可能没有帮助\n", "\n", "57\n", "00:02:31,000 --> 00:02:34,000\n", "可是对你的全面学习是很有帮助\n", "\n", "58\n", "00:02:34,000 --> 00:02:36,000\n", "是该学的\n", "\n", "59\n", "00:02:36,000 --> 00:02:39,000\n", "不要漏掉这些事\n", "\n", "60\n", "00:02:39,000 --> 00:02:42,000\n", "这是我所说的\n", "\n", "61\n", "00:02:42,000 --> 00:02:47,000\n", "这个课业内可以做的这些事\n", "\n", "62\n", "00:02:47,000 --> 00:02:50,000\n", "刚才我们讲到思考的时候\n", "\n", "63\n", "00:02:50,000 --> 00:02:53,000\n", "我觉得我漏掉一点\n", "\n", "64\n", "00:02:53,000 --> 00:02:55,000\n", "你如果修我的信号课\n", "\n", "65\n", "00:02:55,000 --> 00:02:57,000\n", "你可能会发现\n", "\n", "66\n", "00:02:57,000 --> 00:03:00,000\n", "我上课没讲到一个数学式子的时候\n", "\n", "67\n", "00:03:00,000 --> 00:03:02,000\n", "我通常都不推他的\n", "\n", "68\n", "00:03:02,000 --> 00:03:07,000\n", "我是在解释那个数学式子在说什么话\n", "\n", "69\n", "00:03:07,000 --> 00:03:10,000\n", "同样的没讲到一个什么事情的时候\n", "\n", "70\n", "00:03:10,000 --> 00:03:13,000\n", "我通常就在解释他在说什么话\n", "\n", "71\n", "00:03:13,000 --> 00:03:17,000\n", "也就是说我在讲的就是\n", "\n", "72\n", "00:03:17,000 --> 00:03:20,000\n", "我读到课本那里的时候\n", "\n", "73\n", "00:03:20,000 --> 00:03:22,000\n", "我心里怎么想的\n", "\n", "74\n", "00:03:22,000 --> 00:03:25,000\n", "也就是我在告诉同学如何\n", "\n", "75\n", "00:03:25,000 --> 00:03:28,000\n", "这个读书的时候\n", "\n", "76\n", "00:03:28,000 --> 00:03:31,000\n", "如何一面读一面练习思考\n", "\n", "77\n", "00:03:31,000 --> 00:03:35,000\n", "这个才是最重要的一件事\n", "\n", "78\n", "00:03:35,000 --> 00:03:40,000\n", "如何培养自己思考的能力\n", "\n", "79\n", "00:03:40,000 --> 00:03:42,000\n", "跟培养思考的习惯\n", "\n", "80\n", "00:03:42,000 --> 00:03:45,000\n", "我觉得最好的办法就是\n", "\n", "81\n", "00:03:45,000 --> 00:03:49,000\n", "读书的时候凡是读到一个数学式子\n", "\n", "82\n", "00:03:49,000 --> 00:03:50,000\n", "都去想一想\n", "\n", "83\n", "00:03:50,000 --> 00:03:53,000\n", "那个数学式子到底在说什么\n", "\n", "84\n", "00:03:53,000 --> 00:03:56,000\n", "凡是读到课本上讲什么\n", "\n", "85\n", "00:03:56,000 --> 00:03:57,000\n", "就去想一想\n", "\n", "86\n", "00:03:57,000 --> 00:03:59,000\n", "那个到底在说什么\n", "\n", "87\n", "00:03:59,000 --> 00:04:02,000\n", "你要真的了解他在说什么的时候\n", "\n", "88\n", "00:04:02,000 --> 00:04:03,000\n", "你说什么时候\n", "\n", "89\n", "00:04:03,000 --> 00:04:06,000\n", "你就用了很多思考的功夫\n", "\n", "90\n", "00:04:06,000 --> 00:04:10,000\n", "你就在练习自己思考的能力了\n", "\n", "91\n", "00:04:10,000 --> 00:04:11,000\n", "好\n", "\n", "92\n", "00:04:11,000 --> 00:04:15,000\n", "以上说的是课业内的部分\n", "\n", "93\n", "00:04:15,000 --> 00:04:18,000\n", "那当然除了课业内之外\n", "\n", "94\n", "00:04:18,000 --> 00:04:22,000\n", "还有一大堆是不在课业内的\n", "\n", "95\n", "00:04:22,000 --> 00:04:25,000\n", "那就是课业外的\n", "\n", "96\n", "00:04:25,000 --> 00:04:28,000\n", "课业外也有很多式的\n", "\n", "97\n", "00:04:28,000 --> 00:04:31,000\n", "我们可以\n", "\n", "98\n", "00:04:31,000 --> 00:04:34,000\n", "举例来说\n", "\n", "99\n", "00:04:38,000 --> 00:04:41,000\n", "课业外有什么可以学习的\n", "\n", "100\n", "00:04:41,000 --> 00:04:45,000\n", "那我通常把学习定义成为\n", "\n", "101\n", "00:04:45,000 --> 00:04:46,000\n", "什么是学习\n", "\n", "102\n", "00:04:46,000 --> 00:04:50,000\n", "学习就是一种增长\n", "\n", "103\n", "00:04:53,000 --> 00:04:56,000\n", "一种进步\n", "\n", "104\n", "00:04:56,000 --> 00:05:00,000\n", "然后获得快乐\n", "\n", "105\n", "00:05:00,000 --> 00:05:03,000\n", "这就是学习\n", "\n", "106\n", "00:05:03,000 --> 00:05:07,000\n", "所以即使是课业外的任何事情\n", "\n", "107\n", "00:05:07,000 --> 00:05:09,000\n", "只要你觉得是有增长的\n", "\n", "108\n", "00:05:09,000 --> 00:05:10,000\n", "是有进步的\n", "\n", "109\n", "00:05:10,000 --> 00:05:12,000\n", "让你觉得快乐的\n", "\n", "110\n", "00:05:12,000 --> 00:05:16,000\n", "那应该就是值得学习的地方\n", "\n", "111\n", "00:05:16,000 --> 00:05:19,000\n", "那我们可以举很多例子\n", "\n", "112\n", "00:05:19,000 --> 00:05:21,000\n", "那譬如说\n", "\n", "113\n", "00:05:21,000 --> 00:05:23,000\n", "很多同学喜欢打球\n", "\n", "114\n", "00:05:23,000 --> 00:05:26,000\n", "打球是不是学习\n", "\n", "115\n", "00:05:26,000 --> 00:05:27,000\n", "当然是\n", "\n", "116\n", "00:05:27,000 --> 00:05:29,000\n", "在打球中间有没有增长\n", "\n", "117\n", "00:05:29,000 --> 00:05:31,000\n", "当然有增长\n", "\n", "118\n", "00:05:31,000 --> 00:05:34,000\n", "打球不只是对健康有增长\n", "\n", "119\n", "00:05:34,000 --> 00:05:36,000\n", "而且可能对于\n", "\n", "120\n", "00:05:36,000 --> 00:05:38,000\n", "譬如说手脑协调\n", "\n", "121\n", "00:05:38,000 --> 00:05:40,000\n", "譬如说团队精神\n", "\n", "122\n", "00:05:40,000 --> 00:05:43,000\n", "譬如说这个个人之间的互动\n", "\n", "123\n", "00:05:43,000 --> 00:05:45,000\n", "可能都有帮助\n", "\n", "124\n", "00:05:45,000 --> 00:05:47,000\n", "所以打球当然是有增长的\n", "\n", "125\n", "00:05:47,000 --> 00:05:50,000\n", "那当然是很好的学习的机会\n", "\n", "126\n", "00:05:50,000 --> 00:05:52,000\n", "有人喜欢爬山\n", "\n", "127\n", "00:05:52,000 --> 00:05:54,000\n", "爬山是不是好的学习机会\n", "\n", "128\n", "00:05:54,000 --> 00:05:55,000\n", "当然是\n", "\n", "129\n", "00:05:55,000 --> 00:05:57,000\n", "这个我以前两年前就讲过很多\n", "\n", "130\n", "00:05:57,000 --> 00:05:59,000\n", "爬山可以学到很多的\n", "\n", "131\n", "00:05:59,000 --> 00:06:02,000\n", "那爬山当然是一种学习\n", "\n", "132\n", "00:06:02,000 --> 00:06:04,000\n", "有人说我不喜欢爬山\n", "\n", "133\n", "00:06:04,000 --> 00:06:05,000\n", "我去旅行好不好\n", "\n", "134\n", "00:06:05,000 --> 00:06:07,000\n", "旅行当然好\n", "\n", "135\n", "00:06:07,000 --> 00:06:09,000\n", "旅行可以增长建设\n", "\n", "136\n", "00:06:09,000 --> 00:06:11,000\n", "可以扩增事业\n", "\n", "137\n", "00:06:11,000 --> 00:06:13,000\n", "可以增加很多很多\n", "\n", "138\n", "00:06:13,000 --> 00:06:14,000\n", "当然是有进步的\n", "\n", "139\n", "00:06:14,000 --> 00:06:16,000\n", "所以当然是很好的学习\n", "\n", "140\n", "00:06:16,000 --> 00:06:18,000\n", "你凡是获得快乐\n", "\n", "141\n", "00:06:18,000 --> 00:06:20,000\n", "都是很好的事\n", "\n", "142\n", "00:06:20,000 --> 00:06:23,000\n", "那这些都值得下功夫去\n", "\n", "143\n", "00:06:23,000 --> 00:06:25,000\n", "把它看成是学习\n", "\n", "144\n", "00:06:25,000 --> 00:06:27,000\n", "都值得下功夫去做的\n", "\n", "145\n", "00:06:27,000 --> 00:06:29,000\n", "我们再讲另外一系列\n", "\n", "146\n", "00:06:29,000 --> 00:06:30,000\n", "譬如说\n", "\n", "147\n", "00:06:30,000 --> 00:06:34,000\n", "有人说谈恋爱是不是学习\n", "\n", "148\n", "00:06:34,000 --> 00:06:37,000\n", "谈恋爱除了你在谈恋爱上\n", "\n", "149\n", "00:06:37,000 --> 00:06:39,000\n", "会有收获以外\n", "\n", "150\n", "00:06:39,000 --> 00:06:41,000\n", "本身也是有收获的\n", "\n", "151\n", "00:06:41,000 --> 00:06:44,000\n", "因为让你体验到人跟人之间\n", "\n", "152\n", "00:06:44,000 --> 00:06:45,000\n", "的各种感觉\n", "\n", "153\n", "00:06:45,000 --> 00:06:48,000\n", "人跟人之间的各种期待等等\n", "\n", "154\n", "00:06:48,000 --> 00:06:50,000\n", "有没有帮助\n", "\n", "155\n", "00:06:50,000 --> 00:06:51,000\n", "当然有帮助\n", "\n", "156\n", "00:06:51,000 --> 00:06:53,000\n", "有帮助对每一个人\n", "\n", "157\n", "00:06:53,000 --> 00:06:54,000\n", "都是很好的学习\n", "\n", "158\n", "00:06:54,000 --> 00:06:57,000\n", "所以谈恋爱当然是一件很好的事\n", "\n", "159\n", "00:06:57,000 --> 00:06:59,000\n", "那有人会说\n", "\n", "160\n", "00:06:59,000 --> 00:07:01,000\n", "那要靠缘分\n", "\n", "161\n", "00:07:01,000 --> 00:07:02,000\n", "没有缘分没有办法\n", "\n", "162\n", "00:07:02,000 --> 00:07:03,000\n", "对不对\n", "\n", "163\n", "00:07:03,000 --> 00:07:04,000\n", "对\n", "\n", "164\n", "00:07:04,000 --> 00:07:06,000\n", "但是你不是一定要谈恋爱吗\n", "\n", "165\n", "00:07:06,000 --> 00:07:07,000\n", "你可以交朋友\n", "\n", "166\n", "00:07:07,000 --> 00:07:10,000\n", "交朋友是不是学习\n", "\n", "167\n", "00:07:10,000 --> 00:07:11,000\n", "当然是\n", "\n", "168\n", "00:07:11,000 --> 00:07:13,000\n", "交朋友也一样\n", "\n", "169\n", "00:07:13,000 --> 00:07:16,000\n", "让我们学到很多人际的互动\n", "\n", "170\n", "00:07:16,000 --> 00:07:20,000\n", "学到很多人跟人之间的沟通\n", "\n", "171\n", "00:07:20,000 --> 00:07:21,000\n", "人跟人之间的期待\n", "\n", "172\n", "00:07:21,000 --> 00:07:23,000\n", "人跟人之间的感觉\n", "\n", "173\n", "00:07:23,000 --> 00:07:26,000\n", "这都是交朋友之后学到的\n", "\n", "174\n", "00:07:26,000 --> 00:07:28,000\n", "对我们电机系的同学而言\n", "\n", "175\n", "00:07:28,000 --> 00:07:30,000\n", "你四周有一大群好同学\n", "\n", "176\n", "00:07:30,000 --> 00:07:33,000\n", "都是很好的交朋友的对象\n", "\n", "177\n", "00:07:33,000 --> 00:07:36,000\n", "你下一番功夫交朋友好不好\n", "\n", "178\n", "00:07:36,000 --> 00:07:37,000\n", "好\n", "\n", "179\n", "00:07:37,000 --> 00:07:40,000\n", "当然是有帮助的\n", "\n", "180\n", "00:07:40,000 --> 00:07:42,000\n", "另外当然我们可以举很多\n", "\n", "181\n", "00:07:42,000 --> 00:07:44,000\n", "我们最现成的例子\n", "\n", "182\n", "00:07:44,000 --> 00:07:47,000\n", "譬如说我们的戏学会办各种活动\n", "\n", "183\n", "00:07:47,000 --> 00:07:49,000\n", "那些活动有没有帮助\n", "\n", "184\n", "00:07:49,000 --> 00:07:50,000\n", "当然有\n", "\n", "185\n", "00:07:50,000 --> 00:07:54,000\n", "那我们举例来讲电乐\n", "\n", "186\n", "00:07:54,000 --> 00:07:56,000\n", "你如果去参加某一个舞\n", "\n", "187\n", "00:07:56,000 --> 00:07:57,000\n", "跳个舞\n", "\n", "188\n", "00:07:57,000 --> 00:08:00,000\n", "或者参加某个剧演个剧\n", "\n", "189\n", "00:08:00,000 --> 00:08:01,000\n", "有没有帮助\n", "\n", "190\n", "00:08:01,000 --> 00:08:02,000\n", "当然有帮助\n", "\n", "191\n", "00:08:02,000 --> 00:08:05,000\n", "你在这中间一定发现有所增长\n", "\n", "192\n", "00:08:05,000 --> 00:08:06,000\n", "有所进步\n", "\n", "193\n", "00:08:06,000 --> 00:08:09,000\n", "那是为什么有那么多同学要去参加\n", "\n", "194\n", "00:08:09,000 --> 00:08:13,000\n", "就是因为发现那个确实是有增长有进步\n", "\n", "195\n", "00:08:13,000 --> 00:08:15,000\n", "那有的人说\n", "\n", "196\n", "00:08:15,000 --> 00:08:20,000\n", "我不去跳那个舞或者演那个剧\n", "\n", "197\n", "00:08:20,000 --> 00:08:22,000\n", "我做幕后的\n", "\n", "198\n", "00:08:22,000 --> 00:08:25,000\n", "譬如说是幕后的什么什么规划\n", "\n", "199\n", "00:08:25,000 --> 00:08:29,000\n", "或者说是什么这个光舞的什么软体组\n", "\n", "200\n", "00:08:29,000 --> 00:08:32,000\n", "还是什么这个服装道具组\n", "\n", "201\n", "00:08:32,000 --> 00:08:33,000\n", "一样啊\n", "\n", "202\n", "00:08:33,000 --> 00:08:36,000\n", "那个都是可以有获得很多的增长\n", "\n", "203\n", "00:08:36,000 --> 00:08:37,000\n", "很多进步的\n", "\n", "204\n", "00:08:37,000 --> 00:08:39,000\n", "当然都是很有用的\n", "\n", "205\n", "00:08:39,000 --> 00:08:42,000\n", "都是很好的学习\n", "\n", "206\n", "00:08:42,000 --> 00:08:47,000\n", "那当然也包括电业以外的戏学会\n", "\n", "207\n", "00:08:47,000 --> 00:08:50,000\n", "其他的各种活动都一样\n", "\n", "208\n", "00:08:50,000 --> 00:08:56,000\n", "也包括电机系以外的其他的校内或者\n", "\n", "209\n", "00:08:56,000 --> 00:08:59,000\n", "校外的各种活动几乎都一样\n", "\n", "210\n", "00:08:59,000 --> 00:09:02,000\n", "都可以让人有所增长有所进步\n", "\n", "211\n", "00:09:02,000 --> 00:09:04,000\n", "都是很好的学习的机会\n", "\n", "212\n", "00:09:04,000 --> 00:09:06,000\n", "都是很好的学习\n", "\n", "213\n", "00:09:06,000 --> 00:09:10,000\n", "同样的问题是这些东西都没有考试\n", "\n", "214\n", "00:09:10,000 --> 00:09:14,000\n", "没有成绩不能显示在成绩单上\n", "\n", "215\n", "00:09:14,000 --> 00:09:18,000\n", "因此对有一些同学会认为那个浪费时间\n", "\n", "216\n", "00:09:18,000 --> 00:09:20,000\n", "我不需要花时间去做那个\n", "\n", "217\n", "00:09:20,000 --> 00:09:22,000\n", "因为不影响我的\n", "\n", "218\n", "00:09:22,000 --> 00:09:24,000\n", "overfitting的目标\n", "\n", "219\n", "00:09:24,000 --> 00:09:26,000\n", "里面没有这个嘛\n", "\n", "220\n", "00:09:26,000 --> 00:09:28,000\n", "具体成绩没有这些嘛\n", "\n", "221\n", "00:09:28,000 --> 00:09:30,000\n", "那不要这样想\n", "\n", "222\n", "00:09:30,000 --> 00:09:33,000\n", "因为那些都非常的重要\n", "\n", "223\n", "00:09:33,000 --> 00:09:36,000\n", "都对你发展非常的重要\n", "\n", "224\n", "00:09:36,000 --> 00:09:39,000\n", "那我们说电机工程\n", "\n", "225\n", "00:09:39,000 --> 00:09:42,000\n", "今天的电机工程很少什么事情\n", "\n", "226\n", "00:09:42,000 --> 00:09:44,000\n", "自己一个人可以做成功的\n", "\n", "227\n", "00:09:44,000 --> 00:09:47,000\n", "你必须跟很多人一起\n", "\n", "228\n", "00:09:47,000 --> 00:09:50,000\n", "才可能做成功一个非常重要的\n", "\n", "229\n", "00:09:50,000 --> 00:09:52,000\n", "有意义的工作\n", "\n", "230\n", "00:09:52,000 --> 00:09:55,000\n", "那当你跟一群人在一起做的时候\n", "\n", "231\n", "00:09:55,000 --> 00:09:59,000\n", "你必须学会如何进入一个团队\n", "\n", "232\n", "00:09:59,000 --> 00:10:03,000\n", "从边缘开始慢慢进入核心\n", "\n", "233\n", "00:10:03,000 --> 00:10:06,000\n", "从底层开始慢慢变成leader\n", "\n", "234\n", "00:10:06,000 --> 00:10:09,000\n", "然后如何可以推动你想做的事\n", "\n", "235\n", "00:10:09,000 --> 00:10:13,000\n", "如何变成可以做到你想做的事等等\n", "\n", "236\n", "00:10:13,000 --> 00:10:15,000\n", "这些都是很重要的\n", "\n", "237\n", "00:10:15,000 --> 00:10:18,000\n", "那我们通常称这些东西\n", "\n", "238\n", "00:10:18,000 --> 00:10:21,000\n", "是所谓的soft skills\n", "\n", "239\n", "00:10:21,000 --> 00:10:24,000\n", "也就是软实力\n", "\n", "240\n", "00:10:24,000 --> 00:10:30,000\n", "所谓软实力就是硬实力以外的软实力\n", "\n", "241\n", "00:10:30,000 --> 00:10:34,000\n", "那硬实力是说你电子学的功力\n", "\n", "242\n", "00:10:34,000 --> 00:10:36,000\n", "数学的功力\n", "\n", "243\n", "00:10:36,000 --> 00:10:39,000\n", "这个城市能力这种是硬实力\n", "\n", "244\n", "00:10:39,000 --> 00:10:44,000\n", "软实力我们主要就是讲各种人际之间的\n", "\n", "245\n", "00:10:44,000 --> 00:10:49,000\n", "在人跟人之间的各种能力\n", "\n", "246\n", "00:10:49,000 --> 00:10:51,000\n", "包括沟通能力协调能力\n", "\n", "247\n", "00:10:51,000 --> 00:10:53,000\n", "交朋友的能力\n", "\n", "248\n", "00:10:53,000 --> 00:10:55,000\n", "这个说服人的能力\n", "\n", "249\n", "00:10:55,000 --> 00:10:59,000\n", "这个团队精神领导能力等等\n", "\n", "250\n", "00:10:59,000 --> 00:11:02,000\n", "那些就是所谓的soft skills\n", "\n", "251\n", "00:11:02,000 --> 00:11:04,000\n", "重要不重要重要\n", "\n", "252\n", "00:11:04,000 --> 00:11:07,000\n", "你看到任何一个成功的电机工程师\n", "\n", "253\n", "00:11:07,000 --> 00:11:09,000\n", "他都有一堆这种\n", "\n", "254\n", "00:11:09,000 --> 00:11:13,000\n", "这个才是他成功的一个非常重要的关键\n", "\n", "255\n", "00:11:13,000 --> 00:11:15,000\n", "这种东西怎么来\n", "\n", "256\n", "00:11:15,000 --> 00:11:18,000\n", "我们刚才讲的各种课业外的\n", "\n", "257\n", "00:11:18,000 --> 00:11:20,000\n", "各种学习增长的机会\n", "\n", "258\n", "00:11:20,000 --> 00:11:26,000\n", "都可以帮助一个人塑造他的soft skills\n", "\n", "259\n", "00:11:26,000 --> 00:11:30,000\n", "是有少数人的这些soft skills是天生的\n", "\n", "260\n", "00:11:30,000 --> 00:11:31,000\n", "他天生就厉害\n", "\n", "261\n", "00:11:31,000 --> 00:11:32,000\n", "有没有\n", "\n", "262\n", "00:11:32,000 --> 00:11:33,000\n", "有\n", "\n", "263\n", "00:11:33,000 --> 00:11:35,000\n", "但这种人毕竟没那么多\n", "\n", "264\n", "00:11:35,000 --> 00:11:37,000\n", "对很多人而言\n", "\n", "265\n", "00:11:37,000 --> 00:11:42,000\n", "他的soft skills是自己努力慢慢培养起来的\n", "\n", "266\n", "00:11:42,000 --> 00:11:45,000\n", "我刚才一开始前面讲的那一段\n", "\n", "267\n", "00:11:45,000 --> 00:11:49,000\n", "我说我在进台大电机系以前\n", "\n", "268\n", "00:11:49,000 --> 00:11:51,000\n", "我几乎不会交朋友\n", "\n", "269\n", "00:11:51,000 --> 00:11:53,000\n", "我不太会说话\n", "\n", "270\n", "00:11:53,000 --> 00:11:57,000\n", "我在读大学的四年里面改变我自己\n", "\n", "271\n", "00:11:57,000 --> 00:12:02,000\n", "让我变成有很多这方面的能力的人\n", "\n", "272\n", "00:12:02,000 --> 00:12:06,000\n", "其实最重要的就是我的很多soft skills\n", "\n", "273\n", "00:12:06,000 --> 00:12:08,000\n", "都是我自己培养\n", "\n", "274\n", "00:12:08,000 --> 00:12:11,000\n", "在读台大电机系的四年里面\n", "\n", "275\n", "00:12:11,000 --> 00:12:15,000\n", "获得的非常多这方面的收获的\n", "\n", "276\n", "00:12:15,000 --> 00:12:21,000\n", "那是为什么我每次都要强调这个东西有多么重要\n", "\n", "277\n", "00:12:21,000 --> 00:12:29,000\n", "那我之前曾经在几年前的这个信号与人生里面\n", "\n", "278\n", "00:12:29,000 --> 00:12:31,000\n", "有说到这一件事\n", "\n", "279\n", "00:12:31,000 --> 00:12:33,000\n", "我现在不要重复\n", "\n", "280\n", "00:12:33,000 --> 00:12:36,000\n", "但是我简单的summarize\n", "\n", "281\n", "00:12:36,000 --> 00:12:39,000\n", "那我说我们电机系的\n", "\n", "282\n", "00:12:39,000 --> 00:12:45,000\n", "电机工程师的一生career的发展\n", "\n", "283\n", "00:12:45,000 --> 00:12:48,000\n", "那黄金实在是在什么时候\n", "\n", "284\n", "00:12:48,000 --> 00:12:52,000\n", "我认为是在35岁到55岁\n", "\n", "285\n", "00:12:52,000 --> 00:12:56,000\n", "这20年是我们的黄金时代\n", "\n", "286\n", "00:12:56,000 --> 00:12:58,000\n", "在这以前当然更好\n", "\n", "287\n", "00:12:58,000 --> 00:13:01,000\n", "只是说可能各方面尚未具备\n", "\n", "288\n", "00:13:01,000 --> 00:13:03,000\n", "还没有完全训练的好\n", "\n", "289\n", "00:13:03,000 --> 00:13:05,000\n", "在这以后是最好的\n", "\n", "290\n", "00:13:05,000 --> 00:13:10,000\n", "这以后年纪大了难免有一些要打个折扣等等\n", "\n", "291\n", "00:13:10,000 --> 00:13:15,000\n", "就这里面我们看到我们的电机系的毕业的同学\n", "\n", "292\n", "00:13:15,000 --> 00:13:18,000\n", "过去有几千人毕业我都看到\n", "\n", "293\n", "00:13:18,000 --> 00:13:22,000\n", "那我觉得有的人的发展是像这样\n", "\n", "294\n", "00:13:22,000 --> 00:13:24,000\n", "有一定的斜率\n", "\n", "295\n", "00:13:24,000 --> 00:13:28,000\n", "但到某一个阶段它会慢慢saturate\n", "\n", "296\n", "00:13:28,000 --> 00:13:31,000\n", "有的人也许开始向上比较晚\n", "\n", "297\n", "00:13:31,000 --> 00:13:33,000\n", "但它斜率比较高\n", "\n", "298\n", "00:13:33,000 --> 00:13:38,000\n", "它最后会saturate在比较高的地方\n", "\n", "299\n", "00:13:38,000 --> 00:13:41,000\n", "也有的人也许开始的比较快\n", "\n", "300\n", "00:13:41,000 --> 00:13:44,000\n", "但是后来会overshoot之后\n", "\n", "301\n", "00:13:44,000 --> 00:13:46,000\n", "收敛在比较低的地方等等\n", "\n", "302\n", "00:13:46,000 --> 00:13:48,000\n", "这个每一个人都不一样\n", "\n", "303\n", "00:13:48,000 --> 00:13:50,000\n", "但是当然也有一种人\n", "\n", "304\n", "00:13:50,000 --> 00:13:53,000\n", "你会看到它一直向上走\n", "\n", "305\n", "00:13:53,000 --> 00:13:57,000\n", "完全没有saturate\n", "\n", "306\n", "00:13:57,000 --> 00:14:01,000\n", "这些人这些差别在哪里\n", "\n", "307\n", "00:14:01,000 --> 00:14:03,000\n", "这些东西差别在哪里\n", "\n", "308\n", "00:14:03,000 --> 00:14:06,000\n", "那我以前已经说过这件事\n", "\n", "309\n", "00:14:06,000 --> 00:14:08,000\n", "我不要多重复\n", "\n", "310\n", "00:14:08,000 --> 00:14:10,000\n", "我说最主要因素有四个\n", "\n", "311\n", "00:14:10,000 --> 00:14:12,000\n", "就是实力\n", "\n", "312\n", "00:14:12,000 --> 00:14:14,000\n", "努力\n", "\n", "313\n", "00:14:16,000 --> 00:14:18,000\n", "大智\n", "\n", "314\n", "00:14:20,000 --> 00:14:23,000\n", "跟self-deal这四件事情\n", "\n", "315\n", "00:14:23,000 --> 00:14:25,000\n", "那我认为\n", "\n", "316\n", "00:14:26,000 --> 00:14:29,000\n", "真正影响这个的\n", "\n", "317\n", "00:14:29,000 --> 00:14:32,000\n", "不是因为电子学考得好不好\n", "\n", "318\n", "00:14:32,000 --> 00:14:35,000\n", "不是因为信号与系统念得好不好\n", "\n", "319\n", "00:14:35,000 --> 00:14:37,000\n", "也就我刚才讲\n", "\n", "320\n", "00:14:37,000 --> 00:14:41,000\n", "你把每一门必修课当成是单一跑道\n", "\n", "321\n", "00:14:41,000 --> 00:14:43,000\n", "跑到第一名并不表示怎样\n", "\n", "322\n", "00:14:43,000 --> 00:14:45,000\n", "我们最后不看那个的\n", "\n", "323\n", "00:14:45,000 --> 00:14:47,000\n", "最后看的是这个\n", "\n", "324\n", "00:14:47,000 --> 00:14:49,000\n", "那这个是怎么样影响\n", "\n", "325\n", "00:14:49,000 --> 00:14:51,000\n", "我认为是这四件事\n", "\n", "326\n", "00:14:51,000 --> 00:14:53,000\n", "就是实力努力\n", "\n", "327\n", "00:14:53,000 --> 00:14:55,000\n", "大智跟self-skills\n", "\n", "328\n", "00:14:56,000 --> 00:14:59,000\n", "这四件事里面我们现在可以summarize\n", "\n", "329\n", "00:14:59,000 --> 00:15:01,000\n", "我刚才讲的\n", "\n", "330\n", "00:15:01,000 --> 00:15:03,000\n", "什么是实力\n", "\n", "331\n", "00:15:03,000 --> 00:15:05,000\n", "实力就是所有的这些\n", "\n", "332\n", "00:15:05,000 --> 00:15:09,000\n", "我们电机工程的专业领域里面的各种东西的实力\n", "\n", "333\n", "00:15:09,000 --> 00:15:11,000\n", "实力怎么厉害法\n", "\n", "334\n", "00:15:11,000 --> 00:15:13,000\n", "就是我刚才讲的\n", "\n", "335\n", "00:15:13,000 --> 00:15:16,000\n", "你如果都是在做全面的学习的话\n", "\n", "336\n", "00:15:16,000 --> 00:15:18,000\n", "你就会学到各种该学到的\n", "\n", "337\n", "00:15:18,000 --> 00:15:20,000\n", "最后你的实力就是很强的\n", "\n", "338\n", "00:15:20,000 --> 00:15:25,000\n", "所以实力最主要就是不要overfitting\n", "\n", "339\n", "00:15:25,000 --> 00:15:31,000\n", "要尽量都做学到该学的全面的学习\n", "\n", "340\n", "00:15:31,000 --> 00:15:33,000\n", "努力是没有疑问\n", "\n", "341\n", "00:15:33,000 --> 00:15:35,000\n", "每个人都了解\n", "\n", "342\n", "00:15:35,000 --> 00:15:38,000\n", "确实我们可以看到一个人在未来的几十年里面\n", "\n", "343\n", "00:15:38,000 --> 00:15:40,000\n", "有的人他一直努力\n", "\n", "344\n", "00:15:40,000 --> 00:15:42,000\n", "有的人慢慢不太努力等等\n", "\n", "345\n", "00:15:42,000 --> 00:15:44,000\n", "这个是有明显差别的\n", "\n", "346\n", "00:15:44,000 --> 00:15:46,000\n", "那self-skills我刚才已经讲了\n", "\n", "347\n", "00:15:46,000 --> 00:15:50,000\n", "就是很多我们平常没有算成绩\n", "\n", "348\n", "00:15:50,000 --> 00:15:52,000\n", "觉得大家不重视的事情\n", "\n", "349\n", "00:15:52,000 --> 00:15:54,000\n", "那其他常常是很重要的\n", "\n", "350\n", "00:15:54,000 --> 00:15:56,000\n", "你如果好好的\n", "\n", "351\n", "00:15:56,000 --> 00:15:59,000\n", "多在各种课业外的事情上\n", "\n", "352\n", "00:15:59,000 --> 00:16:01,000\n", "增长进步的话\n", "\n", "353\n", "00:16:01,000 --> 00:16:03,000\n", "你这个东西会很强\n", "\n", "354\n", "00:16:03,000 --> 00:16:05,000\n", "这个东西会很厉害的\n", "\n", "355\n", "00:16:05,000 --> 00:16:07,000\n", "当然对少数人而言\n", "\n", "356\n", "00:16:07,000 --> 00:16:08,000\n", "他天生就有\n", "\n", "357\n", "00:16:08,000 --> 00:16:09,000\n", "他可能不需要\n", "\n", "358\n", "00:16:09,000 --> 00:16:11,000\n", "就是每一个人不一样的\n", "\n", "359\n", "00:16:11,000 --> 00:16:13,000\n", "那这三个我都提过了\n", "\n", "360\n", "00:16:13,000 --> 00:16:15,000\n", "那么大致我还没有提\n", "\n", "361\n", "00:16:15,000 --> 00:16:18,000\n", "其实大致没有什么要特别说的\n", "\n", "362\n", "00:16:18,000 --> 00:16:21,000\n", "那应该就是我刚才前面有讲过\n", "\n", "363\n", "00:16:21,000 --> 00:16:25,000\n", "就是每一个人可以有你自己的长程目标\n", "\n", "364\n", "00:16:25,000 --> 00:16:28,000\n", "那有的人本来就有了\n", "\n", "365\n", "00:16:28,000 --> 00:16:31,000\n", "有的人也许我平常没有想过\n", "\n", "366\n", "00:16:31,000 --> 00:16:35,000\n", "那你可以在适当时机开始想\n", "\n", "367\n", "00:16:35,000 --> 00:16:38,000\n", "我有没有想要做什么事情\n", "\n", "368\n", "00:16:38,000 --> 00:16:41,000\n", "哪些事情可能是我的长程目标\n", "\n", "369\n", "00:16:41,000 --> 00:16:46,000\n", "我希望最后让我花个五年十年\n", "\n", "370\n", "00:16:46,000 --> 00:16:48,000\n", "十五年或者更长\n", "\n", "371\n", "00:16:48,000 --> 00:16:50,000\n", "我把我的很多的努力\n", "\n", "372\n", "00:16:50,000 --> 00:16:53,000\n", "都来把某些事情做得非常漂亮\n", "\n", "373\n", "00:16:53,000 --> 00:16:55,000\n", "那是我很想做的事\n", "\n", "374\n", "00:16:55,000 --> 00:16:57,000\n", "那就是长程目标\n", "\n", "375\n", "00:16:57,000 --> 00:16:59,000\n", "如果我觉得做那些事情\n", "\n", "376\n", "00:16:59,000 --> 00:17:01,000\n", "会让我非常的\n", "\n", "377\n", "00:17:01,000 --> 00:17:03,000\n", "觉得有意义\n", "\n", "378\n", "00:17:03,000 --> 00:17:05,000\n", "愿意花功夫下去做的\n", "\n", "379\n", "00:17:05,000 --> 00:17:07,000\n", "那就是我的长程目标\n", "\n", "380\n", "00:17:07,000 --> 00:17:10,000\n", "那有的人如果可以想出这个来的话\n", "\n", "381\n", "00:17:10,000 --> 00:17:13,000\n", "那就是他的大致\n", "\n", "382\n", "00:17:13,000 --> 00:17:15,000\n", "那越是有这种大致的人\n", "\n", "383\n", "00:17:15,000 --> 00:17:18,000\n", "也比较容易向上冲\n", "\n", "384\n", "00:17:18,000 --> 00:17:19,000\n", "那我感觉起来\n", "\n", "385\n", "00:17:19,000 --> 00:17:23,000\n", "真正影响的就是这四件事\n", "\n", "386\n", "00:17:23,000 --> 00:17:33,000\n", "请不吝点赞 订阅 转发 打赏支持明镜与点点栏目\n", "\n", "\n" ] } ], "source": [ "# 读取并打印字幕内容\n", "with open(output_subtitle_path, 'r', encoding='utf-8') as file:\n", " content = file.read()\n", "print(content)" ] }, { "cell_type": "markdown", "id": "a5a7ea77-e0e1-458b-9f92-9c37bfb0bf8e", "metadata": {}, "source": [ "## 第 3 部分 - 处理自动语音识别的结果\n", "\n", "### 提取字幕文本" ] }, { "cell_type": "code", "execution_count": 9, "id": "285c7d95-991b-4ba4-95e4-d085cd1e6fea", "metadata": {}, "outputs": [], "source": [ "def extract_and_save_text(srt_filename, output_filename):\n", " # 读取 SRT 文件\n", " with open(srt_filename, 'r', encoding='utf-8') as file:\n", " content = file.read()\n", "\n", " # 去除时间戳和索引\n", " pure_text = re.sub(r'\\d+\\n\\d{2}:\\d{2}:\\d{2},\\d{3} --> \\d{2}:\\d{2}:\\d{2},\\d{3}\\n', '', content)\n", " pure_text = re.sub(r'\\n\\n+', '\\n', pure_text)\n", "\n", " # 保存纯文本\n", " with open(output_filename, 'w', encoding='utf-8') as output_file:\n", " output_file.write(pure_text)\n", "\n", " print(f'提取的文本已保存到 {output_filename}')\n", "\n", " return pure_text" ] }, { "cell_type": "markdown", "id": "cd4b801f-e421-4aa6-806b-e0497185ac39", "metadata": {}, "source": [ "### 拆分文本\n", "\n" ] }, { "cell_type": "code", "execution_count": 10, "id": "1e2e83e5-a538-4ce6-8187-9379c0db43bf", "metadata": {}, "outputs": [], "source": [ "def chunk_text(text, max_length):\n", " return textwrap.wrap(text, max_length)" ] }, { "cell_type": "markdown", "id": "63aaaa7f-f343-45d8-aa01-bfd621011e46", "metadata": {}, "source": [ "### 执行文本处理\n", "\n" ] }, { "cell_type": "code", "execution_count": 11, "id": "25b27081-ca3a-4534-a777-3ad7e76b3fa9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "提取的文本已保存到 ./output-信号与人生.txt\n" ] } ], "source": [ "# 文本块长度\n", "chunk_length = 512\n", "\n", "# 是否转换为繁体中文\n", "convert_to_traditional = False\n", "\n", "# 提取文本并拆分\n", "pure_text = extract_and_save_text(\n", " srt_filename=output_subtitle_path,\n", " output_filename=f\"./output-{suffix}.txt\",\n", ")\n", "\n", "chunks = chunk_text(text=pure_text, max_length=chunk_length)" ] }, { "cell_type": "markdown", "id": "bfdefb4d-0d21-4ea5-ab05-4d78810d0ff2", "metadata": {}, "source": [ "## 第 4 部分 - 文本摘要\n", "\n", "### 设置 OpenAI API\n", "\n", "首先,需要设置 OpenAI API 密钥,这里使用的是阿里云的大模型,你可以通过[《00. 大模型 API 获取步骤》](https://github.com/Hoper-J/AI-Guide-and-Demos-zh_CN/blob/master/Guide/00.%20大模型%20API%20获取步骤.md)获取 API 密钥。\n", "\n", "如果需要使用其他平台,请参考对应的开发文档后对应修改 base_url。" ] }, { "cell_type": "code", "execution_count": 12, "id": "30f8e9ac-9dfe-436c-af82-b0a49b1889f8", "metadata": {}, "outputs": [], "source": [ "# TODO: 设置你的 OPENAI API 密钥,这里以阿里云 DashScope API 为例进行演示\n", "OPENAI_API_KEY = \"\"\n", "\n", "# 不设置则默认使用环境变量\n", "if not OPENAI_API_KEY:\n", " OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')\n", "\n", "# 构建 OpenAI 客户端\n", "client = OpenAI(\n", " api_key=OPENAI_API_KEY,\n", " base_url=\"https://dashscope.aliyuncs.com/compatible-mode/v1\", # 这里使用的是阿里云的大模型,如果需要使用其他平台,请参考对应的开发文档后对应修改。如果使用 GPT 的 API,删除这行就可以直接运行。\n", ")\n" ] }, { "cell_type": "markdown", "id": "d1dbb20a-afb0-448c-992d-6b3ac2a26eb1", "metadata": {}, "source": [ "### 设置参数\n", "\n", "默认使用 qwen-plus,其他模型可以参阅[模型广场 -- 阿里云百炼](https://bailian.console.aliyun.com/?spm=5176.29619931.J__Z58Z6CX7MY__Ll8p1ZOR.1.4d1d59fcWwSqvr#/model-market),点击对应模型的`查看详情`。\n", "\n", "![image-20240924091151684](../Guide/assets/image-20240924091151684.png)\n", "\n", "在界面可以左上角看到对应的英文名称,复制它,然后替换 `model_name`。\n", "\n", "![image-20240924091414350](../Guide/assets/image-20240924091414350.png)\n", "\n", "你可以随意更换为你想要的模型,不过可能要先申请使用(通过大概要几个小时,会有短信prompt)。" ] }, { "cell_type": "code", "execution_count": 13, "id": "65b3f633-9548-4849-b212-f34aa61421da", "metadata": {}, "outputs": [], "source": [ "# 模型名称\n", "model_name = 'qwen-plus'\n", "\n", "# 控制响应的随机性\n", "temperature = 0.0\n", "\n", "# 控制多样性\n", "top_p = 1.0\n", "\n", "# 最大生成tokens\n", "max_tokens = 512" ] }, { "cell_type": "markdown", "id": "22064928-8064-4ac7-b506-a2a358a61dc7", "metadata": {}, "source": [ "### 定义摘要函数\n" ] }, { "cell_type": "code", "execution_count": 14, "id": "e891f9d7-2b77-4935-bbe6-6ded3d7b6c1e", "metadata": {}, "outputs": [], "source": [ "def summarization(client, summarization_prompt, model_name=\"qwen-plus\", temperature=0.0, top_p=1.0, max_tokens=512):\n", " response = client.chat.completions.create(\n", " messages=[{\"role\": \"user\", \"content\": summarization_prompt}],\n", " model=model_name,\n", " temperature=temperature,\n", " top_p=top_p,\n", " max_tokens=max_tokens\n", " )\n", " return response.choices[0].message.content" ] }, { "cell_type": "markdown", "id": "eb17103c-10e5-4184-8d0c-dbb84703ff1c", "metadata": {}, "source": [ "### 这里演示两种摘要方式\n", "\n", "分别对应于 `MapReduce` 和 `Refine`,你可以通过接下来的代码来感受二者的区别。\n", "\n", "#### 方法一:拆分为多段进行摘要(Multi-Stage Summarization)- MapReduce\n", "\n", "![image.png](../Guide/assets/image-20240924092040340.png)\n", "\n", "1. 将长文本分成多个较小的部分,并分别获取每个小段落的摘要" ] }, { "cell_type": "code", "execution_count": 15, "id": "a3a31190-0096-4d82-b2e5-63a07e54c287", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "========== 正在生成第 1 段摘要 ==========\n", "\n", "原始文本 (第 1 段):\n", "每次说学问是做出来的 什么意思? 要做才会获得学问 你如果每天光是坐在那里听 学问很可能是左耳进右耳出的 你光是坐在那儿读 学问可能从眼睛进入脑海之后就忘掉了 如何能够学问在脑海里面 真的变成你自己学问 就是要做 可能有很多同学有这个经验 你如果去修某一门课 或者做某一个实验 在期末就是要教一个final project 那个final project就是要你把 学到的很多东西 最后整合在你的final project里面 最后做出来的时候 就是把它们都整合了 当你学期结束 真的把final project做完的时候 你会忽然发现 我真的学到很多东西 那就是做出来的学问 也许有 可以举另外一个例子 就是你如果学了 某一些很复杂的演算法或者什么 好像觉得那些不见得在你的脑海里 可是后来老师出了个习题 那个习题叫你写一个很大的程式 要把所有东西都包进去 当你把这个程式写完的时候你会发现 你忽然把演算法你所有东西都弄通了 那就是学问是做出来的 所以我们永远要记得 尽量多动手多做 在动手跟做的过程之中 学问才可以变成是自己的 同样的情形就是说 很多时候这样动手或者做的 表现或者成绩 没有一个成绩单上的数字\n", "\n", "生成的摘要 (第 1 段):\n", "这段视频强调“学问是做出来的”这一核心观点。指出仅听讲或阅读难以真正掌握知识,必须通过实践和动手操作才能内化为自己的学问。以课程项目和编程习题为例,说明在完成实际任务过程中,才能整合所学内容,真正理解并掌握知识。视频提醒学生要多动手、多实践,因为只有通过实践,学问才能转化为个人能力,而不仅仅是成绩单上的数字。\n", "\n", "\n", "========== 正在生成第 2 段摘要 ==========\n", "\n", "原始文本 (第 2 段):\n", "使得很多人觉得那不重要 很多人甚至觉得 这门课要做final project 我就不修了太累了 或者说那门课需要 怎么样怎么样太累我就不要做了 而不知道 其实那个才是让你做的机会 然后可以学到最多 也就是说虽然很可能 那么辛苦的做很多事 没有让你获得什么具体成绩 对你的overfitting可能没有帮助 可是对你的全面学习是很有帮助 是该学的 不要漏掉这些事 这是我所说的 这个课业内可以做的这些事 刚才我们讲到思考的时候 我觉得我漏掉一点 你如果修我的信号课 你可能会发现 我上课没讲到一个数学式子的时候 我通常都不推他的 我是在解释那个数学式子在说什么话 同样的没讲到一个什么事情的时候 我通常就在解释他在说什么话 也就是说我在讲的就是 我读到课本那里的时候 我心里怎么想的 也就是我在告诉同学如何 这个读书的时候 如何一面读一面练习思考 这个才是最重要的一件事 如何培养自己思考的能力 跟培养思考的习惯 我觉得最好的办法就是 读书的时候凡是读到一个数学式子 都去想一想 那个数学式子到底在说什么 凡是读到课本上讲什么 就去想一想 那个到底在说什么 你要真的了解他在说什么的时候 你说什么时候 你就用了很多思考的功夫\n", "\n", "生成的摘要 (第 2 段):\n", "该视频强调,学生常因课程项目繁重而放弃,却不知这些项目是最佳学习机会。虽然项目可能不直接提升成绩或解决过拟合问题,但对全面学习至关重要。作者建议在学习时深入理解数学公式和内容,思考其含义,培养独立思考能力与习惯。通过阅读时不断提问和反思,才能真正掌握知识,提升思维能力。\n", "\n", "\n", "========== 正在生成第 3 段摘要 ==========\n", "\n", "原始文本 (第 3 段):\n", "你就在练习自己思考的能力了 好 以上说的是课业内的部分 那当然除了课业内之外 还有一大堆是不在课业内的 那就是课业外的 课业外也有很多式的 我们可以 举例来说 课业外有什么可以学习的 那我通常把学习定义成为 什么是学习 学习就是一种增长 一种进步 然后获得快乐 这就是学习 所以即使是课业外的任何事情 只要你觉得是有增长的 是有进步的 让你觉得快乐的 那应该就是值得学习的地方 那我们可以举很多例子 那譬如说 很多同学喜欢打球 打球是不是学习 当然是 在打球中间有没有增长 当然有增长 打球不只是对健康有增长 而且可能对于 譬如说手脑协调 譬如说团队精神 譬如说这个个人之间的互动 可能都有帮助 所以打球当然是有增长的 那当然是很好的学习的机会 有人喜欢爬山 爬山是不是好的学习机会 当然是 这个我以前两年前就讲过很多 爬山可以学到很多的 那爬山当然是一种学习 有人说我不喜欢爬山 我去旅行好不好 旅行当然好 旅行可以增长建设 可以扩增事业 可以增加很多很多 当然是有进步的 所以当然是很好的学习 你凡是获得快乐 都是很好的事 那这些都值得下功夫去 把它看成是学习 都值得下功夫去做的 我们再讲另外一系列 譬如说\n", "\n", "生成的摘要 (第 3 段):\n", "这段视频强调学习不仅限于课业,还包括课业外的各类活动。学习被定义为增长、进步和获得快乐的过程。例如,打球能提升健康、协调能力和团队精神;爬山和旅行也能带来成长与视野拓展。任何带来积极变化并让人感到快乐的活动,都值得视为学习机会,应投入时间和精力去实践。\n", "\n", "\n", "========== 正在生成第 4 段摘要 ==========\n", "\n", "原始文本 (第 4 段):\n", "有人说谈恋爱是不是学习 谈恋爱除了你在谈恋爱上 会有收获以外 本身也是有收获的 因为让你体验到人跟人之间 的各种感觉 人跟人之间的各种期待等等 有没有帮助 当然有帮助 有帮助对每一个人 都是很好的学习 所以谈恋爱当然是一件很好的事 那有人会说 那要靠缘分 没有缘分没有办法 对不对 对 但是你不是一定要谈恋爱吗 你可以交朋友 交朋友是不是学习 当然是 交朋友也一样 让我们学到很多人际的互动 学到很多人跟人之间的沟通 人跟人之间的期待 人跟人之间的感觉 这都是交朋友之后学到的 对我们电机系的同学而言 你四周有一大群好同学 都是很好的交朋友的对象 你下一番功夫交朋友好不好 好 当然是有帮助的 另外当然我们可以举很多 我们最现成的例子 譬如说我们的戏学会办各种活动 那些活动有没有帮助 当然有 那我们举例来讲电乐 你如果去参加某一个舞 跳个舞 或者参加某个剧演个剧 有没有帮助 当然有帮助 你在这中间一定发现有所增长 有所进步 那是为什么有那么多同学要去参加 就是因为发现那个确实是有增长有进步 那有的人说 我不去跳那个舞或者演那个剧 我做幕后的 譬如说是幕后的什么什么规划 或者说是什么这个光舞的什么软体组\n", "\n", "生成的摘要 (第 4 段):\n", "这段视频强调谈恋爱和交朋友都是学习人际互动、沟通与情感体验的过程,对个人成长有积极帮助。同时指出,参与社团活动如戏剧社、舞蹈等同样能提升能力,即使在幕后工作也能获得成长。视频鼓励电机系学生多交朋友、参与活动,以丰富人生经验,促进自我发展。\n", "\n", "\n", "========== 正在生成第 5 段摘要 ==========\n", "\n", "原始文本 (第 5 段):\n", "还是什么这个服装道具组 一样啊 那个都是可以有获得很多的增长 很多进步的 当然都是很有用的 都是很好的学习 那当然也包括电业以外的戏学会 其他的各种活动都一样 也包括电机系以外的其他的校内或者 校外的各种活动几乎都一样 都可以让人有所增长有所进步 都是很好的学习的机会 都是很好的学习 同样的问题是这些东西都没有考试 没有成绩不能显示在成绩单上 因此对有一些同学会认为那个浪费时间 我不需要花时间去做那个 因为不影响我的 overfitting的目标 里面没有这个嘛 具体成绩没有这些嘛 那不要这样想 因为那些都非常的重要 都对你发展非常的重要 那我们说电机工程 今天的电机工程很少什么事情 自己一个人可以做成功的 你必须跟很多人一起 才可能做成功一个非常重要的 有意义的工作 那当你跟一群人在一起做的时候 你必须学会如何进入一个团队 从边缘开始慢慢进入核心 从底层开始慢慢变成leader 然后如何可以推动你想做的事 如何变成可以做到你想做的事等等 这些都是很重要的 那我们通常称这些东西 是所谓的soft skills 也就是软实力 所谓软实力就是硬实力以外的软实力 那硬实力是说你电子学的功力 数学的功力\n", "\n", "生成的摘要 (第 5 段):\n", "视频强调课外活动(如服装道具组、戏剧社等)对个人成长的重要性,虽无成绩记录,但能提升团队合作、领导力等“软实力”。这些经历有助于在电机工程等专业领域中与他人协作,从边缘逐步成长为领导者。软实力与硬实力(如电子学、数学能力)同样关键,对职业发展至关重要。不应因无成绩而忽视这些机会。\n", "\n", "\n", "========== 正在生成第 6 段摘要 ==========\n", "\n", "原始文本 (第 6 段):\n", "这个城市能力这种是硬实力 软实力我们主要就是讲各种人际之间的 在人跟人之间的各种能力 包括沟通能力协调能力 交朋友的能力 这个说服人的能力 这个团队精神领导能力等等 那些就是所谓的soft skills 重要不重要重要 你看到任何一个成功的电机工程师 他都有一堆这种 这个才是他成功的一个非常重要的关键 这种东西怎么来 我们刚才讲的各种课业外的 各种学习增长的机会 都可以帮助一个人塑造他的soft skills 是有少数人的这些soft skills是天生的 他天生就厉害 有没有 有 但这种人毕竟没那么多 对很多人而言 他的soft skills是自己努力慢慢培养起来的 我刚才一开始前面讲的那一段 我说我在进台大电机系以前 我几乎不会交朋友 我不太会说话 我在读大学的四年里面改变我自己 让我变成有很多这方面的能力的人 其实最重要的就是我的很多soft skills 都是我自己培养 在读台大电机系的四年里面 获得的非常多这方面的收获的 那是为什么我每次都要强调这个东西有多么重要 那我之前曾经在几年前的这个信号与人生里面 有说到这一件事 我现在不要重复 但是我简单的summarize 那我说我们电机系的\n", "\n", "生成的摘要 (第 6 段):\n", "这段视频强调“软实力”(soft skills)的重要性,包括沟通、协调、交朋友、说服、团队合作和领导力等能力。这些能力对成功至关重要,即使是优秀的电机工程师也离不开它们。虽然少数人天生具备这些能力,但大多数人需要通过课余学习和实践逐步培养。演讲者分享自己在台大电机系四年中通过努力提升软技能的经历,说明这些能力可通过自我培养获得。他多次强调软实力对个人发展的重要性,并提到过去曾讨论过这一话题。\n", "\n", "\n", "========== 正在生成第 7 段摘要 ==========\n", "\n", "原始文本 (第 7 段):\n", "电机工程师的一生career的发展 那黄金实在是在什么时候 我认为是在35岁到55岁 这20年是我们的黄金时代 在这以前当然更好 只是说可能各方面尚未具备 还没有完全训练的好 在这以后是最好的 这以后年纪大了难免有一些要打个折扣等等 就这里面我们看到我们的电机系的毕业的同学 过去有几千人毕业我都看到 那我觉得有的人的发展是像这样 有一定的斜率 但到某一个阶段它会慢慢saturate 有的人也许开始向上比较晚 但它斜率比较高 它最后会saturate在比较高的地方 也有的人也许开始的比较快 但是后来会overshoot之后 收敛在比较低的地方等等 这个每一个人都不一样 但是当然也有一种人 你会看到它一直向上走 完全没有saturate 这些人这些差别在哪里 这些东西差别在哪里 那我以前已经说过这件事 我不要多重复 我说最主要因素有四个 就是实力 努力 大智 跟self-deal这四件事情 那我认为 真正影响这个的 不是因为电子学考得好不好 不是因为信号与系统念得好不好 也就我刚才讲 你把每一门必修课当成是单一跑道 跑到第一名并不表示怎样 我们最后不看那个的 最后看的是这个 那这个是怎么样影响 我认为是这四件事\n", "\n", "生成的摘要 (第 7 段):\n", "这段视频讨论了电机工程师职业生涯的发展阶段与成功因素。作者认为35至55岁是职业黄金期,此前积累不足,此后可能因年龄下降。他指出不同人的发展轨迹各异,有的早期发展慢但后期上升快,有的则前期快但后期回落。影响职业发展的关键因素包括实力、努力、智慧和自我管理(self-deal),而非单纯学术成绩。最终成功取决于这四个方面,而非单科表现。\n", "\n", "\n", "========== 正在生成第 8 段摘要 ==========\n", "\n", "原始文本 (第 8 段):\n", "就是实力努力 大智跟self-skills 这四件事里面我们现在可以summarize 我刚才讲的 什么是实力 实力就是所有的这些 我们电机工程的专业领域里面的各种东西的实力 实力怎么厉害法 就是我刚才讲的 你如果都是在做全面的学习的话 你就会学到各种该学到的 最后你的实力就是很强的 所以实力最主要就是不要overfitting 要尽量都做学到该学的全面的学习 努力是没有疑问 每个人都了解 确实我们可以看到一个人在未来的几十年里面 有的人他一直努力 有的人慢慢不太努力等等 这个是有明显差别的 那self-skills我刚才已经讲了 就是很多我们平常没有算成绩 觉得大家不重视的事情 那其他常常是很重要的 你如果好好的 多在各种课业外的事情上 增长进步的话 你这个东西会很强 这个东西会很厉害的 当然对少数人而言 他天生就有 他可能不需要 就是每一个人不一样的 那这三个我都提过了 那么大致我还没有提 其实大致没有什么要特别说的 那应该就是我刚才前面有讲过 就是每一个人可以有你自己的长程目标 那有的人本来就有了 有的人也许我平常没有想过 那你可以在适当时机开始想 我有没有想要做什么事情 哪些事情可能是我的长程目标\n", "\n", "生成的摘要 (第 8 段):\n", "摘要:视频强调了提升个人竞争力的四个关键因素:实力、努力、自我技能(self-skills)和长期目标。实力指全面学习专业领域知识,避免过度专注单一内容;努力是持续奋斗,影响未来成就;自我技能包括课外实践,对个人发展至关重要;长程目标需根据个人情况设定,有助于明确方向。\n", "\n", "\n", "========== 正在生成第 9 段摘要 ==========\n", "\n", "原始文本 (第 9 段):\n", "我希望最后让我花个五年十年 十五年或者更长 我把我的很多的努力 都来把某些事情做得非常漂亮 那是我很想做的事 那就是长程目标 如果我觉得做那些事情 会让我非常的 觉得有意义 愿意花功夫下去做的 那就是我的长程目标 那有的人如果可以想出这个来的话 那就是他的大致 那越是有这种大致的人 也比较容易向上冲 那我感觉起来 真正影响的就是这四件事 请不吝点赞 订阅 转发 打赏支持明镜与点点栏目\n", "\n", "生成的摘要 (第 9 段):\n", "该视频强调“长程目标”的重要性,即个人愿意投入五年、十年甚至更长时间去完成的有意义之事。拥有清晰长程目标的人更容易取得成功。视频提到真正影响人生的四件事,并呼吁观众点赞、订阅、转发和打赏支持栏目。\n", "\n" ] } ], "source": [ "# 定义摘要prompt模板\n", "summarization_prompt_template = \"用 300 个字以内写出这段视频文本的摘要,其中包括要点和所有重要细节:\"\n", "\n", "# 对每个文本块生成摘要\n", "paragraph_summaries = []\n", "for index, chunk in enumerate(chunks):\n", " print(f\"\\n========== 正在生成第 {index + 1} 段摘要 ==========\\n\")\n", " print(f\"原始文本 (第 {index + 1} 段):\\n{chunk}\\n\")\n", " \n", " # 构建摘要prompt\n", " summarization_prompt = summarization_prompt_template.replace(\"\", chunk)\n", " \n", " # 调用摘要函数\n", " summary = summarization(\n", " client=client,\n", " summarization_prompt=summarization_prompt,\n", " model_name=model_name,\n", " temperature=temperature,\n", " top_p=top_p,\n", " max_tokens=max_tokens\n", " )\n", " \n", " # 打印生成的摘要\n", " print(f\"生成的摘要 (第 {index + 1} 段):\\n{summary}\\n\")\n", " \n", " # 将生成的摘要保存到列表\n", " paragraph_summaries.append(summary)" ] }, { "cell_type": "markdown", "id": "d70eef3a-c6ec-45c2-9d0d-71890c397a8a", "metadata": {}, "source": [ "2. 在分别获取每个小段落的摘要后,处理这些摘要以生成最终的摘要。" ] }, { "cell_type": "code", "execution_count": 16, "id": "caea2fe3-d128-4484-a347-df18be5b011c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "视频强调“学问是做出来的”,主张通过实践和动手操作掌握知识,而非仅靠听讲或阅读。学习不仅限于课业,还包括课外活动、人际交往与社团参与,这些都能提升软实力,如沟通、团队合作与领导力。视频还指出,成功取决于实力、努力、自我技能和长程目标,鼓励学生注重全面发展,培养独立思考与实践能力,以提升个人竞争力。\n" ] } ], "source": [ "# 合并段落摘要\n", "collected_summaries = \"\\n\".join(paragraph_summaries)\n", "\n", "# 定义最终摘要prompt模板\n", "final_summarization_prompt = \"在 500 字以内写出以下文字的简洁摘要:\"\n", "final_summarization_prompt = final_summarization_prompt.replace(\"\", collected_summaries)\n", "\n", "# 生成最终摘要\n", "final_summary = summarization(\n", " client=client,\n", " summarization_prompt=final_summarization_prompt,\n", " model_name=model_name,\n", " temperature=temperature,\n", " top_p=top_p,\n", " max_tokens=max_tokens\n", ")\n", "\n", "print(final_summary)" ] }, { "cell_type": "markdown", "id": "64f55c6e-9a41-409d-b130-679f122fd228", "metadata": {}, "source": [ "#### 方法二:精炼方法(the method of Refinement) - Refine\n", "\n", "Refinement 就是把每次的文本和之前的摘要结合起来丢给大模型,类似于迭代:\n", "\n", "![Refinement](../Guide/assets/image-20240924092753352.png)\n", "\n", "步骤(Pipeline)如下:\n", "- 第1步:从一小部分数据开始,运行prompt生成初始输出。\n", "- 第2步:对后续每个文档,将前一个输出与新文档结合输入。\n", "- 第3步:LLM 根据新文档中的信息精炼输出。\n", "- 第4步:此过程持续迭代,直到处理完所有文档。\n", "\n", "对应的核心代码:" ] }, { "cell_type": "code", "execution_count": 17, "id": "d71e7f38-3eaa-4173-97aa-2d2052d1f729", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "========== 正在生成第 1 段的初始摘要 ==========\n", "\n", "原始文本 (第 1 段):\n", "每次说学问是做出来的 什么意思? 要做才会获得学问 你如果每天光是坐在那里听 学问很可能是左耳进右耳出的 你光是坐在那儿读 学问可能从眼睛进入脑海之后就忘掉了 如何能够学问在脑海里面 真的变成你自己学问 就是要做 可能有很多同学有这个经验 你如果去修某一门课 或者做某一个实验 在期末就是要教一个final project 那个final project就是要你把 学到的很多东西 最后整合在你的final project里面 最后做出来的时候 就是把它们都整合了 当你学期结束 真的把final project做完的时候 你会忽然发现 我真的学到很多东西 那就是做出来的学问 也许有 可以举另外一个例子 就是你如果学了 某一些很复杂的演算法或者什么 好像觉得那些不见得在你的脑海里 可是后来老师出了个习题 那个习题叫你写一个很大的程式 要把所有东西都包进去 当你把这个程式写完的时候你会发现 你忽然把演算法你所有东西都弄通了 那就是学问是做出来的 所以我们永远要记得 尽量多动手多做 在动手跟做的过程之中 学问才可以变成是自己的 同样的情形就是说 很多时候这样动手或者做的 表现或者成绩 没有一个成绩单上的数字\n", "\n", "生成的摘要 (第 1 段):\n", "视频强调“学问是做出来的”,指出仅听讲或阅读难以真正掌握知识。只有通过实践,如完成课程项目或编写程序,才能将所学整合并内化为自己的知识。例如,期末项目或编程作业能帮助学生在实践中理解复杂概念,从而真正掌握学问。视频提醒我们,动手实践比单纯成绩更重要,唯有通过行动,学问才能成为自己的。\n", "\n", "\n", "========== 正在生成第 2 段的精炼摘要 ==========\n", "\n", "原始文本 (第 2 段):\n", "使得很多人觉得那不重要 很多人甚至觉得 这门课要做final project 我就不修了太累了 或者说那门课需要 怎么样怎么样太累我就不要做了 而不知道 其实那个才是让你做的机会 然后可以学到最多 也就是说虽然很可能 那么辛苦的做很多事 没有让你获得什么具体成绩 对你的overfitting可能没有帮助 可是对你的全面学习是很有帮助 是该学的 不要漏掉这些事 这是我所说的 这个课业内可以做的这些事 刚才我们讲到思考的时候 我觉得我漏掉一点 你如果修我的信号课 你可能会发现 我上课没讲到一个数学式子的时候 我通常都不推他的 我是在解释那个数学式子在说什么话 同样的没讲到一个什么事情的时候 我通常就在解释他在说什么话 也就是说我在讲的就是 我读到课本那里的时候 我心里怎么想的 也就是我在告诉同学如何 这个读书的时候 如何一面读一面练习思考 这个才是最重要的一件事 如何培养自己思考的能力 跟培养思考的习惯 我觉得最好的办法就是 读书的时候凡是读到一个数学式子 都去想一想 那个数学式子到底在说什么 凡是读到课本上讲什么 就去想一想 那个到底在说什么 你要真的了解他在说什么的时候 你说什么时候 你就用了很多思考的功夫\n", "\n", "生成的摘要 (第 2 段):\n", "视频强调“学问是做出来的”,指出仅听讲或阅读难以真正掌握知识,唯有通过实践如课程项目或编程作业,才能将知识内化。许多学生因项目繁重而放弃,却不知这是最佳学习机会,虽未必带来直接成绩,却能提升全面理解与思考能力。视频还提到,教学中常不推导数学公式,而是解释其含义,鼓励学生在阅读时主动思考,培养独立思考的习惯与能力。真正的学习在于不断思考与实践,而非单纯追求分数。\n", "\n", "\n", "========== 正在生成第 3 段的精炼摘要 ==========\n", "\n", "原始文本 (第 3 段):\n", "你就在练习自己思考的能力了 好 以上说的是课业内的部分 那当然除了课业内之外 还有一大堆是不在课业内的 那就是课业外的 课业外也有很多式的 我们可以 举例来说 课业外有什么可以学习的 那我通常把学习定义成为 什么是学习 学习就是一种增长 一种进步 然后获得快乐 这就是学习 所以即使是课业外的任何事情 只要你觉得是有增长的 是有进步的 让你觉得快乐的 那应该就是值得学习的地方 那我们可以举很多例子 那譬如说 很多同学喜欢打球 打球是不是学习 当然是 在打球中间有没有增长 当然有增长 打球不只是对健康有增长 而且可能对于 譬如说手脑协调 譬如说团队精神 譬如说这个个人之间的互动 可能都有帮助 所以打球当然是有增长的 那当然是很好的学习的机会 有人喜欢爬山 爬山是不是好的学习机会 当然是 这个我以前两年前就讲过很多 爬山可以学到很多的 那爬山当然是一种学习 有人说我不喜欢爬山 我去旅行好不好 旅行当然好 旅行可以增长建设 可以扩增事业 可以增加很多很多 当然是有进步的 所以当然是很好的学习 你凡是获得快乐 都是很好的事 那这些都值得下功夫去 把它看成是学习 都值得下功夫去做的 我们再讲另外一系列 譬如说\n", "\n", "生成的摘要 (第 3 段):\n", "视频强调“学问是做出来的”,指出真正学习需通过实践,如课程项目或编程作业,才能内化知识。课业外的学习同样重要,如打球、爬山、旅行等,只要带来成长与快乐,都是学习。学习不仅是获取知识,更是不断思考与实践的过程,培养独立思考与全面能力。\n", "\n", "\n", "========== 正在生成第 4 段的精炼摘要 ==========\n", "\n", "原始文本 (第 4 段):\n", "有人说谈恋爱是不是学习 谈恋爱除了你在谈恋爱上 会有收获以外 本身也是有收获的 因为让你体验到人跟人之间 的各种感觉 人跟人之间的各种期待等等 有没有帮助 当然有帮助 有帮助对每一个人 都是很好的学习 所以谈恋爱当然是一件很好的事 那有人会说 那要靠缘分 没有缘分没有办法 对不对 对 但是你不是一定要谈恋爱吗 你可以交朋友 交朋友是不是学习 当然是 交朋友也一样 让我们学到很多人际的互动 学到很多人跟人之间的沟通 人跟人之间的期待 人跟人之间的感觉 这都是交朋友之后学到的 对我们电机系的同学而言 你四周有一大群好同学 都是很好的交朋友的对象 你下一番功夫交朋友好不好 好 当然是有帮助的 另外当然我们可以举很多 我们最现成的例子 譬如说我们的戏学会办各种活动 那些活动有没有帮助 当然有 那我们举例来讲电乐 你如果去参加某一个舞 跳个舞 或者参加某个剧演个剧 有没有帮助 当然有帮助 你在这中间一定发现有所增长 有所进步 那是为什么有那么多同学要去参加 就是因为发现那个确实是有增长有进步 那有的人说 我不去跳那个舞或者演那个剧 我做幕后的 譬如说是幕后的什么什么规划 或者说是什么这个光舞的什么软体组\n", "\n", "生成的摘要 (第 4 段):\n", "视频强调“学问是做出来的”,真正的学习源于实践,如课程项目、编程作业,也包括课余活动如打球、旅行等,只要带来成长与快乐,皆为学习。第4段指出,谈恋爱、交朋友、参与社团活动等也是学习过程,能提升人际沟通与情感理解。即使不参与表演,幕后工作如策划、软件开发等同样能获得成长。学习不仅是知识获取,更是通过不断思考与实践,培养独立思考与全面能力。\n", "\n", "\n", "========== 正在生成第 5 段的精炼摘要 ==========\n", "\n", "原始文本 (第 5 段):\n", "还是什么这个服装道具组 一样啊 那个都是可以有获得很多的增长 很多进步的 当然都是很有用的 都是很好的学习 那当然也包括电业以外的戏学会 其他的各种活动都一样 也包括电机系以外的其他的校内或者 校外的各种活动几乎都一样 都可以让人有所增长有所进步 都是很好的学习的机会 都是很好的学习 同样的问题是这些东西都没有考试 没有成绩不能显示在成绩单上 因此对有一些同学会认为那个浪费时间 我不需要花时间去做那个 因为不影响我的 overfitting的目标 里面没有这个嘛 具体成绩没有这些嘛 那不要这样想 因为那些都非常的重要 都对你发展非常的重要 那我们说电机工程 今天的电机工程很少什么事情 自己一个人可以做成功的 你必须跟很多人一起 才可能做成功一个非常重要的 有意义的工作 那当你跟一群人在一起做的时候 你必须学会如何进入一个团队 从边缘开始慢慢进入核心 从底层开始慢慢变成leader 然后如何可以推动你想做的事 如何变成可以做到你想做的事等等 这些都是很重要的 那我们通常称这些东西 是所谓的soft skills 也就是软实力 所谓软实力就是硬实力以外的软实力 那硬实力是说你电子学的功力 数学的功力\n", "\n", "生成的摘要 (第 5 段):\n", "视频强调“学问是做出来的”,真正的学习源于实践,包括课程项目、编程作业、课余活动如打球、旅行,甚至恋爱、交友、社团活动等,都能带来成长与快乐。第5段指出,服装道具组、戏剧社等课外活动同样能促进个人发展,虽无成绩记录,但对能力提升至关重要。这些经历培养了团队合作、沟通与领导力等“软实力”,而这些在电机工程等专业中同样关键。学习不仅是知识获取,更是通过实践培养独立思考与综合能力,对未来发展具有深远影响。\n", "\n", "\n", "========== 正在生成第 6 段的精炼摘要 ==========\n", "\n", "原始文本 (第 6 段):\n", "这个城市能力这种是硬实力 软实力我们主要就是讲各种人际之间的 在人跟人之间的各种能力 包括沟通能力协调能力 交朋友的能力 这个说服人的能力 这个团队精神领导能力等等 那些就是所谓的soft skills 重要不重要重要 你看到任何一个成功的电机工程师 他都有一堆这种 这个才是他成功的一个非常重要的关键 这种东西怎么来 我们刚才讲的各种课业外的 各种学习增长的机会 都可以帮助一个人塑造他的soft skills 是有少数人的这些soft skills是天生的 他天生就厉害 有没有 有 但这种人毕竟没那么多 对很多人而言 他的soft skills是自己努力慢慢培养起来的 我刚才一开始前面讲的那一段 我说我在进台大电机系以前 我几乎不会交朋友 我不太会说话 我在读大学的四年里面改变我自己 让我变成有很多这方面的能力的人 其实最重要的就是我的很多soft skills 都是我自己培养 在读台大电机系的四年里面 获得的非常多这方面的收获的 那是为什么我每次都要强调这个东西有多么重要 那我之前曾经在几年前的这个信号与人生里面 有说到这一件事 我现在不要重复 但是我简单的summarize 那我说我们电机系的\n", "\n", "生成的摘要 (第 6 段):\n", "视频强调“学问是做出来的”,真正的学习源于实践,包括课程项目、编程作业、课外活动如打球、旅行、恋爱、交友、社团等,都能带来成长与快乐。第5段指出,服装道具组、戏剧社等课外活动虽无成绩记录,但对能力提升至关重要,培养了团队合作、沟通与领导力等“软实力”,这些在电机工程等专业中同样关键。第6段进一步强调“软实力”如沟通、协调、说服、团队精神和领导力的重要性,这些能力对成功电机工程师至关重要。许多人的软实力是通过课业外的学习机会逐步培养的,而非天生。作者分享自己大学四年通过实践提升软实力的经历,说明这些能力对未来发展具有深远影响。\n", "\n", "\n", "========== 正在生成第 7 段的精炼摘要 ==========\n", "\n", "原始文本 (第 7 段):\n", "电机工程师的一生career的发展 那黄金实在是在什么时候 我认为是在35岁到55岁 这20年是我们的黄金时代 在这以前当然更好 只是说可能各方面尚未具备 还没有完全训练的好 在这以后是最好的 这以后年纪大了难免有一些要打个折扣等等 就这里面我们看到我们的电机系的毕业的同学 过去有几千人毕业我都看到 那我觉得有的人的发展是像这样 有一定的斜率 但到某一个阶段它会慢慢saturate 有的人也许开始向上比较晚 但它斜率比较高 它最后会saturate在比较高的地方 也有的人也许开始的比较快 但是后来会overshoot之后 收敛在比较低的地方等等 这个每一个人都不一样 但是当然也有一种人 你会看到它一直向上走 完全没有saturate 这些人这些差别在哪里 这些东西差别在哪里 那我以前已经说过这件事 我不要多重复 我说最主要因素有四个 就是实力 努力 大智 跟self-deal这四件事情 那我认为 真正影响这个的 不是因为电子学考得好不好 不是因为信号与系统念得好不好 也就我刚才讲 你把每一门必修课当成是单一跑道 跑到第一名并不表示怎样 我们最后不看那个的 最后看的是这个 那这个是怎么样影响 我认为是这四件事\n", "\n", "生成的摘要 (第 7 段):\n", "视频强调“学问是做出来的”,学习不仅来自课堂,更源于实践与课外活动,如课程项目、编程、社团等,这些经历培养了沟通、领导力等“软实力”,对电机工程师至关重要。第7段指出,电机工程师的黄金发展期在35至55岁,个人成长轨迹各异,关键取决于实力、努力、大智与自我管理四方面,而非单纯学术成绩。真正影响职业发展的,是综合能力的持续提升与实践积累。\n", "\n", "\n", "========== 正在生成第 8 段的精炼摘要 ==========\n", "\n", "原始文本 (第 8 段):\n", "就是实力努力 大智跟self-skills 这四件事里面我们现在可以summarize 我刚才讲的 什么是实力 实力就是所有的这些 我们电机工程的专业领域里面的各种东西的实力 实力怎么厉害法 就是我刚才讲的 你如果都是在做全面的学习的话 你就会学到各种该学到的 最后你的实力就是很强的 所以实力最主要就是不要overfitting 要尽量都做学到该学的全面的学习 努力是没有疑问 每个人都了解 确实我们可以看到一个人在未来的几十年里面 有的人他一直努力 有的人慢慢不太努力等等 这个是有明显差别的 那self-skills我刚才已经讲了 就是很多我们平常没有算成绩 觉得大家不重视的事情 那其他常常是很重要的 你如果好好的 多在各种课业外的事情上 增长进步的话 你这个东西会很强 这个东西会很厉害的 当然对少数人而言 他天生就有 他可能不需要 就是每一个人不一样的 那这三个我都提过了 那么大致我还没有提 其实大致没有什么要特别说的 那应该就是我刚才前面有讲过 就是每一个人可以有你自己的长程目标 那有的人本来就有了 有的人也许我平常没有想过 那你可以在适当时机开始想 我有没有想要做什么事情 哪些事情可能是我的长程目标\n", "\n", "生成的摘要 (第 8 段):\n", "视频强调“学问是做出来的”,学习不仅来自课堂,更源于实践与课外活动,如课程项目、编程、社团等,这些经历培养了沟通、领导力等“软实力”,对电机工程师至关重要。第7段指出,电机工程师的黄金发展期在35至55岁,个人成长轨迹各异,关键取决于实力、努力、大智与自我管理四方面,而非单纯学术成绩。第8段进一步说明,实力源于全面学习,避免过度专注;努力决定长期发展;自我技能则来自课外实践,对职业成功至关重要。每个人应明确长程目标,持续提升综合能力,实现职业成长。\n", "\n", "\n", "========== 正在生成第 9 段的精炼摘要 ==========\n", "\n", "原始文本 (第 9 段):\n", "我希望最后让我花个五年十年 十五年或者更长 我把我的很多的努力 都来把某些事情做得非常漂亮 那是我很想做的事 那就是长程目标 如果我觉得做那些事情 会让我非常的 觉得有意义 愿意花功夫下去做的 那就是我的长程目标 那有的人如果可以想出这个来的话 那就是他的大致 那越是有这种大致的人 也比较容易向上冲 那我感觉起来 真正影响的就是这四件事 请不吝点赞 订阅 转发 打赏支持明镜与点点栏目\n", "\n", "生成的摘要 (第 9 段):\n", "视频强调“学问是做出来的”,学习不仅来自课堂,更源于实践与课外活动,如课程项目、编程、社团等,这些经历培养了沟通、领导力等“软实力”,对电机工程师至关重要。第7段指出,电机工程师的黄金发展期在35至55岁,个人成长轨迹各异,关键取决于实力、努力、大智与自我管理四方面,而非单纯学术成绩。第8段进一步说明,实力源于全面学习,避免过度专注;努力决定长期发展;自我技能则来自课外实践,对职业成功至关重要。第9段提到长程目标的重要性,明确目标能让人更有方向感和动力,越有清晰目标的人越容易取得成就。每个人应明确长程目标,持续提升综合能力,实现职业成长。\n", "\n", "\n", "========== 最终精炼摘要结果 ==========\n", "\n", "视频强调“学问是做出来的”,学习不仅来自课堂,更源于实践与课外活动,如课程项目、编程、社团等,这些经历培养了沟通、领导力等“软实力”,对电机工程师至关重要。第7段指出,电机工程师的黄金发展期在35至55岁,个人成长轨迹各异,关键取决于实力、努力、大智与自我管理四方面,而非单纯学术成绩。第8段进一步说明,实力源于全面学习,避免过度专注;努力决定长期发展;自我技能则来自课外实践,对职业成功至关重要。第9段提到长程目标的重要性,明确目标能让人更有方向感和动力,越有清晰目标的人越容易取得成就。每个人应明确长程目标,持续提升综合能力,实现职业成长。\n" ] } ], "source": [ "# 定义初始摘要prompt模板\n", "summarization_prompt_template = \"用 300 个字以内写出这段视频文本的摘要,其中包括要点和所有重要细节:\"\n", "\n", "# 定义精炼摘要prompt模板\n", "summarization_prompt_refinement_template = \"请在 500 字以内,结合原先的摘要和新的内容,提供简洁的摘要:\"\n", "\n", "# 初始化保存摘要的列表\n", "refined_summaries = []\n", "\n", "# 对文本块逐步进行精炼摘要,并打印中间过程\n", "for index, chunk in enumerate(chunks):\n", " if index == 0:\n", " # 第一步:对第一段文本生成初始摘要\n", " print(f\"\\n========== 正在生成第 {index + 1} 段的初始摘要 ==========\\n\")\n", " print(f\"原始文本 (第 {index + 1} 段):\\n{chunk}\\n\")\n", " \n", " # 构建初始摘要prompt\n", " summarization_prompt = summarization_prompt_template.replace(\"\", chunk)\n", " \n", " # 调用摘要函数生成第一个摘要\n", " first_summary = summarization(\n", " client=client,\n", " summarization_prompt=summarization_prompt,\n", " model_name=model_name,\n", " temperature=temperature,\n", " top_p=top_p,\n", " max_tokens=max_tokens\n", " )\n", " \n", " # 打印生成的初始摘要\n", " print(f\"生成的摘要 (第 {index + 1} 段):\\n{first_summary}\\n\")\n", " \n", " # 保存生成的摘要\n", " refined_summaries.append(first_summary)\n", "\n", " else:\n", " # 后续步骤:结合前一个摘要与当前段落进行精炼\n", " print(f\"\\n========== 正在生成第 {index + 1} 段的精炼摘要 ==========\\n\")\n", " print(f\"原始文本 (第 {index + 1} 段):\\n{chunk}\\n\")\n", " \n", " # 构建精炼摘要的输入文本,将前一个摘要与当前段落内容结合\n", " chunk_with_previous_summary = f\"前 {index} 段的摘要: {refined_summaries[-1]}\\n第 {index + 1} 段的内容: {chunk}\"\n", " \n", " # 构建精炼摘要prompt\n", " summarization_prompt = summarization_prompt_refinement_template.replace(\"\", chunk_with_previous_summary)\n", " \n", " # 调用摘要函数生成精炼摘要\n", " refined_summary = summarization(\n", " client=client,\n", " summarization_prompt=summarization_prompt,\n", " model_name=model_name,\n", " temperature=temperature,\n", " top_p=top_p,\n", " max_tokens=max_tokens\n", " )\n", " \n", " # 打印生成的精炼摘要\n", " print(f\"生成的摘要 (第 {index + 1} 段):\\n{refined_summary}\\n\")\n", " \n", " # 保存生成的精炼摘要\n", " refined_summaries.append(refined_summary)\n", "\n", "# 最终的精炼摘要结果就是 refined_summaries 列表的最后一个元素\n", "final_refined_summary = refined_summaries[-1]\n", "\n", "print(\"\\n========== 最终精炼摘要结果 ==========\\n\")\n", "print(final_refined_summary)" ] }, { "cell_type": "code", "execution_count": null, "id": "d290b55d-60e1-48ec-bdf1-7c90a904af8b", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "ai", "language": "python", "name": "ai" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.12" } }, "nbformat": 4, "nbformat_minor": 5 }