diff --git a/09.Apps/OpenAI_Demo.ipynb b/09.Apps/OpenAI_Demo.ipynb index 930597c..4a588e2 100644 --- a/09.Apps/OpenAI_Demo.ipynb +++ b/09.Apps/OpenAI_Demo.ipynb @@ -54,7 +54,7 @@ { "cell_type": "markdown", "source": [ - "- OPENAI_API_KEY 加入 Clobe 環境變數後可用(上課時老師會提供一組練習用)" + "- OPENAI_API_KEY 加入 Clobe 環境變數後可用(請使用自己的測試金鑰,勿將金鑰寫入 Notebook)" ], "metadata": { "id": "a_U2KT7GDnlY" @@ -81,7 +81,7 @@ "from openai import OpenAI\n", "client = OpenAI(api_key=OPENAI_API_KEY)\n", "\n", - "system_content = \"你是一個AI助教,會用蘇格拉底教學法代替老師初步回應,如果有需要會提醒學生跟老師確認\" #@param\n", + "system_content = \"你是一個 AI 學習助理,會用蘇格拉底式提問引導學生思考;遇到課程規格或評量問題時,提醒學生查看課程公告\" #@param\n", "user_content = \"如何用python抓取api資料?\" #@param\n", "\n", "chat_completion = client.chat.completions.create(\n", @@ -116,7 +116,7 @@ "output_type": "execute_result", "data": { "text/plain": [ - "ChatCompletion(id='chatcmpl-8b6oO2LTApIXOPHjoK03pHY3hjR8S', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='嗨!很高興看到你對使用Python抓取API資料有興趣。我可以提供一些基本的指導,但請確認你的問題具體指的是哪方面的API資料,因為不同的API服務可能有不同的使用方法。\\n\\n首先,你需要使用Python來發送HTTP請求以取得API的回應。你可以使用Python的內建模組 - `requests` 來執行這些操作。你可以透過以下步驟來開始:\\n\\n1. 安裝requests模組:你可以使用`pip`工具在終端機中執行以下指令:`pip install requests` (如果你已經安裝了Anaconda,則這個模組可能已經預先安裝了)。\\n\\n2. 導入requests模組:在你的Python腳本中,請確認你匯入了requests模組,以便使用它的功能。可以使用以下語句:`import requests`。\\n\\n3. 發送HTTP請求:使用requests模組的 `get()` 函數或 `post()` 函數來發送GET或POST請求。例如,如果你想發送一個GET請求獲取API的回應,請使用以下語句:`response = requests.get(url)`,其中 `url` 是API的網址。\\n\\n4. 處理回應:一旦你收到API的回應,你可以使用response的方法,如 `status_code` 和 `json()` 來檢查回應狀態並處理回應數據。例如,你可以使用以下語句檢查回應的狀態碼:`print(response.status_code)`。\\n\\n這是一個簡單的範例來幫助你開始:\\n\\n```python\\nimport requests\\n\\ndef fetch_data_from_api(url):\\n response = requests.get(url)\\n if response.status_code == 200:\\n data = response.json()\\n # 在此處處理API回應的資料\\n else:\\n print(\"無法取得API資料,請確認URL是否正確\")\\n\\nfetch_data_from_api(\\'https://api.example.com/data\\')\\n```\\n\\n記得在使用`fetch_data_from_api`函數之前,將URL修改為你要抓取的API的URL。\\n\\n上述只是一個簡單的示例,根據你具體使用的API和所需的資料處理邏輯,你可能需要進行更多的操作。\\n\\n請記得向你的老師查證以確保你按照他們的要求進行操作。希望這對你有所幫助!如果你需要更多幫助,請隨時問我。', role='assistant', function_call=None, tool_calls=None))], created=1703855012, model='gpt-3.5-turbo-0613', object='chat.completion', system_fingerprint=None, usage=CompletionUsage(completion_tokens=784, prompt_tokens=83, total_tokens=867))" + "ChatCompletion(id='chatcmpl-8b6oO2LTApIXOPHjoK03pHY3hjR8S', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='嗨!很高興看到你對使用Python抓取API資料有興趣。我可以提供一些基本的指導,但請確認你的問題具體指的是哪方面的API資料,因為不同的API服務可能有不同的使用方法。\\n\\n首先,你需要使用Python來發送HTTP請求以取得API的回應。你可以使用Python的內建模組 - `requests` 來執行這些操作。你可以透過以下步驟來開始:\\n\\n1. 安裝requests模組:你可以使用`pip`工具在終端機中執行以下指令:`pip install requests` (如果你已經安裝了Anaconda,則這個模組可能已經預先安裝了)。\\n\\n2. 導入requests模組:在你的Python腳本中,請確認你匯入了requests模組,以便使用它的功能。可以使用以下語句:`import requests`。\\n\\n3. 發送HTTP請求:使用requests模組的 `get()` 函數或 `post()` 函數來發送GET或POST請求。例如,如果你想發送一個GET請求獲取API的回應,請使用以下語句:`response = requests.get(url)`,其中 `url` 是API的網址。\\n\\n4. 處理回應:一旦你收到API的回應,你可以使用response的方法,如 `status_code` 和 `json()` 來檢查回應狀態並處理回應數據。例如,你可以使用以下語句檢查回應的狀態碼:`print(response.status_code)`。\\n\\n這是一個簡單的範例來幫助你開始:\\n\\n```python\\nimport requests\\n\\ndef fetch_data_from_api(url):\\n response = requests.get(url)\\n if response.status_code == 200:\\n data = response.json()\\n # 在此處處理API回應的資料\\n else:\\n print(\"無法取得API資料,請確認URL是否正確\")\\n\\nfetch_data_from_api(\\'https://api.example.com/data\\')\\n```\\n\\n記得在使用`fetch_data_from_api`函數之前,將URL修改為你要抓取的API的URL。\\n\\n上述只是一個簡單的示例,根據你具體使用的API和所需的資料處理邏輯,你可能需要進行更多的操作。\\n\\n請對照教材與課程公告確認操作要求。希望這對你有所幫助!如果你需要更多幫助,請隨時問我。', role='assistant', function_call=None, tool_calls=None))], created=1703855012, model='gpt-3.5-turbo-0613', object='chat.completion', system_fingerprint=None, usage=CompletionUsage(completion_tokens=784, prompt_tokens=83, total_tokens=867))" ] }, "metadata": {}, @@ -174,7 +174,7 @@ "\n", "上述只是一個簡單的示例,根據你具體使用的API和所需的資料處理邏輯,你可能需要進行更多的操作。\n", "\n", - "請記得向你的老師查證以確保你按照他們的要求進行操作。希望這對你有所幫助!如果你需要更多幫助,請隨時問我。\n" + "請對照教材與課程公告確認操作要求。希望這對你有所幫助!如果你需要更多幫助,請隨時問我。\n" ] } ] @@ -309,7 +309,7 @@ "\n", "def text2text(system_content, user_content):\n", " client = OpenAI(api_key=OPENAI_API_KEY)\n", - " system_content = system_content if system_content is not None else \"你是一個AI助教,會用蘇格拉底教學法代替老師初步回應,如果有需要會提醒學生跟老師確認\"\n", + " system_content = system_content if system_content is not None else \"你是一個 AI 學習助理,會用蘇格拉底式提問引導學生思考;遇到課程規格或評量問題時,提醒學生查看課程公告\"\n", " user_content = user_content if user_content is not None else \"如何用python抓取api資料?\"\n", " chat_completion = client.chat.completions.create(\n", " model=\"gpt-3.5-turbo\",\n", diff --git a/README.md b/README.md index 2805aa3..df930cd 100644 --- a/README.md +++ b/README.md @@ -1,335 +1,59 @@ # MediaSystem-Python-Course -這是「多媒體系統」課程本身的共用教材庫。同一組可重用的實作素材,依學生背景組成兩條不同的教學路線:日間部從影像、音訊、視訊與互動媒體概念出發;進修部則從 Python 銜接到網路、API 與雲端應用。既有章節路徑會保留,避免舊講義與 Colab 連結失效。 +這個 repo 收錄多媒體系統 V2 學生教材包與延伸實作。V2 以影像、聲音與短影音為主線,從媒體資料表示、生成式 AI、素材溯源一路進入系統整合與成果驗證。 + +## 從這裡開始 + +- [多媒體系統 V2 學生教材包](course-115-v2/README.md) +- [單冊整合教科書](course-115-v2/textbook/MULTIMEDIA_SYSTEMS_V2.md) +- [現行課程主題](course-115-v2/CURRENT_COURSE_TOPICS.md) +- [指定用書與其他教材整合](course-115-v2/TEXTBOOK_INTEGRATION_MAP.md) +- [快速開始](docs/QUICKSTART.md) + +## 多媒體系統 V2 教材包 + +| 類型 | 位置 | 內容 | +|---|---|---| +| 整合教科書 | [多媒體系統 V2](course-115-v2/textbook/MULTIMEDIA_SYSTEMS_V2.md) | 影像、聲音、短影音與系統驗證的單冊教材 | +| 每週講義 | [`course-115-v2/weeks/`](course-115-v2/weeks/) | W01~W18 的概念、實作、作業與檢核題 | +| 程式實驗 | [`course-115-v2/labs/`](course-115-v2/labs/) | 影像、擴散、聲音與短影音處理程式 | +| Colab | [`course-115-v2/colab/`](course-115-v2/colab/) | 可在瀏覽器執行的 Notebook | +| 作業模板 | [`course-115-v2/templates/`](course-115-v2/templates/) | AI 使用、素材來源、同意紀錄與成果規準 | +| 學習指南 | [`course-115-v2/notebooklm/`](course-115-v2/notebooklm/) | 全學期學習指南 | + +## 延伸實作 + +| 主題 | 位置 | 學習內容 | +|---|---|---| +| Python 與資料處理 | [`01.Intro-Python/`](01.Intro-Python/) | Python、NumPy、Pandas 與資料視覺化 | +| Gradio | [`02.Gradio/`](02.Gradio/) | 建立互動式 AI 介面 | +| Requests 與 API | [`03.Request/`](03.Request/) | HTTP、網頁資料與開放資料 API | +| Selenium/Playwright | [`04.Selenium/`](04.Selenium/)、[`04.Playwright/`](04.Playwright/) | 動態網頁與瀏覽器自動化 | +| Flask | [`05.Flask/`](05.Flask/) | Web 應用與 RESTful API | +| LINE Bot | [`06.Line-bot-fly-flask/`](06.Line-bot-fly-flask/) | 訊息服務與雲端部署 | +| pytest | [`07.Pytest-DEMO/`](07.Pytest-DEMO/) | 單元測試與覆蓋率 | +| OpenCV/MediaPipe | [`08.OpenCV-Mediapipe-DEMO/`](08.OpenCV-Mediapipe-DEMO/) | 電腦視覺、手勢與姿態辨識 | +| 實用工具 | [`09.Apps/`](09.Apps/) | QR Code 與其他小型應用 | +| SQLite | [`10.sql/`](10.sql/) | 資料庫 CRUD | +| AI 與 LLM | [`11.AI/`](11.AI/) | Gemini、OpenAI 與 CLI 實作 | + +## 快速開始 -> 課程名稱相同,不代表必須共用同一份週次表。請先從下方選擇班別,再依課程地圖進入教材;章節編號是「素材編號」,不是兩班共同進度。 - -## 🧭 選擇你的課程 - -| 教學路線 | 核心問題 | 起點 | 課程地圖 | -|---|---|---|---| -| 日間部四技一年級:媒體素養與實作 | 數位影像、音訊、視訊如何表示、處理並成為互動作品? | 媒體基本概念 | [日間部課程地圖](courses/day/README.md) | -| 進修部一年級:Python、API 與雲端應用 | 程式如何透過網路取得資料、串接服務並部署專題? | Python 程度診斷與銜接 | [進修部課程地圖](courses/evening/README.md) | - -兩班共用的模組、先備能力與分流方式,請見[雙軌課程架構](courses/README.md)。教師可在 HackMD 維護每週公告,本 repository 則作為可執行程式、作業模板與穩定課程地圖的單一來源。 - -## 📖 目錄 - -- [📚 文檔中心](docs/) ⭐ **完整學習資源** -- [🧭 雙軌課程架構](courses/) - 日間部/進修部入口與共用原則 -- [🚀 快速啟動指南](docs/QUICKSTART.md) - 各專案快速啟動 -- [📖 學習路徑規劃](docs/LEARNING_PATH.md) - 課程學習建議 -- [🗓️ HackMD 每週教學講義](docs/HACKMD_WEEKLY_GUIDE.md) - 18 週完整教案與 GitHub 教材連結 -- [📝 更新日誌](docs/CHANGELOG.md) - 專案更新記錄 -- [範例程式碼下載](#範例程式碼下載) -- [環境設定](#-快速開始-推薦使用-uv) -- [專案說明](#相關專案摘要說明) - -## 📂 章節導覽 - -| 章節 | 主題 | 說明 | -|------|------|------| -| [01.Intro-Python](01.Intro-Python/README.md) | Python 入門與資料分析 | Python 基礎語法、NumPy、Pandas、資料視覺化 | -| [02.Gradio](02.Gradio/README.md) | 互動式 AI 介面 | 使用 Gradio 快速建立 AI 示範介面 | -| [03.Request](03.Request/README.md) | 網頁擷取與 API 存取 | Requests、BeautifulSoup、開放資料 API | -| [04.Playwright](04.Playwright/README.md) | 瀏覽器自動化爬蟲 | Playwright 動態網頁爬蟲、腳本錄製 | -| [04.Selenium](04.Selenium/README.md) | 動態網頁爬蟲 | Selenium WebDriver 進階爬蟲 | -| [05.Flask](05.Flask/README.md) | Flask 網站開發 | 從基本網站到 RESTful API | -| [06.Line-bot-fly-flask](06.Line-bot-fly-flask/README.md) | LINE Bot 部署 | 在 Fly.io 部署 LINE Bot | -| [07.Pytest-DEMO](07.Pytest-DEMO/README.md) | 自動化測試 | pytest 單元測試與覆蓋率報告 | -| [08.OpenCV-Mediapipe-DEMO](08.OpenCV-Mediapipe-DEMO/readme.md) | 電腦視覺 | OpenCV + MediaPipe 肢體辨識 | -| [09.Apps](09.Apps/README.md) | 實用應用程式 | QR Code 產生器、OpenAI 應用 | -| [10.sql](10.sql/README.md) | SQLite 資料庫 | Python 資料庫 CRUD 操作 | -| [11.AI](11.AI/README.md) | AI 與大型語言模型 | Gemini API 串接與 LLM 應用 | - -## 範例程式碼下載 -- 安裝[Git Cli](https://git-scm.com/) -- 在終端機`git clone`專案 - ```bash - git clone https://github.com/willismax/MediaSystem-Python-Course.git - cd MediaSystem-Python-Course - ``` - -## 🚀 快速開始 (推薦使用 uv) - -### 使用 uv (推薦⭐) -[uv](https://docs.astral.sh/uv/) 是新一代的 Python 套件管理工具,速度極快且使用簡單! - -#### 安裝 uv -```bash -# Windows (PowerShell) -powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" - -# macOS/Linux -curl -LsSf https://astral.sh/uv/install.sh | sh - -# 或使用安裝腳本 (Windows) -.\scripts\setup-uv.ps1 -``` - -#### 🎯 一鍵啟動腳本 - -本專案提供了方便的啟動腳本,讓您可以快速開始學習: - -**Windows (PowerShell)** -```powershell -# 啟動 Flask 應用 -.\scripts\run-flask.ps1 - -# 啟動 Jupyter Notebook -.\scripts\run-jupyter.ps1 - -# 在特定目錄啟動 Jupyter -.\scripts\run-jupyter.ps1 -Path "11.AI" -``` - -**Linux/macOS** -```bash -# 給予執行權限(首次使用) -chmod +x scripts/*.sh - -# 啟動 Flask 應用 -./scripts/run-flask.sh - -# 啟動 Jupyter Notebook -./scripts/run-jupyter.sh - -# 在特定目錄啟動 Jupyter -./scripts/run-jupyter.sh "11.AI" -``` - -詳細的腳本使用說明請參考 [scripts/README.md](scripts/README.md) - -#### 使用 uv 執行專案 -```bash -# 方法 1: 使用 uv run 直接執行 (自動管理環境) -cd 05.Flask/flask01 -uv run app.py - -# 方法 2: 執行 Jupyter Notebook -cd 03.Request -uv run --with jupyter jupyter notebook 網頁擷取_Request.ipynb - -# 方法 3: 安裝特定套件後執行 -uv run --with flask --with requests python app.py -``` - -#### 為子專案建立虛擬環境 (可選) -```bash -# 進入特定專案目錄 -cd 05.Flask - -# 使用 uv 建立虛擬環境並安裝套件 -uv venv -uv pip install -r requirements.txt - -# 啟動虛擬環境 -# Windows -.venv\Scripts\activate - -# macOS/Linux -source .venv/bin/activate - -# 執行應用 -python app.py -``` - -#### uv 常用指令 ```bash -# 安裝套件 -uv pip install flask pandas requests - -# 從 requirements.txt 安裝 -uv pip install -r requirements.txt - -# 列出已安裝套件 -uv pip list - -# 執行 Python 腳本 (自動處理依賴) -uv run script.py - -# 執行 Python 互動式介面 -uv run python -``` - ---- - -## 傳統方法 (3 選 1) - -### 方法 1: 使用 Python 內建的虛擬機 `venv` -- [官方說明](https://docs.python.org/zh-tw/3.10/tutorial/venv.html) -- 建虛擬機 venv - ```bash - python -m venv venv - ``` -- 啟動 VM - ```bash - # Windows - .\venv\Scripts\activate - - # macOS/Linux - source venv/bin/activate - ``` -- 安裝相關套件 - ```bash - pip install -r requirements.txt - ``` -- 離開 VM - ```bash - deactivate - ``` - -### 方法 2: 使用 pipenv 虛擬環境+套件管理 -- pipenv (需先 `pip install pipenv`,並在本機安裝對應的 Python 版本) - ```bash - pipenv --python 3.10 - ``` -- 建立好資料夾要 CD 切換路徑 - ```bash - cd MediaSystem-Python-Course - ``` -- 在 pipenv 安裝相依套件 - - 以 requirements.txt 裝: - ```bash - pipenv install -r requirements.txt - ``` - 以 Pipfile 裝: - ```bash - pipenv sync - ``` -- 進入環境執行服務 - ```bash - pipenv shell - python app.py - - # 或未進入虛擬環境由本機執行 - pipenv run python app.py - ``` -- 移除虛擬環境 - ```bash - pipenv --rm - ``` - -### 方法 3: 直接使用系統 Python (不推薦) -```bash -pip install -r requirements.txt -python app.py -``` - -# -## 相關專案摘要說明 - -### 01.Intro-Python -- 課程使用到的ipynb檔,在Colab執行 - -### 02.Gradio -- 可在Colab建立GUI,輔助課程使用 - -### 03.Request -- 網頁擷取與 API 資料存取教學 -- 包含使用 Requests 函式庫進行網頁擷取 -- 介紹如何存取開放資料 (Open Data) API -- 範例檔案包括: - - `網頁擷取_Request.ipynb`: 基礎網頁擷取 - - `擷取API資料.ipynb`: API 資料存取 - - `RequestsOpenData_HW.ipynb`: 開放資料實作練習 - -### 04.Selenium -- 需自行下載 webkit 等 Driver 測試,為進階爬蟲教學 -- 適用於需要執行 JavaScript 的動態網頁爬蟲 - -### 04.Playwright -- 可錄製腳本抓 HTML,再自己客製化 -- 新一代的網頁自動化工具,支援多種瀏覽器 - -### 05.Flask -- 從基本網站服務到建立基本API - -### 06.LINE-Bot-on-Fly -- 在 Fly.io 建立 LINE Bot ,服務以 Flask 框架實現,並包含 API 測試 -- 在`config.py`填入相關tocken -- 服務包含: - - LINE 訊息傳送 (需LINE Channel acess token、Channel secret、LINE user id) - - LINE 文字與圖片訊息增加至 HackMD (需HackMD API、Imgure API) - - LINE 文字訊息翻譯 - - LINE 文字訊息由 OpenAI 回應,並且記錄於 HhackMD (需OpenAI API) - -- 建立 Tasks API 測試: - - [![Run in Postman](https://run.pstmn.io/button.svg)](https://god.gw.postman.com/run-collection/1745585-89afac06-ad51-4fc8-83c0-c26ccf8db7b9?action=collection%2Ffork&collection-url=entityId%3D1745585-89afac06-ad51-4fc8-83c0-c26ccf8db7b9%26entityType%3Dcollection%26workspaceId%3D9132735b-dff0-46b8-8852-839d022a2ac3) - - Get, Post, Put, Delete測試 - -### 07.Pytest-DEMO -- 簡易的 pytest demo,寫好在終端機下`pytest`指令測試 -- 另外也裝`pytest-cov`套件的話,`pytest --cov=./`可以測試覆蓋率Coverage - ``` - pytest --cov=./ - 或 - pytest --cov-report=html - ``` -### 08.OpenCV-Mediapipe-DEMO -- Mediapipe 簡易操作 -- 電腦視覺應用示範 -- 建議使用 pipenv 虛擬環境,Python 3.8 以上版本 - -### 09.Apps -- 實用應用程式範例 -- 包含 QRCode 產生器等工具 -- `QRCode.ipynb`: 在 Colab 上製作 QR Code - - 可製作純黑白 QR Code - - 可加入背景圖片製作彩色或黑白 QR Code - - 支援 GIF 動態背景 - -### 10.sql -- SQLite 資料庫基礎教學 -- `SQLite資料庫CRUD.ipynb`: 涵蓋資料庫的建立、查詢、更新、刪除等基本操作 -- 適合初學者學習資料庫概念與 SQL 語法 - -### 11.AI -- AI 與大型語言模型 (LLM) 相關教學 -- Gemini API 串接實作 -- 範例檔案: - - `動手串接_LLM_API_入門教學(Gemini_).ipynb`: Gemini API 入門教學 - - `在_Colab_終端機使用_Gemini_CLI.ipynb`: 在 Colab 環境使用 Gemini CLI - - `gemini_cli_colab_tutorial.ipynb`: Gemini CLI 完整教學 -- OpenAI API 應用範例 - -## 注意事項 -- 請配合課程使用,歡迎 issue 討論或發 PR (Pull Request) -- [如何發PR | W3HexSchool](https://w3c.hexschool.com/git/cc7d70b7) - -## 🌟 為什麼推薦使用 uv? - -1. **極快的速度**: 比 pip 快 10-100 倍 -2. **簡單易用**: 單一指令即可安裝和執行 -3. **智能依賴管理**: 自動解析和安裝依賴 -4. **跨平台一致性**: Windows、macOS、Linux 使用體驗一致 -5. **無需預先安裝 Python**: uv 可以自動下載所需的 Python 版本 -6. **零配置**: 不需要額外的配置文件即可開始使用 - -### 速度對比範例 - -```bash -# 傳統方式 (約 30-60 秒) -python -m venv venv -.\venv\Scripts\activate -pip install -r requirements.txt - -# uv 方式 (約 3-5 秒) ⚡ +git clone https://github.com/willismax/MediaSystem-Python-Course.git +cd MediaSystem-Python-Course uv venv -uv pip install -r requirements.txt +uv pip install -r course-115-v2/labs/requirements.txt ``` -## 📚 更多資源 +也可以依各章節的 `README.md` 或 Notebook 安裝需要的套件。不要把 API 金鑰、密碼、Cookie 或個人資料提交到 repo。 -- [uv 官方文檔](https://docs.astral.sh/uv/) -- [Python 官方教學](https://docs.python.org/zh-tw/3/) -- [Flask 官方文檔](https://flask.palletsprojects.com/) -- [LINE Messaging API 文檔](https://developers.line.biz/en/docs/messaging-api/) +## 學習與繳交 -## 💬 問題反饋 +1. 先閱讀整合教科書與對應週講義,再執行程式或 Notebook。 +2. 修改一個變因,保留輸入、參數、輸出與比較結果。 +3. 記錄失敗案例、限制、素材來源與 AI 協作內容。 +4. 公開作品前,確認著作權、肖像、聲音、個資與生成內容揭露。 +5. 遇到問題時,附上可重現步驟、錯誤訊息與執行環境。 -如有任何問題或建議,歡迎: -- 開啟 [Issue](https://github.com/willismax/MediaSystem-Python-Course/issues) -- 提交 [Pull Request](https://github.com/willismax/MediaSystem-Python-Course/pulls) -- 參考 [如何發 PR 教學](https://w3c.hexschool.com/git/cc7d70b7) +問題或教材修正可透過 [Issue](https://github.com/willismax/MediaSystem-Python-Course/issues) 提出。 diff --git a/course-115-v2/CURRENT_COURSE_TOPICS.md b/course-115-v2/CURRENT_COURSE_TOPICS.md new file mode 100644 index 0000000..756d576 --- /dev/null +++ b/course-115-v2/CURRENT_COURSE_TOPICS.md @@ -0,0 +1,57 @@ +# 多媒體系統 V2|現行課程主題 + +本教材以影像、聲音與短影音為三種主要媒體,並以資料表示、生成式 AI、素材溯源與系統驗證串起完整流程。W01~W18 是課程的實施順序;閱讀教科書時,應以四個主題模組理解內容之間的關係。 + +## 四個主題模組 + +| 模組 | 現行課程主題 | 對應週次 | 主要成果 | +|---|---|---|---| +| A|多媒體資料與影像基礎 | 媒體管線、取樣與量化、像素、色彩、格式、壓縮、卷積與頻域觀念 | W01~W03 | 媒體拆解圖、影像參數實驗、濾鏡比較 | +| B|生成影像與視覺敘事 | 擴散模型、潛在空間、提示控制、LoRA、影像一致性與技術說明 | W04~W08 | 可重現提示實驗、影像故事組、期中技術說明 | +| C|數位聲音與語音 | 波形、取樣率、FFT、STFT、聲音剪輯、語音合成、聲音深偽與證據判讀 | W10~W12 | 頻譜觀察、聲音重製、合成/真實聲音比較 | +| D|短影音與系統整合 | 分鏡、時間軸、素材溯源、FFmpeg、編碼與容器、測試、發表與封存 | W13~W18 | 直式短影音、素材紀錄、測試證據與可重現專題包 | + +W09 是期中整理與評量節點,不另立新的內容模組。 + +## 現行課程主題 + +| 週次 | 所屬模組 | 核心問題 | 技術內容 | 學習成果 | +|---:|---|---|---|---| +| W01 | A | 什麼才算一個多媒體系統? | 媒體管線、Markdown、素材與 AI 紀錄 | 個人課程筆記與媒體拆解圖 | +| W02 | A | 一張圖片在電腦裡是什麼? | 像素、RGB/RGBA、解析度、色彩深度、格式與壓縮 | 圖片參數實驗 | +| W03 | A | 濾鏡為什麼能找出邊緣? | Pillow、NumPy、OpenCV、卷積核、模糊、銳化與邊界 | CPU 影像濾鏡實驗 | +| W04 | B | AI 如何從雜訊生成圖片? | DDPM、前向加噪、反向去噪、U-Net 與時間步 | 擴散過程模擬與概念卡 | +| W05 | B | 文字如何控制生成影像? | VAE、潛在擴散、文字編碼、交叉注意力、CFG 與 seed | 可重現的提示實驗 | +| W06 | B | 影像微調改變了什麼? | 資料集、過擬合、DreamBooth 概念與 LoRA 低秩更新 | 微調企畫與資料卡 | +| W07 | B | 如何做出一致而可信的影像系列? | 風格規格、構圖、生成後處理、版本與來源 | 3~6 張影像故事組 | +| W08 | B | 如何說明作品背後的技術選擇? | 影像模組統整、比較證據與口頭說明 | 期中影像作品與技術說明 | +| W09 | 節點 | 如何整理前半段的學習證據? | 依課程公告完成評量與整理 | 無新增技術內容 | +| W10 | C | 聲音如何變成可以運算的數字? | 取樣率、位元深度、Nyquist、波形、FFT 與 STFT | 聲音與頻譜觀察 | +| W11 | C | 剪輯聲音時實際改變了什麼? | 裁切、淡入淡出、正規化、濾波、變速與變調 | 聲音重製練習 | +| W12 | C | 聲音深偽如何生成,又如何判讀風險? | TTS、梅爾頻譜、vocoder、speaker embedding 與 voice conversion | 合成/真實聲音比較與揭露卡 | +| W13 | D | 短影音如何形成可理解的時間敘事? | 分鏡、時間軸、FPS、畫面比例、節奏與字幕 | 15~30 秒分鏡與腳本 | +| W14 | D | 如何建立可追溯的素材庫? | 影像、旁白、音效、字幕、metadata 與 provenance | 專題素材包 | +| W15 | D | 影片如何被合成與壓縮? | FFmpeg、MoviePy、container、codec、bitrate、keyframe 與 GOP | 720×1280 粗剪版 | +| W16 | D | 作品是否已經成為一個系統? | 管線整合、錯誤處理、測試與進度說明 | Rough cut、架構圖與風險清單 | +| W17 | D | 如何讓技術說明可以被檢驗? | 成果發表、個人口頭問答與同儕回饋 | 完整作品與答辯 | +| W18 | D | 如何把成果整理成可重現的專題? | 互評、反思、README、AI 使用紀錄與封存 | 成品與完整專題包 | + +## 學習成果 + +完成四個模組後,學生應能: + +1. 說明影像、聲音與影片的取樣、量化、壓縮及時間結構。 +2. 使用 Python 與常見媒體工具完成基本處理,並保留可重現的輸入、參數與輸出。 +3. 說明生成影像與語音合成的基本管線,不把服務介面當成模型原理。 +4. 比較至少一組控制變因實驗,根據結果說明技術選擇與限制。 +5. 以 FFmpeg 或 MoviePy 組合影像、聲音、字幕與影片,完成短影音作品。 +6. 記錄素材來源、同意、AI 協作與後製過程,辨識可能造成誤認或侵害權利的發布風險。 +7. 以架構圖、測試結果、失敗案例與 README 說明作品如何運作。 + +## 執行環境 + +所有基礎練習均提供 CPU 路徑。需要較多算力的生成或微調,可先使用預先產生的結果理解參數,再視情況使用免費 Colab GPU。GPU 配額與商業服務不是完成教材的必要條件。 + +## 學習方式 + +每個主題依「問題 → 原理 → 小型實驗 → 創作 → 驗證」前進。至少改變一個參數、觀察一個結果、提出一個解釋,並留下素材來源與可重現紀錄。 diff --git a/course-115-v2/README.md b/course-115-v2/README.md new file mode 100644 index 0000000..d65ab64 --- /dev/null +++ b/course-115-v2/README.md @@ -0,0 +1,36 @@ +# 多媒體系統 V2|學生教材包 + +這個教材包以影像、聲音與短影音為主線,包含單冊教科書、現行課程主題、每週講義、程式實驗、Colab、圖解與作業模板。內容可直接用於閱讀、練習、專題製作與成果整理。 + +## 建議入口 + +1. [閱讀單冊整合教科書](textbook/MULTIMEDIA_SYSTEMS_V2.md) +2. [查看現行課程主題](CURRENT_COURSE_TOPICS.md) +3. [了解指定用書如何接入 V2](TEXTBOOK_INTEGRATION_MAP.md) +4. [依主題或檔案類型找到教材](STUDENT_MATERIALS_INDEX.md) +5. [從 W01 週講義開始](weeks/W01_課程啟動與多媒體系統.md) + +## 教材包內容 + +| 類型 | 位置 | 用途 | +|---|---|---| +| 整合教科書 | `textbook/` | 依四個主題模組串起影像、聲音與短影音 | +| 現行課程主題 | `CURRENT_COURSE_TOPICS.md` | 說明主題架構與 W01~W18 實施順序 | +| 用書整合表 | `TEXTBOOK_INTEGRATION_MAP.md` | 將指定用書與 repo 其他教材重新安排到 V2 主線 | +| 每週講義 | `weeks/` | 概念、實驗、練習、繳交與檢核題 | +| CPU 實驗 | `labs/` | 影像、擴散、聲音與短影音程式 | +| Colab | `colab/` | 對應的瀏覽器 Notebook | +| 教學圖解 | `assets/` | 媒體資料、模型與系統流程圖 | +| 學習指南 | `notebooklm/` | 全學期學習指南 | +| 作業模板 | `templates/` | AI 使用、素材來源、同意紀錄與成果評量 | + +## 四個主題模組 + +- **多媒體資料與影像基礎**:從媒體管線、取樣與像素開始,完成影像讀取、格式比較及卷積實驗。 +- **生成影像與視覺敘事**:理解擴散模型、提示控制與 LoRA,完成可重現的影像故事組。 +- **數位聲音與語音**:以波形、頻譜與聲音處理理解音訊,再討論語音合成與深偽風險。 +- **短影音與系統整合**:把腳本、素材、聲音、字幕、編碼、測試與發布紀錄組成可重現作品。 + +## 使用方式 + +先讀教科書的對應主題,再進入週講義完成實驗。基礎練習均提供 CPU 路徑;延伸挑戰可依設備與專題方向選做。提交前應保留輸入、參數、輸出、失敗案例、素材來源、同意紀錄與 AI 協作內容。 diff --git a/course-115-v2/STUDENT_MATERIALS_INDEX.md b/course-115-v2/STUDENT_MATERIALS_INDEX.md new file mode 100644 index 0000000..76a427c --- /dev/null +++ b/course-115-v2/STUDENT_MATERIALS_INDEX.md @@ -0,0 +1,33 @@ +# 多媒體系統 V2|學生教材索引 + +## 核心文件 + +| 文件 | 內容 | +|---|---| +| [教材包首頁](README.md) | V2 使用方式與教材分類 | +| [整合教科書](textbook/MULTIMEDIA_SYSTEMS_V2.md) | 影像、聲音與短影音的單冊教材 | +| [現行課程主題](CURRENT_COURSE_TOPICS.md) | 四個主題模組與 W01~W18 實施順序 | +| [指定用書整合表](TEXTBOOK_INTEGRATION_MAP.md) | 指定用書與 repo 其他教材的重排結果 | +| [課程主要來源](references.md) | 論文與官方文件 | + +## 學習材料 + +| 類型 | 位置 | 數量/說明 | +|---|---|---| +| 學生講義 | `weeks/` | W01~W18,共 18 份 Markdown | +| CPU 程式 | `labs/` | 影像、擴散、聲音與短影音,共 6 份 | +| Colab | `colab/` | 對應 6 份 Notebook | +| 教材圖像 | `assets/diagrams/` | 講義與教科書使用的圖解 | +| 學習指南 | `notebooklm/` | 全學期學習指南 | +| 評量與紀錄 | `templates/` | 素材表、同意紀錄、成果規準與 AI 使用紀錄 | + +## 依主題進入 + +| 現行課程主題 | 週次 | 主要材料 | +|---|---|---| +| 多媒體資料與影像基礎 | W01~W03 | `weeks/W01`~`W03`、`labs/w02`~`w03`、`colab/W02`~`W03` | +| 生成影像與視覺敘事 | W04~W08 | `weeks/W04`~`W08`、`labs/w04_diffusion_forward.py`、`colab/W04_Diffusion_Forward.ipynb` | +| 數位聲音與語音 | W10~W12 | `weeks/W10`~`W12`、`labs/w10`~`w11`、`colab/W10`~`W11` | +| 短影音與系統整合 | W13~W18 | `weeks/W13`~`W18`、`labs/w15_make_short.py`、`colab/W15_Make_Short.ipynb`、`templates/` | + +W09 是期中整理與評量節點。每週最低要求與安全規範以 `weeks/` 內的學生講義為準。 diff --git a/course-115-v2/TEXTBOOK_INTEGRATION_MAP.md b/course-115-v2/TEXTBOOK_INTEGRATION_MAP.md new file mode 100644 index 0000000..7754374 --- /dev/null +++ b/course-115-v2/TEXTBOOK_INTEGRATION_MAP.md @@ -0,0 +1,41 @@ +# 多媒體系統 V2|現行課程主題與指定用書整合 + +現行課程以影像、聲音與短影音為主線。指定用書原本依影像處理章次與週次排列,V2 改依概念在多媒體系統中的作用重新編排。相同章節可以支援不同媒體,但跨媒體使用時必須重新確認資料單位、參數與限制。 + +## 重排原則 + +- 現行課程主題決定學習順序,指定用書提供概念與方法支援。 +- 取樣、頻域、壓縮、可重現流程與安全可以跨影像、聲音及影片使用。 +- 生成影像、語音合成、FFmpeg 與短影音敘事以 V2 週講義為主要教材。 +- 影像偽裝與加密保留為安全延伸,不列入短影音專題的最低要求。 + +## 指定用書的新閱讀順序 + +| 閱讀單元 | 重排後內容 | 指定用書配套講義 | 接入現行課程的方式 | +|---|---|---|---| +| 1|系統與工具 | 多媒體輸入、處理、輸出、Python 與可重現紀錄 | [CH01 數位媒體介紹](https://hackmd.io/a6IEdT8rRumRxrTDIRImRQ)、[Python 與 AI 協作](https://hackmd.io/rJDO25vqQbq_g5B6GeAKGg)、[可重複使用的處理流程](https://hackmd.io/-hhiSd8AQT-p3Js5fRm1-g) | 支援 W01、W03、W16 與 W18 的管線、環境及重跑紀錄。 | +| 2|影像資料 | 取樣、量化、像素、色彩、矩陣、格式與壓縮 | [取樣、量化與影像格式](https://hackmd.io/LIgP3rEKQb61yaxJHCcStA)、[像素、色彩與矩陣](https://hackmd.io/v-yUNMzqSuSIXgKRL-O6ag)、[壓縮與壓縮痕跡](https://hackmd.io/hwMXI-0BRIq8nTbSX97p_g) | 直接支援 W02,並作為影片影格與輸出品質的先備概念。 | +| 3|影像運算 | 卷積、邊緣、傅立葉轉換與頻率濾波 | [卷積、濾波與邊緣](https://hackmd.io/iQAy6_NqSdGzGIB31m_1jw)、[傅立葉轉換與頻譜](https://hackmd.io/kQLfdWczRDOHM3KghYyFiA)、[頻率濾波與比較](https://hackmd.io/M7EvMkgzRUiJ-OLGOPei5Q) | 直接支援 W03;頻域內容也支援 W10~W11 的聲音類比。 | +| 4|生成與評估 | 參數紀錄、品質比較、資料風險與視覺安全 | [安全與效能評估](https://hackmd.io/46q9JgBgSDertq2fjnGfug)、[多媒體應用與視覺安全](https://hackmd.io/zV7psmnJTeKQt2DzFPvm8A) | 支援 W04~W08 的生成實驗設計、資料卡與作品說明;模型原理以 V2 講義為準。 | +| 5|聲音與語音 | 取樣、頻譜、濾波、流程驗證與合成風險 | 取樣、傅立葉、頻率濾波、流程與安全章節 | 以跨媒體方式支援 W10~W12;音訊公式、API 與模型細節以 V2 講義為準。 | +| 6|短影音與發布 | 影格壓縮、處理流程、效能、安全與成果展示 | 壓縮、流程、安全、[期末整合展示](https://hackmd.io/u6S09L95QsKOC9pSOJa5Iw)、[附錄與繳交模板](https://hackmd.io/aCrFmb1cRBi-M_Lmb9dXUA) | 支援 W13~W18 的輸出品質、素材紀錄、測試、README 與封存。 | +| 7|安全延伸 | 有損式、無損式與加密影像偽裝 | [有損式影像偽裝](https://hackmd.io/s0gF1_7ySLeeDwwF30d8HA)、[無損式影像偽裝](https://hackmd.io/DACIlFaKTRiHCwGqspw0dQ)、[加密影像偽裝](https://hackmd.io/IQ2nAhcdS8uaF7g-CrWlAw) | 作為 W14、W16 或專題的選讀內容,不列入所有學生的必做路徑。 | + +## 現行課程主題對照 + +| 現行課程主題 | 對應週次 | 指定用書整合內容 | Repo 其他學生教材 | 整合後的學習證據 | +|---|---|---|---|---| +| 多媒體資料與影像基礎 | W01~W03 | 系統、取樣、像素、卷積、頻域、格式與壓縮 | [`media/image`](../media/image/)、[`01.Intro-Python`](../01.Intro-Python/)、[`08.OpenCV-Mediapipe-DEMO`](../08.OpenCV-Mediapipe-DEMO/) | 媒體拆解圖、影像資訊表、控制變因濾鏡比較 | +| 生成影像與視覺敘事 | W04~W08 | 可重現流程、安全與效能評估 | [`11.AI`](../11.AI/)、[`09.Apps/OpenAI_Demo.ipynb`](../09.Apps/OpenAI_Demo.ipynb) | seed/參數紀錄、資料卡、影像故事組與技術說明 | +| 數位聲音與語音 | W10~W12 | 取樣、傅立葉、濾波、流程與安全的跨媒體類比 | [`media/audio`](../media/audio/)、[`media/ethics`](../media/ethics/) | 波形與頻譜比較、聲音重製、深偽證據分級 | +| 短影音與系統整合 | W13~W18 | 壓縮、可重現流程、安全、成果展示與附錄模板 | [`media/video`](../media/video/)、[`media/ethics`](../media/ethics/)、[`07.Pytest-DEMO`](../07.Pytest-DEMO/) | 分鏡、素材表、粗剪、測試結果、成品與 README | + +## 內容邊界 + +指定用書中的影像公式不能直接替代音訊或影片公式。例如,影像的二維卷積與聲音的一維卷積共享局部加權概念,但軸的意義、邊界處理與評估方式不同。跨媒體類比用來建立概念橋梁,實作仍應回到各媒體講義與工具文件。 + +服務介面、免費額度、模型名稱及 GPU 可用性可能變動。教材保留原理、參數與驗證方法;使用服務前應查看官方文件。 + +## 來源版本 + +本整合表依 2026 年 8 月 9 日的「多媒體系統:數位影像處理與視覺安全」配套講義,以及 repo 內現行學生教材整理。 diff --git a/course-115/assets/GENERATED_IMAGES.md b/course-115-v2/assets/GENERATED_IMAGES.md similarity index 88% rename from course-115/assets/GENERATED_IMAGES.md rename to course-115-v2/assets/GENERATED_IMAGES.md index fffea13..a341042 100644 --- a/course-115/assets/GENERATED_IMAGES.md +++ b/course-115-v2/assets/GENERATED_IMAGES.md @@ -1,6 +1,6 @@ -# 教學圖像生成紀錄 +# 教材圖像生成紀錄 -本資料夾內的教學圖像於 2026-08-10 透過 Codex 內建的 ChatGPT 圖像生成工具建立。原始提示要求 16:9、深色高對比、技術流程可視化、無品牌與無真人。精確名詞、公式與限制以每週講義文字為準,圖像只作概念導引。 +本資料夾內的教材圖像於 2026-08-10 透過 Codex 內建的 ChatGPT 圖像生成工具建立。原始提示要求 16:9、深色高對比、技術流程可視化、無品牌與無真人。精確名詞、公式與限制以每週講義文字為準,圖像只作概念導引。 | 原始生成檔 | 教材用途 | 對應檔案 | |---|---|---| @@ -17,5 +17,5 @@ - 圖中數字是流程順序,不是固定參數。 - 生成圖可能為了可視性簡化比例與連線,不能取代論文架構或實際程式輸出。 -- 課堂引用圖片時,請保留生成內容揭露;不要把示意畫面當成真實量測結果。 +- 使用圖片時,請保留生成內容揭露;不要把示意畫面當成真實量測結果。 diff --git a/course-115/assets/diagrams/audio-editing.png b/course-115-v2/assets/diagrams/audio-editing.png similarity index 100% rename from course-115/assets/diagrams/audio-editing.png rename to course-115-v2/assets/diagrams/audio-editing.png diff --git a/course-115/assets/diagrams/audio-sampling-stft.png b/course-115-v2/assets/diagrams/audio-sampling-stft.png similarity index 100% rename from course-115/assets/diagrams/audio-sampling-stft.png rename to course-115-v2/assets/diagrams/audio-sampling-stft.png diff --git a/course-115/assets/diagrams/convolution.png b/course-115-v2/assets/diagrams/convolution.png similarity index 100% rename from course-115/assets/diagrams/convolution.png rename to course-115-v2/assets/diagrams/convolution.png diff --git a/course-115/assets/diagrams/course-map.png b/course-115-v2/assets/diagrams/course-map.png similarity index 100% rename from course-115/assets/diagrams/course-map.png rename to course-115-v2/assets/diagrams/course-map.png diff --git a/course-115/assets/diagrams/diffusion-process.png b/course-115-v2/assets/diagrams/diffusion-process.png similarity index 100% rename from course-115/assets/diagrams/diffusion-process.png rename to course-115-v2/assets/diagrams/diffusion-process.png diff --git a/course-115/assets/diagrams/final-project-pipeline.png b/course-115-v2/assets/diagrams/final-project-pipeline.png similarity index 100% rename from course-115/assets/diagrams/final-project-pipeline.png rename to course-115-v2/assets/diagrams/final-project-pipeline.png diff --git a/course-115/assets/diagrams/image-showcase.png b/course-115-v2/assets/diagrams/image-showcase.png similarity index 100% rename from course-115/assets/diagrams/image-showcase.png rename to course-115-v2/assets/diagrams/image-showcase.png diff --git a/course-115/assets/diagrams/image-story-workflow.png b/course-115-v2/assets/diagrams/image-story-workflow.png similarity index 100% rename from course-115/assets/diagrams/image-story-workflow.png rename to course-115-v2/assets/diagrams/image-story-workflow.png diff --git a/course-115/assets/diagrams/latent-diffusion.png b/course-115-v2/assets/diagrams/latent-diffusion.png similarity index 100% rename from course-115/assets/diagrams/latent-diffusion.png rename to course-115-v2/assets/diagrams/latent-diffusion.png diff --git a/course-115/assets/diagrams/lora.png b/course-115-v2/assets/diagrams/lora.png similarity index 100% rename from course-115/assets/diagrams/lora.png rename to course-115-v2/assets/diagrams/lora.png diff --git a/course-115/assets/diagrams/media-provenance.png b/course-115-v2/assets/diagrams/media-provenance.png similarity index 100% rename from course-115/assets/diagrams/media-provenance.png rename to course-115-v2/assets/diagrams/media-provenance.png diff --git a/course-115/assets/diagrams/pixel-rgb.png b/course-115-v2/assets/diagrams/pixel-rgb.png similarity index 100% rename from course-115/assets/diagrams/pixel-rgb.png rename to course-115-v2/assets/diagrams/pixel-rgb.png diff --git a/course-115/assets/diagrams/short-video-storyboard.png b/course-115-v2/assets/diagrams/short-video-storyboard.png similarity index 100% rename from course-115/assets/diagrams/short-video-storyboard.png rename to course-115-v2/assets/diagrams/short-video-storyboard.png diff --git a/course-115/assets/diagrams/video-codec-gop.png b/course-115-v2/assets/diagrams/video-codec-gop.png similarity index 100% rename from course-115/assets/diagrams/video-codec-gop.png rename to course-115-v2/assets/diagrams/video-codec-gop.png diff --git a/course-115/assets/diagrams/voice-synthesis-safety.png b/course-115-v2/assets/diagrams/voice-synthesis-safety.png similarity index 100% rename from course-115/assets/diagrams/voice-synthesis-safety.png rename to course-115-v2/assets/diagrams/voice-synthesis-safety.png diff --git a/course-115/colab/W02_Image_Basics.ipynb b/course-115-v2/colab/W02_Image_Basics.ipynb similarity index 100% rename from course-115/colab/W02_Image_Basics.ipynb rename to course-115-v2/colab/W02_Image_Basics.ipynb diff --git a/course-115/colab/W03_Convolution.ipynb b/course-115-v2/colab/W03_Convolution.ipynb similarity index 100% rename from course-115/colab/W03_Convolution.ipynb rename to course-115-v2/colab/W03_Convolution.ipynb diff --git a/course-115/colab/W04_Diffusion_Forward.ipynb b/course-115-v2/colab/W04_Diffusion_Forward.ipynb similarity index 100% rename from course-115/colab/W04_Diffusion_Forward.ipynb rename to course-115-v2/colab/W04_Diffusion_Forward.ipynb diff --git a/course-115/colab/W10_Audio_Spectrum.ipynb b/course-115-v2/colab/W10_Audio_Spectrum.ipynb similarity index 100% rename from course-115/colab/W10_Audio_Spectrum.ipynb rename to course-115-v2/colab/W10_Audio_Spectrum.ipynb diff --git a/course-115/colab/W11_Audio_Edit.ipynb b/course-115-v2/colab/W11_Audio_Edit.ipynb similarity index 100% rename from course-115/colab/W11_Audio_Edit.ipynb rename to course-115-v2/colab/W11_Audio_Edit.ipynb diff --git a/course-115/colab/W15_Make_Short.ipynb b/course-115-v2/colab/W15_Make_Short.ipynb similarity index 100% rename from course-115/colab/W15_Make_Short.ipynb rename to course-115-v2/colab/W15_Make_Short.ipynb diff --git a/course-115/hackmd.book.md b/course-115-v2/hackmd.book.md similarity index 84% rename from course-115/hackmd.book.md rename to course-115-v2/hackmd.book.md index da820f8..92e8305 100644 --- a/course-115/hackmd.book.md +++ b/course-115-v2/hackmd.book.md @@ -1,5 +1,9 @@ # 課程教材清單 +## 課程導讀 + +- [多媒體系統 V2|現行課程主題與指定用書整合](https://github.com/willismax/MediaSystem-Python-Course/blob/course-115-complete-materials/course-115-v2/TEXTBOOK_INTEGRATION_MAP.md) + ## weeks - [W01|先拆解,再創作:多媒體系統與 HackMD](https://hackmd.io/@wiimax/SJG50wvLzl) @@ -10,7 +14,7 @@ - [W06|影像微調到底改了什麼?](https://hackmd.io/@wiimax/BkHL9RPv8Ge) - [W07|生成影像工作室:一致性比單張漂亮更重要](https://hackmd.io/@wiimax/r1wcCwwUfl) - [W08|期中影像展:把「我覺得好看」變成可說明的技術判斷](https://hackmd.io/@wiimax/r1uqCvwIfx) -- [W09|期中考週:不授新課](https://hackmd.io/@wiimax/HyFcRPvLzx) +- [W09|期中整理與評量](https://hackmd.io/@wiimax/HyFcRPvLzx) - [W10|聲音如何變成可以運算的數字?](https://hackmd.io/@wiimax/S1qcRvP8Mg) - [W11|剪輯聲音時,實際改變了什麼?](https://hackmd.io/@wiimax/ry59CDwUGg) - [W12|聲音深偽如何生成,又如何辨識風險?](https://hackmd.io/@wiimax/SyEj9AwPUfx) diff --git a/course-115/labs/requirements.txt b/course-115-v2/labs/requirements.txt similarity index 100% rename from course-115/labs/requirements.txt rename to course-115-v2/labs/requirements.txt diff --git a/course-115/labs/w02_image_basics.py b/course-115-v2/labs/w02_image_basics.py similarity index 100% rename from course-115/labs/w02_image_basics.py rename to course-115-v2/labs/w02_image_basics.py diff --git a/course-115/labs/w03_convolution.py b/course-115-v2/labs/w03_convolution.py similarity index 100% rename from course-115/labs/w03_convolution.py rename to course-115-v2/labs/w03_convolution.py diff --git a/course-115/labs/w04_diffusion_forward.py b/course-115-v2/labs/w04_diffusion_forward.py similarity index 100% rename from course-115/labs/w04_diffusion_forward.py rename to course-115-v2/labs/w04_diffusion_forward.py diff --git a/course-115/labs/w10_audio_spectrum.py b/course-115-v2/labs/w10_audio_spectrum.py similarity index 100% rename from course-115/labs/w10_audio_spectrum.py rename to course-115-v2/labs/w10_audio_spectrum.py diff --git a/course-115/labs/w11_audio_edit.py b/course-115-v2/labs/w11_audio_edit.py similarity index 100% rename from course-115/labs/w11_audio_edit.py rename to course-115-v2/labs/w11_audio_edit.py diff --git a/course-115/labs/w15_make_short.py b/course-115-v2/labs/w15_make_short.py similarity index 100% rename from course-115/labs/w15_make_short.py rename to course-115-v2/labs/w15_make_short.py diff --git a/course-115/notebooklm/NotebookLM_Study_Guide.md b/course-115-v2/notebooklm/NotebookLM_Study_Guide.md similarity index 83% rename from course-115/notebooklm/NotebookLM_Study_Guide.md rename to course-115-v2/notebooklm/NotebookLM_Study_Guide.md index 66559ff..b8fbe0b 100644 --- a/course-115/notebooklm/NotebookLM_Study_Guide.md +++ b/course-115-v2/notebooklm/NotebookLM_Study_Guide.md @@ -1,10 +1,10 @@ -# 多媒體系統課程學習指南 +# 多媒體系統 V2|學習指南 -本學習指南專為大專一年級學生設計,旨在系統化梳理從數位影像、生成式 AI、聲音處理到短影音合成的核心知識。本課程強調技術原理與實作驗證並重,協助學生建立可重現、可說明的多媒體管線。 +本指南整理數位影像、生成式 AI、聲音處理與短影音合成的核心知識,並用實作證據連接技術原理。完成各模組後,學生應能建立可重現、可說明的多媒體管線。 --- -## 模組一:系統基礎與影像原理 (W01–W03) +## 模組一:多媒體資料與影像基礎(W01~W03) ### W01|多媒體系統與 HackMD * **核心概念**: @@ -34,9 +34,9 @@ --- -## 模組二:擴散模型與生成式影像 (W04–W07) +## 模組二:生成影像與視覺敘事(W04~W08) -### W04|擴散模型原理 (DDPM) +### W04|擴散模型原理(DDPM) * **核心概念**: * **前向加噪與反向去噪**:前向過程逐步加入高斯雜訊;模型學習的是在特定時間步(Time-step)下預測並移除雜訊。 * **U-Net 架構**:負責擷取特徵並恢復空間資訊。 @@ -44,7 +44,7 @@ * **CPU 驗證問題**:前向加噪過程中,當 $\alphā_t$ 從 0.95 降至 0.05 時,影像訊號比例如何改變? * **口頭問答**:擴散模型生成時,模型預測的是最終圖片還是每一步要移除的成分? -### W05|文字控制與潛在擴散 (LDM) +### W05|文字控制與潛在擴散(LDM) * **核心概念**: * **VAE(自編碼器)**:將圖片壓縮至潛在空間(Latent Space),大幅降低運算成本。 * **控制變因**:提示文字(Prompt)、Seed(隨機狀態)、Steps(取樣步數)、CFG(引導強度)。 @@ -52,7 +52,7 @@ * **CPU 驗證問題**:固定 Seed 的情況下,僅改變提示中的「環境描述」,畫面的一致性會發生什麼變化? * **口頭問答**:固定 Seed 能控制什麼,不能保證什麼? -### W06|影像微調 (LoRA) +### W06|影像微調(LoRA) * **核心概念**: * **LoRA(低秩更新)**:不改變原模型權重,僅訓練極小的額外矩陣(秩 $r$ 很小),以低成本學習特定概念。 * **資料集品質**:標註(Caption)、多樣性與授權是微調成功的關鍵。 @@ -70,7 +70,6 @@ --- -## 模組三:期中回顧與休息 (W08–W09) ### W08|影像展與技術答辯 * **核心重點**:將「我覺得好看」轉化為技術判斷,說明格式、參數、失敗改善與技術限制。 @@ -78,12 +77,14 @@ * 解析度與檔案大小為何不一定成正比? * 潛在擴散模型為何比像素級擴散更省計算資源? -### W09|期中考週 -* **不授新課**:此週用於整理 W01–W08 筆記,檢查檔案紀錄完整性。 +## 期中整理與評量(W09) + +### W09|整理前半段學習證據 +* **不增加新技術內容**:此週用於整理 W01~W08 筆記,檢查檔案紀錄完整性。 --- -## 模組四:聲音訊號與深偽辨識 (W10–W12) +## 模組三:數位聲音與語音(W10~W12) ### W10|聲音數位化與頻譜 * **核心概念**: @@ -102,7 +103,7 @@ * **CPU 驗證問題**:直接加快播放速度(不使用相位聲碼器)會對音高產生什麼影響? * **口頭問答**:若錄音時環境噪音過大導致降噪後出現「金屬感」,應如何改善? -### W12|語音合成 (TTS) 與深偽查證 +### W12|語音合成(TTS)與深偽查證 * **核心概念**: * **TTS 管線**:文字 $\rightarrow$ 梅爾頻譜(Mel Spectrogram) $\rightarrow$ 聲碼器(Vocoder) $\rightarrow$ 波形。 * **聲紋嵌入(Speaker Embedding)**:將聲音特徵向量化以控制音色。 @@ -113,11 +114,11 @@ --- -## 模組五:短影音系統合成 (W13–W16) +## 模組四:短影音與系統整合(W13~W18) ### W13|分鏡與時間預算 * **核心概念**: - * **影片參數**:FPS(影格率)、解析度(720x1280)、Timebase(時間基準)。 + * **影片參數**:FPS(影格率)、解析度(720×1280)、Timebase(時間基準)。 * **腳本結構**:Hook(開場)、Context(情境)、Process(過程)、Result(結果)、Close(結尾)。 * **常見誤解**:15 秒短片隨便排就好(實際需要精確的旁白計時與字幕安全區規劃)。 * **CPU 驗證問題**:若 30 FPS 的 20 秒影片需要增加動作流暢度,會改變內容總量還是時間取樣密度? @@ -125,17 +126,17 @@ ### W14|素材庫與可追溯性 * **核心概念**: - * **Metadata 與 Provenance**:記錄素材的來源、處理過程、授權紀錄與 AI 揭露資訊。 + * **Metadata 與 Provenance**:記錄素材來源、處理過程、授權與 AI 揭露資訊。 * **素材包結構**:區分影像、聲音、腳本與日誌(Asset Log)。 -* **常見誤解**:檔案名稱就是最好的分類方式(應依賴外部 Log 紀錄 id 與來源)。 +* **常見誤解**:只靠檔名就能管理素材;實際上仍需要素材表記錄 ID、來源與版本。 * **CPU 驗證問題**:如何透過批次處理腳本檢查素材包中是否有缺檔或比例錯誤的影像? * **口頭問答**:為什麼在多媒體系統中,原始素材不可以直接被覆寫? ### W15|影片編碼與合成 * **核心概念**: * **容器(Container)與編碼(Codec)**:MP4 是容器,H.264 是編碼;兩者不可混為一談。 - * **冗餘與影格類型**:空間/時間冗餘;I-frame(關鍵影格)、P/B-frame(預測影格)。 - * **FFmpeg/MoviePy**:用於合成、補邊(Pad)與轉碼。 + * **冗餘與影格類型**:空間/時間冗餘;I-frame(關鍵影格)、P/B-frame(預測影格)。 + * **FFmpeg/MoviePy**:用於合成、補邊(Pad)與轉碼。 * **常見誤解**:關鍵影格越多越好(會增加檔案大小)。 * **CPU 驗證問題**:為什麼不能直接把 4:3 圖片拉伸成 9:16?(提示:比例畸變)。 * **口頭問答**:H.264 編碼如何利用「時間冗餘」來減小影片體積? @@ -144,7 +145,17 @@ * **核心概念**: * **粗剪版(Rough cut)**:確認聲畫同步與基本邏輯。 * **三類測試**:正常測試、邊界測試(旁白過長)、錯誤測試(缺檔)。 -* **口頭問答**:若雲端生成服務突然斷線,你的系統有何降級/替代路徑? +* **口頭問答**:若雲端生成服務突然斷線,你的系統有何降級/替代路徑? + +### W17|成果發表與技術說明 +* **核心概念**:用輸入、處理、參數、比較結果與限制說明作品,不只播放成品。 +* **檢核問題**:每位組員能否回答自己負責部分的資料流與錯誤處理? +* **學習證據**:完整作品、架構圖、測試結果與個人口頭問答。 + +### W18|成果封存與反思 +* **核心概念**:整理 README、AI 使用紀錄、素材表、同意紀錄、程式與輸出。 +* **檢核問題**:另一個人能否只依 README 找到素材、安裝環境並重現主要輸出? +* **學習證據**:可重現專題包、限制說明與後續改善清單。 --- @@ -166,7 +177,7 @@ --- -## 重要術語表 (Glossary) +## 重要術語表(Glossary) | 術語 | 說明 | | :--- | :--- | diff --git a/course-115/references.md b/course-115-v2/references.md similarity index 71% rename from course-115/references.md rename to course-115-v2/references.md index bdc9045..2f7fa57 100644 --- a/course-115/references.md +++ b/course-115-v2/references.md @@ -1,6 +1,13 @@ # 課程主要來源 -本表優先收錄論文與官方文件,供每週講義、NotebookLM 與簡報共同引用。實際服務介面、免費額度與模型名稱可能改變,授課前仍需再次查核。 +本表優先收錄論文與官方文件,供每週講義、NotebookLM 與其他學生教材共同引用。實際服務介面、免費額度與模型名稱可能改變,使用前仍需查看官方文件。 + +## 指定用書配套講義 + +- [現行課程主題與指定用書整合](TEXTBOOK_INTEGRATION_MAP.md) +- [數位影像處理與視覺安全課程總覽](https://hackmd.io/WMAFeHuWThO-HaMTMRCxsA) + +配套講義負責補充影像處理、頻域、安全與效能評估;生成式影像、音訊與影片仍以本頁所列論文、官方文件及現行週講義為準。 ## 生成式影像 @@ -26,5 +33,5 @@ - 講義只寫本週真正需要的概念,避免把論文摘要整段搬入教材。 - 公式與模型圖應配合小型實驗,讓學生能從輸入、參數與輸出驗證說法。 -- 任何當學期仍可能變動的服務資訊,皆標記為「授課前需查核」。 +- 可能變動的服務資訊,使用前應回到官方文件確認。 diff --git a/course-115/templates/ASSET_LOG.csv b/course-115-v2/templates/ASSET_LOG.csv similarity index 100% rename from course-115/templates/ASSET_LOG.csv rename to course-115-v2/templates/ASSET_LOG.csv diff --git a/course-115/templates/CONSENT_RECORD.md b/course-115-v2/templates/CONSENT_RECORD.md similarity index 100% rename from course-115/templates/CONSENT_RECORD.md rename to course-115-v2/templates/CONSENT_RECORD.md diff --git a/course-115/templates/FINAL_RUBRIC.md b/course-115-v2/templates/FINAL_RUBRIC.md similarity index 100% rename from course-115/templates/FINAL_RUBRIC.md rename to course-115-v2/templates/FINAL_RUBRIC.md diff --git a/course-115/templates/ai-usage.md b/course-115-v2/templates/ai-usage.md similarity index 100% rename from course-115/templates/ai-usage.md rename to course-115-v2/templates/ai-usage.md diff --git a/course-115-v2/textbook/MULTIMEDIA_SYSTEMS_V2.md b/course-115-v2/textbook/MULTIMEDIA_SYSTEMS_V2.md new file mode 100644 index 0000000..abbb9b5 --- /dev/null +++ b/course-115-v2/textbook/MULTIMEDIA_SYSTEMS_V2.md @@ -0,0 +1,441 @@ +# 多媒體系統 V2:從影像、聲音到短影音 + +這本書把多媒體視為一條可以拆解、測試與重現的資料管線。影像、聲音與影片的資料結構不同,但都要回答同一組問題:輸入是什麼、如何表示、經過哪些處理、如何判斷品質,以及輸出能否安全發布。 + +## 閱讀方式 + +全書分成四部。每章先說明概念,再連到 V2 教材包中的週講義、程式與 Notebook。第一次閱讀先完成「基礎練習」;準備專題時,再回來做「延伸挑戰」。 + +- 第一部:多媒體資料與影像基礎 +- 第二部:生成影像與視覺敘事 +- 第三部:數位聲音與語音 +- 第四部:短影音與系統整合 + +完整主題與週次關係見 [現行課程主題](../CURRENT_COURSE_TOPICS.md),指定用書的重排方式見 [指定用書整合表](../TEXTBOOK_INTEGRATION_MAP.md)。 + +--- + +# 第一部|多媒體資料與影像基礎 + +## 第 1 章|多媒體系統不是檔案集合 + +多媒體作品通常同時包含影像、聲音、文字與影片。把素材放在同一個資料夾,還不能稱為系統。系統至少要交代六件事: + +1. 輸入從哪裡來,格式與使用權利是什麼。 +2. 資料如何被讀取與檢查。 +3. 處理步驟與參數如何排列。 +4. 中間結果如何保存與命名。 +5. 輸出如何驗證品質與限制。 +6. 別人能否依文件重新執行。 + +可以把基本管線寫成: + +```text +輸入 → 檢查 → 轉換/生成 → 組合 → 驗證 → 輸出與紀錄 +``` + +![多媒體系統課程地圖](../assets/diagrams/course-map.png) + +同一份素材可能在不同階段扮演不同角色。例如,一張 PNG 可以是生成模型的參考圖、短影音中的畫面,也可以是系統測試時的固定輸入。清楚命名輸入、中間檔與輸出,比累積大量未整理素材更重要。 + +### 可重現紀錄 + +每次實驗至少保留: + +- 執行環境與套件版本。 +- 輸入檔名、來源與授權。 +- 關鍵參數與隨機種子。 +- 輸出檔名與比較方式。 +- 失敗案例、錯誤訊息與修正方法。 +- AI 協作時的提示、採用內容與驗證方式。 + +### 對應材料 + +- [W01|多媒體系統與 Markdown](../weeks/W01_課程啟動與多媒體系統.md) +- [AI 使用紀錄模板](../templates/ai-usage.md) +- [素材紀錄表](../templates/ASSET_LOG.csv) + +### 基礎練習 + +選一支 15~30 秒短影音,畫出「影像、聲音、文字、處理與輸出」的關係。不要只列軟體名稱,要指出每一步接收什麼資料、產生什麼資料。 + +## 第 2 章|取樣、量化與媒體資料 + +真實世界中的光與聲音通常是連續訊號。電腦要先選取觀測位置或時間,再把每次觀測轉成有限精度的數值。前者是取樣,後者是量化。 + +影像在空間上取樣,形成寬 × 高的像素網格;聲音在時間上取樣,形成依序排列的振幅數值;影片則在時間上取樣畫面,每一格畫面內又包含空間取樣。 + +### 資料量的第一個估算 + +未壓縮影像的理論資料量可以粗估為: + +```text +寬 × 高 × 通道數 × 每通道位元數 ÷ 8 +``` + +例如,RGB 影像通常有三個色彩通道。RGBA 多了一個透明度通道。實際檔案大小還會受到檔案標頭、metadata 與壓縮方式影響,所以理論資料量不等於磁碟上的檔案大小。 + +聲音資料量可從取樣率、位元深度、聲道數與時間估算;影片則還要加入畫面更新率、編碼方式與位元率。這些公式的價值不在背誦,而在檢查結果是否合理。 + +### 混疊與解析度 + +取樣不足時,高頻變化可能被誤認成較低頻的圖樣。影像可能出現摩爾紋,聲音可能出現錯誤頻率。提高取樣率不是唯一解法;適當的前置濾波與符合需求的輸出尺寸同樣重要。 + +### 對應材料 + +- [W02|數位影像與像素](../weeks/W02_數位影像與像素.md) +- [影像基礎 CPU 實驗](../labs/w02_image_basics.py) +- [影像基礎 Colab](../colab/W02_Image_Basics.ipynb) +- [Repo 數位影像教材](../../media/image/README.md) + +### 基礎練習 + +讀取同一張圖片的寬、高、模式與檔案大小,另存成 PNG 與 JPEG。比較檔案大小與畫面差異,並說明「像素尺寸不變」為什麼不代表「檔案大小不變」。 + +## 第 3 章|像素運算、卷積與頻域 + +影像可以視為矩陣。灰階影像是一個二維陣列;彩色影像通常多一個通道維度。做運算前要先確認資料型別與有效範圍。`uint8` 常用 0~255 表示亮度,超出範圍時可能截斷或溢位。 + +### 逐像素與鄰域運算 + +逐像素運算只看目前位置,例如調整亮度。鄰域運算會同時查看附近像素,卷積就是常見方法。二維卷積可以表示為: + +$$ +y(i,j)=\sum_m\sum_n x(i-m,j-n)k(m,n) +$$ + +其中 $x$ 是輸入影像,$k$ 是卷積核,$y$ 是輸出。模糊核會平均鄰域,銳化核會強調中心與周圍的差異,邊緣核則回應快速變化。 + +![卷積核掃過影像](../assets/diagrams/convolution.png) + +實作時還要決定邊界填補、輸出大小、通道處理及數值範圍。函式庫可以完成計算,但不能替代這些選擇。 + +### 空間域與頻域 + +空間域直接處理像素位置;頻域把影像拆成不同變化速度的成分。低頻通常對應緩慢變化,高頻常包含邊緣、細節與雜訊。傅立葉轉換提供另一種觀察方式,但「高頻等於雜訊」並不成立,因為重要輪廓也可能位於高頻。 + +### 對應材料 + +- [W03|卷積與影像處理](../weeks/W03_卷積與影像處理.md) +- [卷積 CPU 實驗](../labs/w03_convolution.py) +- [卷積 Colab](../colab/W03_Convolution.ipynb) +- [OpenCV/MediaPipe 延伸教材](../../08.OpenCV-Mediapipe-DEMO/) + +### 基礎練習 + +對同一張影像套用模糊、銳化與邊緣核。每次只改一個卷積核,保留輸出與觀察,說明哪些差異來自核權重、哪些可能來自邊界處理。 + +--- + +# 第二部|生成影像與視覺敘事 + +## 第 4 章|擴散模型如何學習去噪 + +擴散模型的訓練可以從「逐步破壞資料,再學習如何復原」理解。前向過程把雜訊逐步加入影像;模型在不同時間步估計雜訊或相關目標;生成時則從雜訊開始,反覆執行反向步驟。 + +常見的前向表示為: + +$$ +q(x_t\mid x_0)=\mathcal{N}(\sqrt{\bar{\alpha}_t}x_0,(1-\bar{\alpha}_t)I) +$$ + +$x_0$ 是原始資料,$x_t$ 是第 $t$ 步的帶噪資料,$\bar{\alpha}_t$ 控制保留多少原始訊號。這個式子用來描述加噪分布,不代表只靠公式就能完成高品質生成。 + +![擴散模型的加噪與去噪](../assets/diagrams/diffusion-process.png) + +### 為什麼先做前向實驗 + +完整模型訓練需要較多算力,但前向加噪可以用 NumPy 在 CPU 執行。觀察不同時間步的影像,有助於理解時間步、雜訊排程與可辨識資訊之間的關係。 + +### 對應材料 + +- [W04|擴散模型原理](../weeks/W04_擴散模型原理.md) +- [前向擴散 CPU 實驗](../labs/w04_diffusion_forward.py) +- [前向擴散 Colab](../colab/W04_Diffusion_Forward.ipynb) + +### 基礎練習 + +固定原圖與隨機種子,只改變時間步或雜訊強度,排出一組漸進結果。指出從哪個階段開始,原圖的主要結構已難以辨識。 + +## 第 5 章|潛在空間、提示控制與可重現比較 + +高解析度影像包含大量像素。潛在擴散先用編碼器把影像壓到較小的潛在表示,在潛在空間進行去噪,再由解碼器還原影像。這能降低運算量,但潛在表示不是一般圖片壓縮檔,也不能直接解讀為單一視覺概念。 + +![潛在擴散管線](../assets/diagrams/latent-diffusion.png) + +文字條件通常先經過文字編碼器,再透過交叉注意力影響去噪過程。提示只是條件的一部分;模型版本、seed、步數、取樣器、尺寸與引導強度都會影響結果。 + +分類器自由引導常以條件與無條件預測的差值調整文字條件強度: + +$$ +\hat{\epsilon}=\epsilon_{uncond}+s(\epsilon_{cond}-\epsilon_{uncond}) +$$ + +$s$ 較大時不保證品質一定較好。過高的引導可能犧牲自然度或造成視覺瑕疵。 + +### 公平比較 + +要判斷某個提示或參數是否有效,至少應固定其他主要條件。一次同時更換模型、seed、尺寸與提示,結果就難以解釋。 + +### 對應材料 + +- [W05|潛在擴散與提示控制](../weeks/W05_潛在擴散與提示控制.md) +- [W07|生成影像工作室](../weeks/W07_生成影像工作室.md) +- [AI 與 LLM 延伸教材](../../11.AI/) + +### 基礎練習 + +設計一個四格比較,只改變一個變因。保留提示、seed、步數與輸出,寫下觀察與限制。若使用線上服務而無法固定完整參數,也要明確記錄這項限制。 + +## 第 6 章|LoRA、資料品質與影像一致性 + +模型微調不是把參考圖放進提示。微調會根據資料更新模型參數或附加參數。LoRA 將權重更新近似為兩個較小矩陣的乘積: + +$$ +\Delta W=BA +$$ + +當秩 $r$ 遠小於原權重維度時,需要訓練與保存的參數較少。這降低了微調成本,但不會自動解決資料偏差、授權或過擬合。 + +![LoRA 低秩更新](../assets/diagrams/lora.png) + +### 資料卡應回答的問題 + +- 圖片從哪裡來,是否有使用權利? +- 主體、背景、角度與光線是否過度單一? +- 標註文字是否描述真正需要學習的特徵? +- 訓練與比較資料是否分開? +- 哪些輸出表示模型只記住訓練圖? + +實際訓練不是理解 LoRA 的必要條件。設備有限時,可以先比較預先產生的結果,練習辨識資料與參數造成的差異。 + +### 從單張到影像系列 + +短影音需要一組能共同工作的影像。先建立角色、色彩、構圖、光線與畫面比例規格,再生成或處理素材。單張看起來漂亮,不代表放進時間軸後能形成一致敘事。 + +### 對應材料 + +- [W06|LoRA 與影像微調](../weeks/W06_LoRA與影像微調.md) +- [W07|生成影像工作室](../weeks/W07_生成影像工作室.md) +- [W08|期中影像展與技術說明](../weeks/W08_期中影像展與技術答辯.md) + +### 基礎練習 + +規劃一份微調資料卡,或使用既有模型完成 3~6 張影像故事組。作品說明至少包含控制變因、失敗案例、後製方式與素材來源。 + +--- + +# 第三部|數位聲音與語音 + +## 第 7 章|聲音的取樣、波形與頻譜 + +數位聲音是一串依時間排列的振幅數值。取樣率 $f_s$ 表示每秒記錄幾次,位元深度表示每次振幅可使用多少離散值。若要避免理想條件下的混疊,取樣率應高於訊號最高頻率的兩倍;實際系統還需要考慮濾波器與硬體限制。 + +![聲音取樣與時頻圖](../assets/diagrams/audio-sampling-stft.png) + +波形適合觀察時間位置、振幅與靜音;FFT 適合觀察整段訊號包含哪些頻率;STFT 把聲音切成短窗,可以看見頻率如何隨時間變化。窗長較大通常提供較細的頻率解析度,但時間定位較粗;窗長較小則相反。 + +### 對應材料 + +- [W10|數位聲音與頻譜](../weeks/W10_數位聲音與頻譜.md) +- [聲音頻譜 CPU 實驗](../labs/w10_audio_spectrum.py) +- [聲音頻譜 Colab](../colab/W10_Audio_Spectrum.ipynb) +- [Repo 數位音訊教材](../../media/audio/README.md) + +### 基礎練習 + +產生或讀取兩段頻率不同的聲音,繪出波形與頻譜。改變取樣率或 STFT 參數,說明圖形差異,不要只貼出結果。 + +## 第 8 章|聲音剪輯、語音合成與深偽風險 + +裁切、淡入淡出、正規化、濾波、變速與變調都會改變數位訊號。處理順序沒有通用答案,但應能說明每一步解決什麼問題。例如,先裁掉無用片段可減少後續運算;正規化前若存在尖峰,整段音量可能仍然偏小。 + +![聲音剪輯流程](../assets/diagrams/audio-editing.png) + +### 語音合成管線 + +常見文字轉語音系統先把文字轉成聲學表示,再由 vocoder 生成波形。梅爾頻譜是常見的中間表示;speaker embedding 可以提供說話者條件;voice conversion 則在保留部分語言內容的同時改變聲音特徵。不同系統的實作不同,不能把這些元件視為固定配方。 + +![語音合成與風險辨識](../assets/diagrams/voice-synthesis-safety.png) + +聽起來像某人,不等於可以證明是某人。辨識深偽時,單靠主觀聽感或單一偵測器都不夠。較可靠的做法是同時檢查來源、檔案紀錄、內容脈絡、可疑訊號與其他獨立證據。 + +### 安全界線 + +只使用自己的聲音、取得明確同意的素材或完全合成角色。不得仿冒未同意者,也不得把合成內容包裝成真實錄音。生成與後製過程要留下揭露紀錄。 + +### 對應材料 + +- [W11|聲音剪輯與訊號處理](../weeks/W11_聲音剪輯與訊號處理.md) +- [W12|語音合成與深偽辨識](../weeks/W12_語音合成與深偽辨識.md) +- [聲音剪輯 CPU 實驗](../labs/w11_audio_edit.py) +- [聲音剪輯 Colab](../colab/W11_Audio_Edit.ipynb) +- [媒體倫理教材](../../media/ethics/README.md) + +### 基礎練習 + +對同一段聲音做裁切、淡入淡出與正規化,保留處理前後波形及聆聽紀錄。另選一段合成或真實聲音,將判斷依據分成「可觀察訊號」「來源證據」與「仍不確定」三類。 + +--- + +# 第四部|短影音與系統整合 + +## 第 9 章|影片的時間結構、編碼與容器 + +影片是依時間顯示的畫面序列,通常還包含聲音、字幕與 metadata。畫面更新率表示每秒顯示多少格;解析度描述每格畫面的像素尺寸;位元率表示每秒配置多少資料量。三者相關,但不是同一件事。 + +未壓縮影片的資料量非常大,因此實際影片會利用空間與時間上的相似性壓縮。I-frame 可獨立解碼,其他畫面可能參考前後影格。GOP 描述一組相關影格的安排方式。 + +![影片編碼與 GOP](../assets/diagrams/video-codec-gop.png) + +容器負責包裝不同資料流,例如 MP4;編碼器決定影像或聲音如何壓縮,例如 H.264。副檔名只能提示容器,不能完整說明內部使用的編碼。 + +### 對應材料 + +- [W13|短影音腳本與數位影片](../weeks/W13_短影音腳本與數位影片.md) +- [W15|FFmpeg 與短影音合成](../weeks/W15_FFmpeg與短影音合成.md) +- [短影音合成 CPU 實驗](../labs/w15_make_short.py) +- [短影音合成 Colab](../colab/W15_Make_Short.ipynb) +- [Repo 數位視訊教材](../../media/video/README.md) + +### 基礎練習 + +用 `ffprobe` 或同類工具讀取一支影片的容器、影像編碼、聲音編碼、解析度、畫面更新率、時間與位元率。轉出另一個版本,只改一個輸出參數並比較品質與檔案大小。 + +## 第 10 章|從腳本、分鏡到素材包 + +15~30 秒的短影音仍需要明確結構。先決定觀眾要理解什麼,再把時間分配給開場、主要訊息與收束。每個鏡頭應記錄畫面、旁白、字幕、音效、時間與轉場,避免進入剪輯後才發現資訊超出時間。 + +![短影音分鏡流程](../assets/diagrams/short-video-storyboard.png) + +### 素材包是輸入契約 + +素材包不只是檔案集合。每個素材至少要有: + +- 唯一檔名與媒體類型。 +- 來源、作者與取得日期。 +- 授權或同意狀態。 +- 是否由 AI 生成或修改。 +- 生成工具、提示與主要參數。 +- 預定用途與後製紀錄。 + +![素材溯源鏈](../assets/diagrams/media-provenance.png) + +來源不明的素材不應進入最終時間軸。若授權需要標示姓名或連結,應在作品說明或片尾保留。 + +### 對應材料 + +- [W13|短影音腳本](../weeks/W13_短影音腳本與數位影片.md) +- [W14|生成內容與素材溯源](../weeks/W14_生成內容與素材溯源.md) +- [素材紀錄表](../templates/ASSET_LOG.csv) +- [同意紀錄模板](../templates/CONSENT_RECORD.md) + +### 基礎練習 + +完成四格或六格分鏡,建立對應素材表。讓另一位同學只看分鏡與素材表,檢查是否能判斷每個鏡頭要使用哪些檔案。 + +## 第 11 章|短影音合成、測試與錯誤處理 + +短影音合成把影像、影片、聲音與字幕放到共同時間軸。開始合成前,先統一畫面比例、解析度、畫面更新率、聲音取樣率與檔名。格式不一致時,錯誤常在輸出階段才出現。 + +![短影音系統管線](../assets/diagrams/final-project-pipeline.png) + +### 三類測試 + +1. **正常路徑**:所有必要素材存在,能產生符合規格的成品。 +2. **邊界條件**:極短素材、不同尺寸、空白字幕或接近上限的檔案仍能合理處理。 +3. **錯誤路徑**:檔案遺失、格式不支援或參數錯誤時,系統提供可理解的訊息,而不是只留下失敗輸出。 + +測試不只看程式有沒有結束。還要檢查影像是否變形、字幕是否超出畫面、聲音是否削波、同步是否偏移、輸出是否能在常見播放器開啟。 + +### 對應材料 + +- [W15|FFmpeg 與短影音合成](../weeks/W15_FFmpeg與短影音合成.md) +- [W16|系統整合與測試](../weeks/W16_進度小報告與系統測試.md) +- [pytest 延伸教材](../../07.Pytest-DEMO/) + +### 基礎練習 + +為作品列出一個正常案例、一個邊界案例與一個錯誤案例。每個案例都記錄輸入、預期結果、實際結果與修正狀態。 + +## 第 12 章|技術說明、發布與封存 + +完整作品應讓觀眾看得懂,也要讓檢查者能追溯技術選擇。發表時不要只展示成品,還要說明問題、輸入、處理管線、關鍵參數、比較證據、失敗案例、授權與限制。 + +### 專題包最低內容 + +```text +project/ +├─ README.md +├─ AI_USAGE.md +├─ assets/ +├─ src/ 或 notebooks/ +├─ outputs/ +├─ tests/ 或 test-results/ +└─ asset-log.csv +``` + +README 至少包含環境、安裝、執行方式、輸入、參數、輸出、限制與來源。程式無法公開時,也要保留足以重現流程的步驟與參數。 + +### 發布前檢查 + +- 影像、聲音與影片是否取得必要授權或同意。 +- 是否含有可識別個資、位置或未同意者。 +- 生成與合成內容是否清楚揭露。 +- 音量、字幕、畫面比例與播放相容性是否通過檢查。 +- 專題包能否在另一個環境依 README 重跑。 + +### 對應材料 + +- [W17|成果發表 A](../weeks/W17_期末成果發表A.md) +- [W18|成果發表 B 與封存](../weeks/W18_期末成果發表B與封存.md) +- [成果評量規準](../templates/FINAL_RUBRIC.md) +- [媒體倫理與發布](../../media/ethics/README.md) + +### 基礎練習 + +把專題複製到新的資料夾或環境,只依 README 執行一次。記錄無法重現的步驟,補齊缺少的檔案、套件版本與參數。 + +--- + +# 附錄 A|工具與用途 + +| 工具 | 適合處理的工作 | +|---|---| +| Pillow | 影像讀寫、尺寸、色彩與基本轉換 | +| NumPy | 陣列、卷積、取樣與數值實驗 | +| OpenCV | 影像與影片處理、濾鏡及視覺分析 | +| librosa | 聲音載入、頻譜、STFT 與音訊特徵 | +| MoviePy | 以 Python 組合畫面、聲音與字幕 | +| FFmpeg/ffprobe | 轉碼、封裝、媒體資訊與批次處理 | +| Jupyter/Colab | 保存程式、說明、參數、圖表與結果 | +| Git | 保存版本與比較修改,但不應提交金鑰或敏感素材 | + +# 附錄 B|實驗證據模板 + +```markdown +## 問題 +我要比較什麼? + +## 固定條件 +輸入、環境、模型或工具版本、未改變的參數。 + +## 改變的變因 +這次只改哪一項? + +## 結果 +輸出、數值、圖表或聆聽/觀看紀錄。 + +## 解釋 +結果支持什麼判斷?還有哪些其他可能原因? + +## 限制 +哪些條件無法控制、哪些結果尚不能推論? + +## 來源與 AI 協作 +素材、引用、提示、採用內容與驗證方式。 +``` + +# 附錄 C|主要來源 + +本書的論文與官方文件集中整理於 [課程主要來源](../references.md)。模型服務、免費額度與軟體介面可能變動;使用前應回到官方文件確認。指定用書配套講義的接入位置與適用邊界,見 [指定用書整合表](../TEXTBOOK_INTEGRATION_MAP.md)。 diff --git a/course-115/week-01-hackmd-markdown.md b/course-115-v2/week-01-hackmd-markdown.md similarity index 97% rename from course-115/week-01-hackmd-markdown.md rename to course-115-v2/week-01-hackmd-markdown.md index c2bed5a..2bffe35 100644 --- a/course-115/week-01-hackmd-markdown.md +++ b/course-115-v2/week-01-hackmd-markdown.md @@ -177,7 +177,7 @@ print(message) ## 六、班別活動 -### 日間部引導活動 +### 基礎練習 兩人一組交換筆記,檢查: @@ -189,7 +189,7 @@ print(message) 完成後,在同學筆記留下「一項看得懂的地方」與「一項需要補充的地方」。 -### 進修部挑戰活動 +### 延伸挑戰 從工作、社團或生活經驗選一個流程,用 Mermaid 畫出媒體資料如何流動。 @@ -209,7 +209,7 @@ flowchart LR ## 七、繳交方式 -請繳交 HackMD 閱讀連結。繳交前以無痕視窗測試,確認教師可以開啟。 +請繳交 HackMD 閱讀連結。繳交前以無痕視窗測試,確認持有連結者可以開啟。 最低完成條件: @@ -220,7 +220,7 @@ flowchart LR ## 八、離堂小紙條 -下課前在筆記最後回答: +完成本週練習後,在筆記最後回答: 1. 今天最有把握的一個 Markdown 語法是什麼? 2. 還不確定的地方是什麼? diff --git "a/course-115/weeks/W01_\350\252\262\347\250\213\345\225\237\345\213\225\350\210\207\345\244\232\345\252\222\351\253\224\347\263\273\347\265\261.md" "b/course-115-v2/weeks/W01_\350\252\262\347\250\213\345\225\237\345\213\225\350\210\207\345\244\232\345\252\222\351\253\224\347\263\273\347\265\261.md" similarity index 95% rename from "course-115/weeks/W01_\350\252\262\347\250\213\345\225\237\345\213\225\350\210\207\345\244\232\345\252\222\351\253\224\347\263\273\347\265\261.md" rename to "course-115-v2/weeks/W01_\350\252\262\347\250\213\345\225\237\345\213\225\350\210\207\345\244\232\345\252\222\351\253\224\347\263\273\347\265\261.md" index 7d7b144..26d2774 100644 --- "a/course-115/weeks/W01_\350\252\262\347\250\213\345\225\237\345\213\225\350\210\207\345\244\232\345\252\222\351\253\224\347\263\273\347\265\261.md" +++ "b/course-115-v2/weeks/W01_\350\252\262\347\250\213\345\225\237\345\213\225\350\210\207\345\244\232\345\252\222\351\253\224\347\263\273\347\265\261.md" @@ -2,7 +2,7 @@ > 本週任務:建立個人課程筆記,拆解一支 15–30 秒短影音的輸入、處理、輸出與限制。 -![多媒體系統課程地圖](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115/assets/diagrams/course-map.png) +![多媒體系統課程地圖](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115-v2/assets/diagrams/course-map.png) ## 這門課要做什麼? @@ -75,13 +75,13 @@ HackMD 讓我們共同閱讀與討論,Markdown 則讓內容能保存到 GitHub - 你如何驗證程式、資料或媒體輸出。 - 工具、日期與重要參數;不要抄錄密碼或 API 金鑰。 -## 分流任務 +## 練習 -### 日間引導 +### 基礎練習 -使用教師提供的短片,完成固定六格觀察表;至少指出一個「看得到」的效果和一個「看不到但系統必須處理」的設定。 +使用課程提供的短片,完成固定六格觀察表;至少指出一個「看得到」的效果和一個「看不到但系統必須處理」的設定。 -### 進修挑戰 +### 延伸挑戰 選擇工作或生活中的多媒體流程,額外標出一個效能限制與一個權利/倫理風險。 diff --git "a/course-115/weeks/W02_\346\225\270\344\275\215\345\275\261\345\203\217\350\210\207\345\203\217\347\264\240.md" "b/course-115-v2/weeks/W02_\346\225\270\344\275\215\345\275\261\345\203\217\350\210\207\345\203\217\347\264\240.md" similarity index 94% rename from "course-115/weeks/W02_\346\225\270\344\275\215\345\275\261\345\203\217\350\210\207\345\203\217\347\264\240.md" rename to "course-115-v2/weeks/W02_\346\225\270\344\275\215\345\275\261\345\203\217\350\210\207\345\203\217\347\264\240.md" index 02859e2..3f5bbe0 100644 --- "a/course-115/weeks/W02_\346\225\270\344\275\215\345\275\261\345\203\217\350\210\207\345\203\217\347\264\240.md" +++ "b/course-115-v2/weeks/W02_\346\225\270\344\275\215\345\275\261\345\203\217\350\210\207\345\203\217\347\264\240.md" @@ -2,7 +2,7 @@ > 本週任務:用程式讀取同一張圖的尺寸、模式與像素,完成格式與壓縮比較。 -![像素與 RGB 通道示意](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115/assets/diagrams/pixel-rgb.png) +![像素與 RGB 通道示意](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115-v2/assets/diagrams/pixel-rgb.png) ## 從連續世界到像素格 @@ -61,13 +61,13 @@ print("左上角像素:", img.convert("RGB").getpixel((0, 0))) 2. 通道不是三張互不相關的圖片,而是共同描述每個位置的顏色。 3. 顯示器看到的顏色還會受到色彩空間與裝置影響;本週先以 RGB 數值觀察。 -## 分流任務 +## 練習 -### 日間引導 +### 基礎練習 -使用同一張教師範例圖,完成四個輸出與固定觀察表。口頭回答「檔案大小最小」是否等於「最適合」。 +使用同一張課程範例圖,完成四個輸出與固定觀察表。口頭回答「檔案大小最小」是否等於「最適合」。 -### 進修挑戰 +### 延伸挑戰 自選兩種內容差異明顯的圖片,例如人像與文字截圖,比較內容複雜度如何影響壓縮結果。 diff --git "a/course-115/weeks/W03_\345\215\267\347\251\215\350\210\207\345\275\261\345\203\217\350\231\225\347\220\206.md" "b/course-115-v2/weeks/W03_\345\215\267\347\251\215\350\210\207\345\275\261\345\203\217\350\231\225\347\220\206.md" similarity index 97% rename from "course-115/weeks/W03_\345\215\267\347\251\215\350\210\207\345\275\261\345\203\217\350\231\225\347\220\206.md" rename to "course-115-v2/weeks/W03_\345\215\267\347\251\215\350\210\207\345\275\261\345\203\217\350\231\225\347\220\206.md" index 0b9ae50..92a7467 100644 --- "a/course-115/weeks/W03_\345\215\267\347\251\215\350\210\207\345\275\261\345\203\217\350\231\225\347\220\206.md" +++ "b/course-115-v2/weeks/W03_\345\215\267\347\251\215\350\210\207\345\275\261\345\203\217\350\231\225\347\220\206.md" @@ -2,7 +2,7 @@ > 本週任務:在 CPU 上實作卷積,觀察模糊、銳化與邊緣偵測如何改變像素。 -![卷積核掃過影像的示意](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115/assets/diagrams/convolution.png) +![卷積核掃過影像的示意](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115-v2/assets/diagrams/convolution.png) ## 卷積不是神奇濾鏡 @@ -66,11 +66,11 @@ cv2.imwrite("edges.png", edges) 把同一張圖做成「柔和、銳利、線稿」三個版本。每個版本要記錄方法、參數、處理時間與失敗情況。不要用三張不同輸入圖混淆比較。 -### 日間引導 +### 基礎練習 使用固定核與固定輸入,修改一次權重或門檻,說明輸出改變。 -### 進修挑戰 +### 延伸挑戰 建立可一次處理資料夾內多張圖片的流程,並保留原始檔與輸出命名規則。 diff --git "a/course-115/weeks/W04_\346\223\264\346\225\243\346\250\241\345\236\213\345\216\237\347\220\206.md" "b/course-115-v2/weeks/W04_\346\223\264\346\225\243\346\250\241\345\236\213\345\216\237\347\220\206.md" similarity index 96% rename from "course-115/weeks/W04_\346\223\264\346\225\243\346\250\241\345\236\213\345\216\237\347\220\206.md" rename to "course-115-v2/weeks/W04_\346\223\264\346\225\243\346\250\241\345\236\213\345\216\237\347\220\206.md" index 769b8e6..5130531 100644 --- "a/course-115/weeks/W04_\346\223\264\346\225\243\346\250\241\345\236\213\345\216\237\347\220\206.md" +++ "b/course-115-v2/weeks/W04_\346\223\264\346\225\243\346\250\241\345\236\213\345\216\237\347\220\206.md" @@ -2,7 +2,7 @@ > 本週任務:用少量程式模擬前向加噪,並用自己的話解釋反向去噪模型學了什麼。 -![擴散模型的前向加噪與反向去噪](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115/assets/diagrams/diffusion-process.png) +![擴散模型的前向加噪與反向去噪](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115-v2/assets/diagrams/diffusion-process.png) ## 先把圖破壞,再學著復原 @@ -50,11 +50,11 @@ xt = np.sqrt(alpha_bar) * image + np.sqrt(1-alpha_bar) * noise 3. 模型預測什麼。 4. 生成時為什麼能從雜訊開始。 -### 日間引導 +### 基礎練習 使用固定圖片與固定 seed,只改 `ᾱ_t`,完成訊號比例觀察表。 -### 進修挑戰 +### 延伸挑戰 改用線性或餘弦概念排程產生 8–12 張連續影格,討論排程如何改變加噪速度;不要求訓練模型。 diff --git "a/course-115/weeks/W05_\346\275\233\345\234\250\346\223\264\346\225\243\350\210\207\346\217\220\347\244\272\346\216\247\345\210\266.md" "b/course-115-v2/weeks/W05_\346\275\233\345\234\250\346\223\264\346\225\243\350\210\207\346\217\220\347\244\272\346\216\247\345\210\266.md" similarity index 92% rename from "course-115/weeks/W05_\346\275\233\345\234\250\346\223\264\346\225\243\350\210\207\346\217\220\347\244\272\346\216\247\345\210\266.md" rename to "course-115-v2/weeks/W05_\346\275\233\345\234\250\346\223\264\346\225\243\350\210\207\346\217\220\347\244\272\346\216\247\345\210\266.md" index 4859de9..5120856 100644 --- "a/course-115/weeks/W05_\346\275\233\345\234\250\346\223\264\346\225\243\350\210\207\346\217\220\347\244\272\346\216\247\345\210\266.md" +++ "b/course-115-v2/weeks/W05_\346\275\233\345\234\250\346\223\264\346\225\243\350\210\207\346\217\220\347\244\272\346\216\247\345\210\266.md" @@ -2,7 +2,7 @@ > 本週任務:以固定 seed 做提示與參數對照,說明 VAE、文字條件與引導強度各自扮演的角色。 -![潛在擴散模型管線](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115/assets/diagrams/latent-diffusion.png) +![潛在擴散模型管線](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115-v2/assets/diagrams/latent-diffusion.png) ## 為什麼不直接在所有像素上去噪? @@ -29,7 +29,7 @@ ## 公平的提示實驗 -使用 ChatGPT 或 Gemini 免費版做少量生成。服務介面與額度可能變動,授課前以現場可用功能為準。 +使用 ChatGPT 或 Gemini 免費版做少量生成。服務介面與額度可能變動,開始前先確認目前可用功能與使用限制。 1. 選一個中性、可公開的主題。 2. 先固定 seed(若工具提供)與畫面比例。 @@ -52,13 +52,13 @@ 俯視構圖,清楚留出上方字幕空間,扁平幾何插畫,不含品牌與文字。 ``` -## 分流任務 +## 練習 -### 日間引導 +### 基礎練習 -使用教師指定主題與三段式提示模板,只調整一個段落,完成對照表。 +使用指定主題與三段式提示模板,只調整一個段落,完成對照表。 -### 進修挑戰 +### 延伸挑戰 自行建立風格規格表,測試同一規格能否維持三張圖的一致角色、色盤與構圖語言。 diff --git "a/course-115/weeks/W06_LoRA\350\210\207\345\275\261\345\203\217\345\276\256\350\252\277.md" "b/course-115-v2/weeks/W06_LoRA\350\210\207\345\275\261\345\203\217\345\276\256\350\252\277.md" similarity index 87% rename from "course-115/weeks/W06_LoRA\350\210\207\345\275\261\345\203\217\345\276\256\350\252\277.md" rename to "course-115-v2/weeks/W06_LoRA\350\210\207\345\275\261\345\203\217\345\276\256\350\252\277.md" index 34bee6e..df6676e 100644 --- "a/course-115/weeks/W06_LoRA\350\210\207\345\275\261\345\203\217\345\276\256\350\252\277.md" +++ "b/course-115-v2/weeks/W06_LoRA\350\210\207\345\275\261\345\203\217\345\276\256\350\252\277.md" @@ -2,7 +2,7 @@ > 本週任務:設計一份合法、可追溯的小型資料集與 LoRA 微調企畫;實際訓練為選配。 -![LoRA 低秩更新概念](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115/assets/diagrams/lora.png) +![LoRA 低秩更新概念](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115-v2/assets/diagrams/lora.png) ## 微調不是把參考圖放進提示 @@ -40,20 +40,20 @@ W′ = W + ΔW,且 ΔW = B A 1. 選擇完全合成物件或自己拍攝、可合法使用的素材。 2. 規劃 12–20 張候選圖,實際只需提交縮圖與資料表。 3. 把資料分為訓練候選與測試提示,不讓測試只重複訓練構圖。 -4. 使用教師提供的三組預先生成結果,判斷欠擬合、適當與過擬合。 +4. 使用課程提供的三組預先生成結果,判斷欠擬合、適當與過擬合。 5. 寫下你會調整的下一個變因與理由。 ## Colab 選配 -若免費 GPU 可用,教師可示範低解析、小資料與短步數訓練。開始前先確認執行階段,結束後刪除不必要的大檔並中斷連線。Colab 不保證特定 GPU、可用時間或長期免費額度,因此不列為必做評分。 +若免費 GPU 可用,可選做低解析、小資料與短步數訓練。開始前先確認執行階段,結束後刪除不必要的大檔並中斷連線。Colab 不保證特定 GPU、可用時間或長期免費額度,因此不列為必做。 -## 分流任務 +## 練習 -### 日間引導 +### 基礎練習 使用虛構圖示角色與固定資料卡,找出重複背景、角度不足、錯誤標註與授權不明四類問題。 -### 進修挑戰 +### 延伸挑戰 自訂一個與工作或興趣相關、但不涉及未同意人物的概念,提出基準提示、測試矩陣與停止條件。 diff --git "a/course-115/weeks/W07_\347\224\237\346\210\220\345\275\261\345\203\217\345\267\245\344\275\234\345\256\244.md" "b/course-115-v2/weeks/W07_\347\224\237\346\210\220\345\275\261\345\203\217\345\267\245\344\275\234\345\256\244.md" similarity index 93% rename from "course-115/weeks/W07_\347\224\237\346\210\220\345\275\261\345\203\217\345\267\245\344\275\234\345\256\244.md" rename to "course-115-v2/weeks/W07_\347\224\237\346\210\220\345\275\261\345\203\217\345\267\245\344\275\234\345\256\244.md" index 79c6cbf..d69a26e 100644 --- "a/course-115/weeks/W07_\347\224\237\346\210\220\345\275\261\345\203\217\345\267\245\344\275\234\345\256\244.md" +++ "b/course-115-v2/weeks/W07_\347\224\237\346\210\220\345\275\261\345\203\217\345\267\245\344\275\234\345\256\244.md" @@ -2,7 +2,7 @@ > 本週任務:製作 3–6 張可用於短影音的影像故事組,保留每次生成與後製紀錄。 -![一致影像系列的製作流程](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115/assets/diagrams/image-story-workflow.png) +![一致影像系列的製作流程](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115-v2/assets/diagrams/image-story-workflow.png) ## 先定義視覺系統 @@ -46,13 +46,13 @@ AI 輸出是素材,不是成品。用 Pillow 或 OpenCV 完成: 每組只選一個問題優先改善,例如角色一致性或字幕空間,不要無限制重抽圖片。 -## 分流任務 +## 練習 -### 日間引導 +### 基礎練習 -使用四格固定故事結構:「狀態—問題—處理—結果」。教師逐格檢查主體、構圖與安全區。 +使用四格固定故事結構:「狀態—問題—處理—結果」,再依檢核表逐格檢查主體、構圖與安全區。 -### 進修挑戰 +### 延伸挑戰 自選敘事結構,建立可重複使用的提示元件;說明哪些一致性仍需後製或人工取捨。 diff --git "a/course-115/weeks/W08_\346\234\237\344\270\255\345\275\261\345\203\217\345\261\225\350\210\207\346\212\200\350\241\223\347\255\224\350\276\257.md" "b/course-115-v2/weeks/W08_\346\234\237\344\270\255\345\275\261\345\203\217\345\261\225\350\210\207\346\212\200\350\241\223\347\255\224\350\276\257.md" similarity index 91% rename from "course-115/weeks/W08_\346\234\237\344\270\255\345\275\261\345\203\217\345\261\225\350\210\207\346\212\200\350\241\223\347\255\224\350\276\257.md" rename to "course-115-v2/weeks/W08_\346\234\237\344\270\255\345\275\261\345\203\217\345\261\225\350\210\207\346\212\200\350\241\223\347\255\224\350\276\257.md" index f54fdb4..2deb061 100644 --- "a/course-115/weeks/W08_\346\234\237\344\270\255\345\275\261\345\203\217\345\261\225\350\210\207\346\212\200\350\241\223\347\255\224\350\276\257.md" +++ "b/course-115-v2/weeks/W08_\346\234\237\344\270\255\345\275\261\345\203\217\345\261\225\350\210\207\346\212\200\350\241\223\347\255\224\350\276\257.md" @@ -2,7 +2,7 @@ > 本週任務:展示影像故事組,完成 3 分鐘說明與個人技術問答。此週可作為期中成績。 -![影像作品展示與技術答辯](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115/assets/diagrams/image-showcase.png) +![影像作品展示與技術答辯](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115-v2/assets/diagrams/image-showcase.png) ## 展示內容 @@ -51,8 +51,8 @@ - 期中展示頁或 3–5 頁簡報。 - 個人 150–250 字反思:我的判斷依據如何改變? -## 課後銜接 +## 下一步 -請把最適合期末短影音的 3–6 張圖放入專題素材資料夾。W09 不授新課,W10 從聲音開始。 +請把最適合期末短影音的 3~6 張圖放入專題素材資料夾。W09 整理前半段成果,W10 從聲音開始。 diff --git "a/course-115/weeks/W09_\346\234\237\344\270\255\350\200\203\351\200\261.md" "b/course-115-v2/weeks/W09_\346\234\237\344\270\255\350\200\203\351\200\261.md" similarity index 63% rename from "course-115/weeks/W09_\346\234\237\344\270\255\350\200\203\351\200\261.md" rename to "course-115-v2/weeks/W09_\346\234\237\344\270\255\350\200\203\351\200\261.md" index bcefabb..b6f43e0 100644 --- "a/course-115/weeks/W09_\346\234\237\344\270\255\350\200\203\351\200\261.md" +++ "b/course-115-v2/weeks/W09_\346\234\237\344\270\255\350\200\203\351\200\261.md" @@ -1,10 +1,10 @@ -# W09|期中考週:不授新課 +# W09|期中整理與評量 -本週配合期中考週,不安排新內容、不新增實作進度。 +本週不增加新的技術內容。請依課程公告完成評量,並整理前八週的學習證據。 ## 學生確認事項 -- 依班級首頁公告確認是否有考試、補交或個別說明時段。 +- 依課程公告確認是否有考試、補交或個別說明時段。 - 檢查 W01–W08 的 HackMD 筆記、程式、影像作品與 AI 使用紀錄是否可開啟。 - 不要求趁本週提前製作後半學期作品;請保留休息與其他科目準備時間。 @@ -12,6 +12,6 @@ 若有餘裕,可把期中回饋分為「保留、修改、尚待查證」三欄,作為期末短影音的素材篩選依據。 -下週將進入聲音模組:請準備耳機。需要錄音的活動只使用自己的聲音,或教師提供、具有授權的範例聲音。 +下週將進入聲音模組:請準備耳機。需要錄音的活動只使用自己的聲音,或課程提供、具有授權的範例聲音。 diff --git "a/course-115/weeks/W10_\346\225\270\344\275\215\350\201\262\351\237\263\350\210\207\351\240\273\350\255\234.md" "b/course-115-v2/weeks/W10_\346\225\270\344\275\215\350\201\262\351\237\263\350\210\207\351\240\273\350\255\234.md" similarity index 94% rename from "course-115/weeks/W10_\346\225\270\344\275\215\350\201\262\351\237\263\350\210\207\351\240\273\350\255\234.md" rename to "course-115-v2/weeks/W10_\346\225\270\344\275\215\350\201\262\351\237\263\350\210\207\351\240\273\350\255\234.md" index 3840601..2e759e5 100644 --- "a/course-115/weeks/W10_\346\225\270\344\275\215\350\201\262\351\237\263\350\210\207\351\240\273\350\255\234.md" +++ "b/course-115-v2/weeks/W10_\346\225\270\344\275\215\350\201\262\351\237\263\350\210\207\351\240\273\350\255\234.md" @@ -2,7 +2,7 @@ > 本週任務:錄製或使用授權聲音,觀察波形、取樣率、FFT 與 STFT。 -![波形、取樣與時頻圖的關係](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115/assets/diagrams/audio-sampling-stft.png) +![波形、取樣與時頻圖的關係](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115-v2/assets/diagrams/audio-sampling-stft.png) ## 聲音不是一條漂亮的波浪線 @@ -52,11 +52,11 @@ print(sr, len(y) / sr) 用拍手、持續母音與環境聲各做一個短樣本。拍手在時間上短、頻率分布較廣;持續母音有較穩定的週期與共振峰;環境聲則視來源而定。不要只把圖「貼上」,要用時間與頻率描述觀察。 -### 日間引導 +### 基礎練習 -使用教師提供的三段音檔與固定參數,比對哪一段是拍手、母音與背景噪音。 +使用課程提供的三段音檔與固定參數,比對哪一段是拍手、母音與背景噪音。 -### 進修挑戰 +### 延伸挑戰 自選一段可授權錄音,提出一個需要 STFT 而不是只看 FFT 才容易回答的問題。 diff --git "a/course-115/weeks/W11_\350\201\262\351\237\263\345\211\252\350\274\257\350\210\207\350\250\212\350\231\237\350\231\225\347\220\206.md" "b/course-115-v2/weeks/W11_\350\201\262\351\237\263\345\211\252\350\274\257\350\210\207\350\250\212\350\231\237\350\231\225\347\220\206.md" similarity index 96% rename from "course-115/weeks/W11_\350\201\262\351\237\263\345\211\252\350\274\257\350\210\207\350\250\212\350\231\237\350\231\225\347\220\206.md" rename to "course-115-v2/weeks/W11_\350\201\262\351\237\263\345\211\252\350\274\257\350\210\207\350\250\212\350\231\237\350\231\225\347\220\206.md" index 53a094d..99621eb 100644 --- "a/course-115/weeks/W11_\350\201\262\351\237\263\345\211\252\350\274\257\350\210\207\350\250\212\350\231\237\350\231\225\347\220\206.md" +++ "b/course-115-v2/weeks/W11_\350\201\262\351\237\263\345\211\252\350\274\257\350\210\207\350\250\212\350\231\237\350\231\225\347\220\206.md" @@ -2,7 +2,7 @@ > 本週任務:把一段 20–30 秒錄音剪成清楚、音量合理、可放進短影音的旁白。 -![聲音剪輯與訊號處理流程](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115/assets/diagrams/audio-editing.png) +![聲音剪輯與訊號處理流程](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115-v2/assets/diagrams/audio-editing.png) ## 常見操作背後的訊號變化 @@ -50,11 +50,11 @@ clip.export("narration_edit.wav", format="wav") - 旁白與背景音樂同時播放時,語音是否仍清楚? - 輸出格式、取樣率與聲道是否符合影片流程? -### 日間引導 +### 基礎練習 使用固定旁白完成裁切、淡入淡出與峰值檢查,繳交原音/成品對照。 -### 進修挑戰 +### 延伸挑戰 建立可重複執行的批次處理腳本,並對不同比例的參數提出停止條件。 diff --git "a/course-115/weeks/W12_\350\252\236\351\237\263\345\220\210\346\210\220\350\210\207\346\267\261\345\201\275\350\276\250\350\255\230.md" "b/course-115-v2/weeks/W12_\350\252\236\351\237\263\345\220\210\346\210\220\350\210\207\346\267\261\345\201\275\350\276\250\350\255\230.md" similarity index 83% rename from "course-115/weeks/W12_\350\252\236\351\237\263\345\220\210\346\210\220\350\210\207\346\267\261\345\201\275\350\276\250\350\255\230.md" rename to "course-115-v2/weeks/W12_\350\252\236\351\237\263\345\220\210\346\210\220\350\210\207\346\267\261\345\201\275\350\276\250\350\255\230.md" index af21a48..0271d84 100644 --- "a/course-115/weeks/W12_\350\252\236\351\237\263\345\220\210\346\210\220\350\210\207\346\267\261\345\201\275\350\276\250\350\255\230.md" +++ "b/course-115-v2/weeks/W12_\350\252\236\351\237\263\345\220\210\346\210\220\350\210\207\346\267\261\345\201\275\350\276\250\350\255\230.md" @@ -2,7 +2,7 @@ > 本週任務:理解 TTS 與 voice conversion 管線,比較真實/合成範例,完成生成內容揭露卡。 -![語音合成、聲紋條件與檢測流程](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115/assets/diagrams/voice-synthesis-safety.png) +![語音合成、聲紋條件與檢測流程](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115-v2/assets/diagrams/voice-synthesis-safety.png) ## 先分清楚三種任務 @@ -34,13 +34,13 @@ ## 課堂安全規範 -本週只使用:自己的聲音、取得明確同意的聲音,或教師提供/完全合成的範例。禁止仿冒同學、教師、公眾人物或未同意者;禁止把生成聲音拿去做身分驗證、惡作劇、詐騙或令人誤認的發布。 +本週只使用自己的聲音、取得明確同意的聲音,或課程提供/完全合成的範例。禁止仿冒公眾人物或任何未同意者;禁止把生成聲音拿去做身分驗證、惡作劇、詐騙或令人誤認的發布。 所有作品必須明顯標示「AI 合成/轉換聲音」,並留下同意、工具、日期、文字、參數與後製紀錄。 ## CPU 必做:盲聽與證據分級 -教師提供數段授權音訊,學生先盲聽,再看波形與頻譜。對每段填寫: +使用課程提供的授權音訊,先盲聽,再看波形與頻譜。對每段填寫: - 我的判斷與信心 0–100。 - 支持判斷的可觀察線索。 @@ -51,13 +51,13 @@ ## 選配生成 -可用工具以完全合成角色或自己的聲音,產生一句 3–5 秒短句,立刻加上揭露標籤。若免費服務要求不合理的個資、聲紋註冊或授權,應停止使用,改做教師範例分析。 +可用工具以完全合成角色或自己的聲音,產生一句 3~5 秒短句,立刻加上揭露標籤。若免費服務要求不合理的個資、聲紋註冊或授權,應停止使用,改分析課程提供的範例。 -### 日間引導 +### 基礎練習 完成固定音檔比較與 TTS 管線排序,口頭說明 mel spectrogram 與 vocoder 的分工。 -### 進修挑戰 +### 延伸挑戰 設計一個「收到可疑語音訊息」的查證流程,包含技術線索與非技術交叉驗證。 diff --git "a/course-115/weeks/W13_\347\237\255\345\275\261\351\237\263\350\205\263\346\234\254\350\210\207\346\225\270\344\275\215\345\275\261\347\211\207.md" "b/course-115-v2/weeks/W13_\347\237\255\345\275\261\351\237\263\350\205\263\346\234\254\350\210\207\346\225\270\344\275\215\345\275\261\347\211\207.md" similarity index 89% rename from "course-115/weeks/W13_\347\237\255\345\275\261\351\237\263\350\205\263\346\234\254\350\210\207\346\225\270\344\275\215\345\275\261\347\211\207.md" rename to "course-115-v2/weeks/W13_\347\237\255\345\275\261\351\237\263\350\205\263\346\234\254\350\210\207\346\225\270\344\275\215\345\275\261\347\211\207.md" index 0332885..53d7315 100644 --- "a/course-115/weeks/W13_\347\237\255\345\275\261\351\237\263\350\205\263\346\234\254\350\210\207\346\225\270\344\275\215\345\275\261\347\211\207.md" +++ "b/course-115-v2/weeks/W13_\347\237\255\345\275\261\351\237\263\350\205\263\346\234\254\350\210\207\346\225\270\344\275\215\345\275\261\347\211\207.md" @@ -2,7 +2,7 @@ > 本週任務:完成 15–30 秒直式短影音的腳本、分鏡與時間預算。 -![短影音從腳本到時間軸的流程](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115/assets/diagrams/short-video-storyboard.png) +![短影音從腳本到時間軸的流程](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115-v2/assets/diagrams/short-video-storyboard.png) ## 影片是依時間顯示的媒體系統 @@ -46,13 +46,13 @@ 把 12 秒影片畫成 12 格「每秒狀態」,再改為 24 FPS 的影格觀念。討論:敘事事件沒有增加時,影格數增加改變的是時間取樣密度,不是內容本身。 -## 分流任務 +## 練習 -### 日間引導 +### 基礎練習 -使用五段式時間模板與四格分鏡;教師逐項檢查訊息、旁白長度、字幕安全區與素材可取得性。 +使用五段式時間模板與四格分鏡,再依檢核表確認訊息、旁白長度、字幕安全區與素材可取得性。 -### 進修挑戰 +### 延伸挑戰 可自訂敘事節奏,但必須提出時間預算、素材風險與低算力備援方案。 diff --git "a/course-115/weeks/W14_\347\224\237\346\210\220\345\205\247\345\256\271\350\210\207\347\264\240\346\235\220\346\272\257\346\272\220.md" "b/course-115-v2/weeks/W14_\347\224\237\346\210\220\345\205\247\345\256\271\350\210\207\347\264\240\346\235\220\346\272\257\346\272\220.md" similarity index 90% rename from "course-115/weeks/W14_\347\224\237\346\210\220\345\205\247\345\256\271\350\210\207\347\264\240\346\235\220\346\272\257\346\272\220.md" rename to "course-115-v2/weeks/W14_\347\224\237\346\210\220\345\205\247\345\256\271\350\210\207\347\264\240\346\235\220\346\272\257\346\272\220.md" index 93d34a6..fabc0b7 100644 --- "a/course-115/weeks/W14_\347\224\237\346\210\220\345\205\247\345\256\271\350\210\207\347\264\240\346\235\220\346\272\257\346\272\220.md" +++ "b/course-115-v2/weeks/W14_\347\224\237\346\210\220\345\205\247\345\256\271\350\210\207\347\264\240\346\235\220\346\272\257\346\272\220.md" @@ -2,7 +2,7 @@ > 本週任務:完成影像、旁白、音效、字幕與來源紀錄,形成可直接進入剪輯的素材包。 -![素材來源、生成、後製與輸出的溯源鏈](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115/assets/diagrams/media-provenance.png) +![素材來源、生成、後製與輸出的溯源鏈](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115-v2/assets/diagrams/media-provenance.png) ## 素材包是系統的輸入契約 @@ -29,7 +29,7 @@ project/ | id | 不隨檔名改變的識別碼 | | filename | 實際檔名與副檔名 | | type | image/voice/music/sfx/font | -| source | 自製、網址、生成工具或教師素材 | +| source | 自製、網址、生成工具或課程素材 | | license_or_consent | 授權條件或同意紀錄位置 | | generated | 是否全部或部分由 AI 生成 | | edits | 裁切、濾鏡、降噪、轉碼等 | @@ -57,11 +57,11 @@ EXIF 等內嵌 metadata 可能在轉檔或平台上傳時消失,因此不能 4. 是否有不明來源或缺少同意的素材? 5. 若某個雲端工具不可用,是否仍能完成最低作品? -### 日間引導 +### 基礎練習 -使用固定資料夾與教師提供的 `ASSET_LOG.csv` 範本,完成 8–12 個素材欄位。 +使用固定資料夾與 `templates/ASSET_LOG.csv` 範本,完成 8~12 個素材欄位。 -### 進修挑戰 +### 延伸挑戰 額外建立版本規則與自動檢查腳本,找出缺檔、重複檔名或格式不符項目。 diff --git "a/course-115/weeks/W15_FFmpeg\350\210\207\347\237\255\345\275\261\351\237\263\345\220\210\346\210\220.md" "b/course-115-v2/weeks/W15_FFmpeg\350\210\207\347\237\255\345\275\261\351\237\263\345\220\210\346\210\220.md" similarity index 96% rename from "course-115/weeks/W15_FFmpeg\350\210\207\347\237\255\345\275\261\351\237\263\345\220\210\346\210\220.md" rename to "course-115-v2/weeks/W15_FFmpeg\350\210\207\347\237\255\345\275\261\351\237\263\345\220\210\346\210\220.md" index c73cc91..be5bbe8 100644 --- "a/course-115/weeks/W15_FFmpeg\350\210\207\347\237\255\345\275\261\351\237\263\345\220\210\346\210\220.md" +++ "b/course-115-v2/weeks/W15_FFmpeg\350\210\207\347\237\255\345\275\261\351\237\263\345\220\210\346\210\220.md" @@ -2,7 +2,7 @@ > 本週任務:用 FFmpeg 或 MoviePy 合成 720×1280 的短影音粗剪版,確認聲畫同步與可播放性。 -![影格、關鍵影格、GOP、編碼與容器](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115/assets/diagrams/video-codec-gop.png) +![影格、關鍵影格、GOP、編碼與容器](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115-v2/assets/diagrams/video-codec-gop.png) ## 容器不是編碼器 @@ -53,11 +53,11 @@ ffmpeg -i input.mp4 -vf "scale=720:1280:force_original_aspect_ratio=decrease,pad 位元率是每秒分配的資料量。相同位元率下,高動態、細節密集的內容通常更難壓縮。CRF 模式傾向以品質目標調整位元率;固定 bitrate 則較容易控制傳輸規模。沒有一個參數能對所有內容最佳。 -### 日間引導 +### 基礎練習 使用固定四張圖與一段旁白完成合成,再比較兩個 CRF 設定的大小與瑕疵。 -### 進修挑戰 +### 延伸挑戰 依自選分鏡建立可重跑的組裝腳本,並保留一條 CPU 可完成的降級路徑。 diff --git "a/course-115/weeks/W16_\351\200\262\345\272\246\345\260\217\345\240\261\345\221\212\350\210\207\347\263\273\347\265\261\346\270\254\350\251\246.md" "b/course-115-v2/weeks/W16_\351\200\262\345\272\246\345\260\217\345\240\261\345\221\212\350\210\207\347\263\273\347\265\261\346\270\254\350\251\246.md" similarity index 89% rename from "course-115/weeks/W16_\351\200\262\345\272\246\345\260\217\345\240\261\345\221\212\350\210\207\347\263\273\347\265\261\346\270\254\350\251\246.md" rename to "course-115-v2/weeks/W16_\351\200\262\345\272\246\345\260\217\345\240\261\345\221\212\350\210\207\347\263\273\347\265\261\346\270\254\350\251\246.md" index 4f9d34d..e2a0ca8 100644 --- "a/course-115/weeks/W16_\351\200\262\345\272\246\345\260\217\345\240\261\345\221\212\350\210\207\347\263\273\347\265\261\346\270\254\350\251\246.md" +++ "b/course-115-v2/weeks/W16_\351\200\262\345\272\246\345\260\217\345\240\261\345\221\212\350\210\207\347\263\273\347\265\261\346\270\254\350\251\246.md" @@ -2,7 +2,7 @@ > 本週任務:展示可播放的 rough cut、系統架構圖與風險清單,取得期末前最後一輪方向性回饋。 -![短影音系統的輸入、處理、測試與輸出](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115/assets/diagrams/final-project-pipeline.png) +![短影音系統的輸入、處理、測試與輸出](https://raw.githubusercontent.com/willismax/MediaSystem-Python-Course/course-115-complete-materials/course-115-v2/assets/diagrams/final-project-pipeline.png) ## 五分鐘小報告 @@ -41,11 +41,11 @@ 2. 再修來源、同意、生成揭露與可重現性。 3. 最後才增加轉場、動畫與裝飾。 -### 日間引導 +### 基礎練習 -教師依固定檢核表逐組確認可播放、聲畫、字幕、來源與技術說明。 +依固定檢核表確認作品可播放,並檢查聲畫、字幕、來源與技術說明。 -### 進修挑戰 +### 延伸挑戰 除共同檢核外,說明你刪除或延後的一項功能,以及這個取捨如何降低風險。 diff --git "a/course-115/weeks/W17_\346\234\237\346\234\253\346\210\220\346\236\234\347\231\274\350\241\250A.md" "b/course-115-v2/weeks/W17_\346\234\237\346\234\253\346\210\220\346\236\234\347\231\274\350\241\250A.md" similarity index 100% rename from "course-115/weeks/W17_\346\234\237\346\234\253\346\210\220\346\236\234\347\231\274\350\241\250A.md" rename to "course-115-v2/weeks/W17_\346\234\237\346\234\253\346\210\220\346\236\234\347\231\274\350\241\250A.md" diff --git "a/course-115/weeks/W18_\346\234\237\346\234\253\346\210\220\346\236\234\347\231\274\350\241\250B\350\210\207\345\260\201\345\255\230.md" "b/course-115-v2/weeks/W18_\346\234\237\346\234\253\346\210\220\346\236\234\347\231\274\350\241\250B\350\210\207\345\260\201\345\255\230.md" similarity index 95% rename from "course-115/weeks/W18_\346\234\237\346\234\253\346\210\220\346\236\234\347\231\274\350\241\250B\350\210\207\345\260\201\345\255\230.md" rename to "course-115-v2/weeks/W18_\346\234\237\346\234\253\346\210\220\346\236\234\347\231\274\350\241\250B\350\210\207\345\260\201\345\255\230.md" index 47eba73..6dea9cc 100644 --- "a/course-115/weeks/W18_\346\234\237\346\234\253\346\210\220\346\236\234\347\231\274\350\241\250B\350\210\207\345\260\201\345\255\230.md" +++ "b/course-115-v2/weeks/W18_\346\234\237\346\234\253\346\210\220\346\236\234\347\231\274\350\241\250B\350\210\207\345\260\201\345\255\230.md" @@ -22,7 +22,7 @@ final-project/ └─ REFLECTION.md ``` -`README.md` 至少包含問題、目標觀眾、系統架構、執行方式、關鍵參數、測試、已知限制與組員分工。連結必須讓教師可在權限範圍內開啟。 +`README.md` 至少包含問題、目標觀眾、系統架構、執行方式、關鍵參數、測試、已知限制與組員分工。繳交連結必須在指定權限範圍內開啟。 ## 個人反思 diff --git a/course-115/.hackmd-sync.json b/course-115/.hackmd-sync.json deleted file mode 100644 index 8c5565f..0000000 --- a/course-115/.hackmd-sync.json +++ /dev/null @@ -1,158 +0,0 @@ -{ - "api_base": "https://api.hackmd.io/v1", - "token_env": "HACKMD_API_TOKEN", - "materials_root": "weeks", - "manifest_path": "hackmd.book.md", - "book_note_id": "8PS1YcDJSdGJQuwTwuScdg", - "default_permissions": { - "readPermission": "guest", - "writePermission": "owner", - "commentPermission": "disabled" - }, - "notes": { - "weeks/W01_課程啟動與多媒體系統.md": { - "note_id": "IpvhLzxDR4O6OPQhEjogxw", - "title": "W01|先拆解,再創作:多媒體系統與 HackMD", - "shortId": "SJG50wvLzl", - "publishLink": "https://hackmd.io/@wiimax/SJG50wvLzl", - "created_from": "weeks/W01_課程啟動與多媒體系統.md", - "last_local_push": 1786375820 - }, - "weeks/W02_數位影像與像素.md": { - "note_id": "cPhk_js3Q0GoqqvjOCcw7Q", - "title": "W02|一張圖片在電腦裡是什麼?", - "shortId": "HJNm5CvwLzx", - "publishLink": "https://hackmd.io/@wiimax/HJNm5CvwLzx", - "created_from": "weeks/W02_數位影像與像素.md", - "last_local_push": 1786375821 - }, - "weeks/W03_卷積與影像處理.md": { - "note_id": "i5Ezqm8fTfWnHUfAGol1qQ", - "title": "W03|濾鏡為什麼能找出邊緣?", - "shortId": "S1V45CwPIfg", - "publishLink": "https://hackmd.io/@wiimax/S1V45CwPIfg", - "created_from": "weeks/W03_卷積與影像處理.md", - "last_local_push": 1786375822 - }, - "weeks/W04_擴散模型原理.md": { - "note_id": "acOyEDr1Q6WiqMPomutPjA", - "title": "W04|AI 如何從雜訊生成圖片?", - "shortId": "SJHqRwvIMx", - "publishLink": "https://hackmd.io/@wiimax/SJHqRwvIMx", - "created_from": "weeks/W04_擴散模型原理.md", - "last_local_push": 1786375822 - }, - "weeks/W05_潛在擴散與提示控制.md": { - "note_id": "Acqf1hjfQuWLqqHFvhcahw", - "title": "W05|文字如何控制生成影像?", - "shortId": "SkUqAPv8Me", - "publishLink": "https://hackmd.io/@wiimax/SkUqAPv8Me", - "created_from": "weeks/W05_潛在擴散與提示控制.md", - "last_local_push": 1786375823 - }, - "weeks/W06_LoRA與影像微調.md": { - "note_id": "JhvO9LwVQqKOS7u77jvFSw", - "title": "W06|影像微調到底改了什麼?", - "shortId": "BkHL9RPv8Ge", - "publishLink": "https://hackmd.io/@wiimax/BkHL9RPv8Ge", - "created_from": "weeks/W06_LoRA與影像微調.md", - "last_local_push": 1786375824 - }, - "weeks/W07_生成影像工作室.md": { - "note_id": "5OZp57CNRFiIO-0d3ywEkg", - "title": "W07|生成影像工作室:一致性比單張漂亮更重要", - "shortId": "r1wcCwwUfl", - "publishLink": "https://hackmd.io/@wiimax/r1wcCwwUfl", - "created_from": "weeks/W07_生成影像工作室.md", - "last_local_push": 1786375825 - }, - "weeks/W08_期中影像展與技術答辯.md": { - "note_id": "e9hggKDASSaGlDJGA8s6kQ", - "title": "W08|期中影像展:把「我覺得好看」變成可說明的技術判斷", - "shortId": "r1uqCvwIfx", - "publishLink": "https://hackmd.io/@wiimax/r1uqCvwIfx", - "created_from": "weeks/W08_期中影像展與技術答辯.md", - "last_local_push": 1786375826 - }, - "weeks/W09_期中考週.md": { - "note_id": "sKMpUAl0St-eotC-F6WtdA", - "title": "W09|期中考週:不授新課", - "shortId": "HyFcRPvLzx", - "publishLink": "https://hackmd.io/@wiimax/HyFcRPvLzx", - "created_from": "weeks/W09_期中考週.md", - "last_local_push": 1786375826 - }, - "weeks/W10_數位聲音與頻譜.md": { - "note_id": "-MOYCr5MR42TVJo2cS8Z-Q", - "title": "W10|聲音如何變成可以運算的數字?", - "shortId": "S1qcRvP8Mg", - "publishLink": "https://hackmd.io/@wiimax/S1qcRvP8Mg", - "created_from": "weeks/W10_數位聲音與頻譜.md", - "last_local_push": 1786375827 - }, - "weeks/W11_聲音剪輯與訊號處理.md": { - "note_id": "HeMA4-uFTRepSHzwjg508A", - "title": "W11|剪輯聲音時,實際改變了什麼?", - "shortId": "ry59CDwUGg", - "publishLink": "https://hackmd.io/@wiimax/ry59CDwUGg", - "created_from": "weeks/W11_聲音剪輯與訊號處理.md", - "last_local_push": 1786375828 - }, - "weeks/W12_語音合成與深偽辨識.md": { - "note_id": "7xe8MLQjRjaqcjTGn_uZ7g", - "title": "W12|聲音深偽如何生成,又如何辨識風險?", - "shortId": "SyEj9AwPUfx", - "publishLink": "https://hackmd.io/@wiimax/SyEj9AwPUfx", - "created_from": "weeks/W12_語音合成與深偽辨識.md", - "last_local_push": 1786375828 - }, - "weeks/W13_短影音腳本與數位影片.md": { - "note_id": "b2Im7ebKTDKH8ojQvcQNTQ", - "title": "W13|短影音不是把素材排在一起而已嗎?", - "shortId": "Bk39CDwUMg", - "publishLink": "https://hackmd.io/@wiimax/Bk39CDwUMg", - "created_from": "weeks/W13_短影音腳本與數位影片.md", - "last_local_push": 1786375829 - }, - "weeks/W14_生成內容與素材溯源.md": { - "note_id": "ZpTR4OlhQAWWjYH-KK7geA", - "title": "W14|如何建立可追溯的多媒體素材庫?", - "shortId": "Bk2qADw8fg", - "publishLink": "https://hackmd.io/@wiimax/Bk2qADw8fg", - "created_from": "weeks/W14_生成內容與素材溯源.md", - "last_local_push": 1786375830 - }, - "weeks/W15_FFmpeg與短影音合成.md": { - "note_id": "TOgQVBQBRz6LIEatAAoItQ", - "title": "W15|影片如何被合成與壓縮?", - "shortId": "BkEpq0wPUGx", - "publishLink": "https://hackmd.io/@wiimax/BkEpq0wPUGx", - "created_from": "weeks/W15_FFmpeg與短影音合成.md", - "last_local_push": 1786375830 - }, - "weeks/W16_進度小報告與系統測試.md": { - "note_id": "3k08HgBySd6T0gi2nPsGSA", - "title": "W16|進度小報告:作品是否已經成為一個系統?", - "shortId": "SJRqCPDIzl", - "publishLink": "https://hackmd.io/@wiimax/SJRqCPDIzl", - "created_from": "weeks/W16_進度小報告與系統測試.md", - "last_local_push": 1786375831 - }, - "weeks/W17_期末成果發表A.md": { - "note_id": "W5udh8xkSeWP451yfNfOiA", - "title": "W17|期末成果發表 A", - "shortId": "Sy09APPUzx", - "publishLink": "https://hackmd.io/@wiimax/Sy09APPUzx", - "created_from": "weeks/W17_期末成果發表A.md", - "last_local_push": 1786375832 - }, - "weeks/W18_期末成果發表B與封存.md": { - "note_id": "EvnBXWrZSrCveEPIMek-IQ", - "title": "W18|期末成果發表 B:把作品留下來,也把判斷留下來", - "shortId": "BkkiCwwLfe", - "publishLink": "https://hackmd.io/@wiimax/BkkiCwwLfe", - "created_from": "weeks/W18_期末成果發表B與封存.md", - "last_local_push": 1786375833 - } - } -} diff --git a/course-115/COURSE_HOME.md b/course-115/COURSE_HOME.md deleted file mode 100644 index 7c4ba2d..0000000 --- a/course-115/COURSE_HOME.md +++ /dev/null @@ -1,29 +0,0 @@ -# 多媒體系統 115|課程教材中心 - -本資料夾是日間部與進修部共用的新版教材來源。課程主軸不是介紹雲端平台,而是理解多媒體系統背後的資料、演算法與製作管線,並用 AI 協作完成一支短影音作品。 - -## 課程入口 - -- 日間部:[Thu 多媒體系統115(日)資工一](https://hackmd.io/@wiimax/SJemnYy8fg) -- 進修部:[Sat 多媒體系統115(夜)資工一](https://hackmd.io/@wiimax/ryNWHeqSzg) -- 程式參考:[MediaSystem-Python-Course](https://github.com/willismax/MediaSystem-Python-Course) - -## 資料夾 - -- `weeks/`:W01–W18 學生版 HackMD 講義。 -- `labs/`:CPU 與 Colab 可執行的程式實驗。 -- `assets/`:以 ChatGPT Image 產生的教學圖像與授權紀錄。 -- `slides/`:每週 16:9 PPTX 與預覽圖。 -- `notebooklm/`:NotebookLM 來源清單、產物資訊與匯出檔。 -- `templates/`:AI 使用紀錄、素材資料卡、同意紀錄與評量規準。 - -## 使用原則 - -1. 兩班共用同一份正文,班級首頁只維護日期、公告與期限。 -2. 講義內的「日間引導」與「進修挑戰」不是能力標籤,而是不同的時間配置與任務支架。 -3. 每個必做實驗都有 CPU 路徑;Colab GPU 與商業服務只能是選配。 -4. GitHub 保存可版本控制的來源;HackMD 作為學生閱讀與課堂互動入口。 -5. 每次使用 AI,都要留下提示、參數、採用/拒絕理由與驗證方式。 - -完整進度與評量請見 [共同課綱](common-syllabus-2026.md)。 - diff --git a/course-115/DELIVERY_INDEX.md b/course-115/DELIVERY_INDEX.md deleted file mode 100644 index 8155a1b..0000000 --- a/course-115/DELIVERY_INDEX.md +++ /dev/null @@ -1,37 +0,0 @@ -# 多媒體系統 115|交付索引 - -## 線上入口 - -- 日間部首頁: -- 進修部首頁: -- W01–W18 HackMD 總目錄: -- GitHub 教材分支: - -兩班首頁都已保留原內容,並在末端加入同一個共用教材區塊。 - -## 本機交付 - -| 類型 | 位置 | 數量/說明 | -|---|---|---| -| 學生講義 | `weeks/` | W01–W18,共 18 份 Markdown | -| 每週簡報 | `slides/` | W01–W18,共 18 份 PPTX | -| CPU 程式 | `labs/` | 影像、擴散、聲音、短影音共 6 份 | -| Colab | `colab/` | 對應 6 份 Notebook | -| ChatGPT 生成圖 | `assets/diagrams/` | 7 張原始生成構圖、15 個課程引用檔名 | -| NotebookLM | `notebooklm/` | 來源清單、study guide、21 頁官方總覽 PPTX | -| 評量與紀錄 | `templates/` | 素材表、同意紀錄、期末規準、AI 使用紀錄 | - -## 已確認的週次安排 - -- W08:期中影像作品與技術答辯。 -- W09:期中考週,不授新課。 -- W16:Rough cut、架構圖與三類測試的小型進度發表。 -- W17–W18:期末成果發表、個人口頭問答與專題封存。 - -## 產製與驗證 - -- 18 份週簡報以 16:9 版面產生,已由本機 PowerPoint 全數開啟、匯出並檢查縮圖。 -- Python 腳本已通過 `compileall`;6 份 Colab Notebook 由相同程式來源建立。 -- HackMD 先以 dry-run 確認 18 份皆為新筆記,再執行上傳;同步設定不含 API Token。 -- 圖像生成紀錄見 `assets/GENERATED_IMAGES.md`;精確公式與技術限制仍以講義文字為準。 - diff --git a/course-115/common-syllabus-2026.md b/course-115/common-syllabus-2026.md deleted file mode 100644 index e113cb2..0000000 --- a/course-115/common-syllabus-2026.md +++ /dev/null @@ -1,94 +0,0 @@ -# 多媒體系統 115 學年度共同課綱 - -## 課程定位 - -這門課不是「輪流體驗幾個 AI 網站」,而是從媒體資料的表示方式出發,理解影像、聲音與影片如何被電腦儲存、轉換、生成與組合,最後完成一支可說明技術選擇的短影音作品。 - -課程採一套共同教材,日間部與進修部使用相同核心概念與範例,再以任務支架調整難度: - -- **共同必學**:兩班都要完成的觀念、實驗與安全規範。 -- **日間引導**:縮小變因、提供步驟與檢核點,強化一年級學生的技術基礎。 -- **進修挑戰**:保留核心檢核,但增加自選素材、工作流程整合與專題時間。 - -## 學習成果 - -完成課程後,學生應能: - -1. 以像素、取樣、影格與壓縮等概念說明數位媒體的表示方式。 -2. 使用 Python、Pillow、OpenCV、librosa、MoviePy 或 FFmpeg 完成基本媒體處理。 -3. 說明擴散模型、潛在空間、交叉注意力、引導強度與 LoRA 的角色。 -4. 說明頻譜、STFT、梅爾頻譜、聲紋嵌入與 vocoder 的基本關係。 -5. 分辨容器、編碼器、畫面更新率、關鍵影格、位元率與檔案大小的關係。 -6. 在一般 8 GB RAM、CPU 電腦與免費 Colab 的限制下,選擇可重現的工作流程。 -7. 使用生成式 AI 協助構想、素材製作與程式除錯,同時保留提示、參數、來源與驗證紀錄。 -8. 遵守同意、肖像、聲音、著作權與 AI 生成內容揭露規範。 - -## 18 週課程地圖 - -| 週次 | 核心問題 | 技術主題 | 課堂產出 | -|---:|---|---|---| -| W01 | 什麼才算一個多媒體系統? | 媒體管線、Markdown、HackMD、素材與 AI 紀錄 | 個人課程筆記與媒體拆解圖 | -| W02 | 一張圖片在電腦裡是什麼? | 像素、RGB/RGBA、解析度、色彩深度、格式與壓縮 | 圖片參數實驗 | -| W03 | 濾鏡為什麼能找出邊緣? | Pillow、NumPy、OpenCV、卷積核、模糊與銳化 | CPU 影像濾鏡實驗 | -| W04 | AI 如何從雜訊生成圖片? | DDPM、前向加噪、反向去噪、U-Net、時間步 | 擴散過程模擬與概念卡 | -| W05 | 文字如何控制生成影像? | VAE、潛在擴散、文字編碼、交叉注意力、CFG、seed | 可重現的提示實驗 | -| W06 | 影像微調到底改了什麼? | 資料集、過擬合、DreamBooth 概念、LoRA 低秩更新 | 微調企畫與資料卡 | -| W07 | 如何做出一致而可信的影像系列? | 風格規格、構圖、生成後處理、版本與來源 | 3–6 張影像故事組 | -| W08 | 我能不能解釋作品背後的技術? | 影像模組統整、口頭問答、期中展示 | 期中影像作品與技術說明 | -| W09 | 期中考週 | **不授新課**;依校務規定進行評量 | 無新作業 | -| W10 | 聲音如何變成可以運算的數字? | 取樣率、位元深度、Nyquist、波形、FFT、STFT | 聲音與頻譜觀察 | -| W11 | 剪輯聲音時實際改變了什麼? | 裁切、淡入淡出、正規化、濾波、變速與變調 | 聲音重製練習 | -| W12 | 聲音深偽如何生成,又如何辨識風險? | TTS、梅爾頻譜、vocoder、speaker embedding、voice conversion | 合成/真實聲音比較與揭露卡 | -| W13 | 短影音不是把素材排在一起而已嗎? | 分鏡、時間軸、FPS、畫面比例、敘事節奏、字幕設計 | 15–30 秒分鏡與腳本 | -| W14 | 如何建立可追溯的多媒體素材庫? | 圖像、旁白、音效、字幕、metadata、provenance | 專題素材包 | -| W15 | 影片如何被合成與壓縮? | FFmpeg、MoviePy、container、codec、bitrate、keyframe/GOP | 720×1280 粗剪版 | -| W16 | 作品是否已經成為一個系統? | 管線整合、錯誤處理、測試、進度小報告 | Rough cut、架構圖與風險清單 | -| W17 | 如何讓觀眾相信我的技術說明? | 期末發表 A、個人口頭問答與同儕回饋 | 完整作品與答辯 | -| W18 | 如何從成果回推可改進的系統? | 期末發表 B、互評、反思與封存 | 完整作品、README、AI 使用紀錄 | - -## 課程設備策略 - -所有必做內容都必須具備 **CPU 基準路徑**。需要較多算力的生成或微調,採下列順序: - -1. 先用紙上模型、少量 NumPy 程式或預先產生的中間結果理解原理。 -2. 再使用 ChatGPT/Gemini 免費版完成少量生成實驗。 -3. 免費 Colab GPU 只作為可用時的加速選項,不把 GPU 配額當作作業前提。 -4. LoRA 以資料規劃、參數影響與成品比較為必做;實際訓練屬加分或教師示範。 - -## 評量建議 - -### 日間部 - -- 每週概念檢核與 Exit Ticket:20% -- 引導式實作與媒體實驗:25% -- W08 期中影像作品:20% -- W16 進度小報告:10% -- W17–18 期末短影音與答辯:25% - -### 進修部 - -- 共同概念檢核與課堂參與:15% -- 階段作品與技術紀錄:20% -- W08 期中影像作品:20% -- W16 進度小報告:10% -- W17–18 期末短影音與答辯:35% - -## 期末作品最低規格 - -- 直式 720×1280、15–30 秒、MP4。 -- 3–6 個視覺素材,具旁白與字幕;背景音樂至多一軌。 -- 至少使用一項本課程的影像處理或生成技術,以及一項聲音處理技術。 -- 繳交成品、來源素材、程式或可重現步驟、`README.md`、`AI_USAGE.md` 與素材授權/同意紀錄。 -- 能個別說明輸入、輸出、關鍵參數、失敗案例、限制與改善方法。 - -## 深偽與生成內容安全界線 - -- 僅能使用自己的聲音/影像、取得明確同意的素材,或完全合成的角色。 -- 禁止仿冒同學、教師、公眾人物或未同意者;禁止製作詐騙、羞辱、色情或可能造成誤認的內容。 -- 所有生成或合成內容都必須清楚標示,並保留來源、同意、提示、工具與後製紀錄。 -- 「能生成」不等於「可以發布」。公開前必須重新確認授權與可識別個資。 - -## 共用教學節奏 - -每週建議以「情境問題 → 原理模型 → 小型實驗 → 創作任務 → 口頭說明」進行。技術不只留在投影片:學生必須改變一個參數、觀察一個結果、提出一個解釋,並留下可以重現的紀錄。 - diff --git a/course-115/notebooklm/README.md b/course-115/notebooklm/README.md deleted file mode 100644 index 62dc209..0000000 --- a/course-115/notebooklm/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# NotebookLM 課程來源與產物 - -## 筆記本 - -- 名稱:多媒體系統115|影像、聲音與短影音 -- Notebook ID:`e7ba64b8-3945-4e47-95bd-b3d8c5e90388` -- 建立日期:2026-08-10 - -`source-manifest.json` 保存實際加入的來源與狀態。W01–W05、W08、共同課綱與參考來源為個別來源;因 Google 檔案註冊服務在 W06、W07 連續逾時,其餘週次改為每兩週一份的純文字來源。內容仍取自同一批本機 Markdown,未額外補造資料。 - -## 官方 NotebookLM 產物 - -- `NotebookLM_Study_Guide.md`:繁體中文 study guide,依課程來源生成。 -- `NotebookLM_Course_Overview.pptx`:NotebookLM 原生 21 頁全學期總覽簡報。 -- `artifacts.json`:產物 ID、類型與狀態。 - -NotebookLM 原生簡報是課程級導讀與來源交叉檢查素材;每週正式授課使用 `../slides/` 中由 PPT 技能產生並完成視覺檢查的 W01–W18 簡報。 - -## 使用提醒 - -- NotebookLM 產物可能使用與本課程不同的版面或中英混合標籤,教師授課前仍應快速檢視。 -- 原生產物右下角可能保留 NotebookLM 服務標記,不應移除或冒充自行繪製。 -- 每週概念、公式、作業規格與安全界線,以 `../weeks/` 與 `../common-syllabus-2026.md` 為準。 - diff --git a/course-115/notebooklm/artifacts.json b/course-115/notebooklm/artifacts.json deleted file mode 100644 index 628fe60..0000000 --- a/course-115/notebooklm/artifacts.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "notebook_id": "e7ba64b8-3945-4e47-95bd-b3d8c5e90388", - "notebook_title": "多媒體系統115|影像、聲音與短影音", - "artifacts": [ - { - "index": 1, - "id": "e7b8acb7-526b-4cac-ae2e-f1083fd9b185", - "title": "Multimedia Systems Engineering", - "type": "Slide Deck", - "type_id": "slide_deck", - "status": "completed", - "status_id": 3, - "created_at": "2026-08-10T15:17:46+00:00" - }, - { - "index": 2, - "id": "93acf953-f32d-4196-aca6-12bf4ecad8c1", - "title": "多媒體系統課程學習指南", - "type": "Report", - "type_id": "report", - "status": "completed", - "status_id": 3, - "created_at": "2026-08-10T15:16:21+00:00" - } - ], - "count": 2 -} diff --git a/course-115/notebooklm/source-manifest.json b/course-115/notebooklm/source-manifest.json deleted file mode 100644 index 6787235..0000000 --- a/course-115/notebooklm/source-manifest.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "notebook_id": "e7ba64b8-3945-4e47-95bd-b3d8c5e90388", - "notebook_title": "多媒體系統115|影像、聲音與短影音", - "sources": [ - { - "index": 1, - "id": "a65001bb-2997-4418-b397-54c8e9725c47", - "title": "W01_課程啟動與多媒體系統", - "type": "markdown", - "url": null, - "status": "ready", - "status_id": 2, - "created_at": "2026-08-10T15:10:38+00:00" - }, - { - "index": 2, - "id": "13f0fbea-10e9-46eb-aa08-0839b1c21307", - "title": "W02_數位影像與像素.md", - "type": "markdown", - "url": null, - "status": "ready", - "status_id": 2, - "created_at": "2026-08-10T15:10:49+00:00" - }, - { - "index": 3, - "id": "e284694b-4f74-4cda-a8ae-4177645fc2ab", - "title": "W03_卷積與影像處理.md", - "type": "markdown", - "url": null, - "status": "ready", - "status_id": 2, - "created_at": "2026-08-10T15:11:00+00:00" - }, - { - "index": 4, - "id": "0f728cb0-59d9-4975-8342-c5e10c0655e3", - "title": "W04_擴散模型原理.md", - "type": "markdown", - "url": null, - "status": "ready", - "status_id": 2, - "created_at": "2026-08-10T15:11:12+00:00" - }, - { - "index": 5, - "id": "5a41f935-4112-4509-b001-856f761c1c62", - "title": "W05_潛在擴散與提示控制", - "type": "markdown", - "url": null, - "status": "ready", - "status_id": 2, - "created_at": "2026-08-10T15:11:23+00:00" - }, - { - "index": 6, - "id": "c5fc6436-aff4-42fd-b670-50bab026e3e4", - "title": "W08_期中影像展與技術答辯", - "type": "markdown", - "url": null, - "status": "ready", - "status_id": 2, - "created_at": "2026-08-10T15:13:59+00:00" - }, - { - "index": 7, - "id": "6ef96a6d-e079-4b0e-90ba-1b9b6b951e84", - "title": "common-syllabus-2026", - "type": "markdown", - "url": null, - "status": "ready", - "status_id": 2, - "created_at": "2026-08-10T15:09:37+00:00" - }, - { - "index": 8, - "id": "017a941b-9973-4ff1-ae51-f32b7b6eca12", - "title": "references.md", - "type": "markdown", - "url": null, - "status": "ready", - "status_id": 2, - "created_at": "2026-08-10T15:09:49+00:00" - }, - { - "index": 9, - "id": "1d7cd929-f7a2-4ca7-820c-e255eefeb9b2", - "title": "課程講義補充|W06–W07", - "type": "markdown", - "url": null, - "status": "ready", - "status_id": 2, - "created_at": "2026-08-10T15:14:53+00:00" - }, - { - "index": 10, - "id": "2db14730-869f-4bf0-b7b5-d82745ab84bd", - "title": "課程講義補充|W09–W10", - "type": "markdown", - "url": null, - "status": "ready", - "status_id": 2, - "created_at": "2026-08-10T15:15:01+00:00" - }, - { - "index": 11, - "id": "10217a2f-8a54-4f4e-b104-a229264d9650", - "title": "課程講義補充|W11–W12", - "type": "markdown", - "url": null, - "status": "ready", - "status_id": 2, - "created_at": "2026-08-10T15:15:09+00:00" - }, - { - "index": 12, - "id": "0c1f5327-1fa6-4b85-ac3d-dfcad596d6a0", - "title": "課程講義補充|W13–W14", - "type": "markdown", - "url": null, - "status": "ready", - "status_id": 2, - "created_at": "2026-08-10T15:15:16+00:00" - }, - { - "index": 13, - "id": "e72f20db-bdd6-4796-847a-bcc1f987989a", - "title": "課程講義補充|W15–W16", - "type": "markdown", - "url": null, - "status": "ready", - "status_id": 2, - "created_at": "2026-08-10T15:15:23+00:00" - }, - { - "index": 14, - "id": "f573242e-d065-480d-8701-39b1525c7178", - "title": "課程講義補充|W17–W18", - "type": "markdown", - "url": null, - "status": "ready", - "status_id": 2, - "created_at": "2026-08-10T15:15:30+00:00" - } - ], - "count": 14 -} diff --git a/course-115/scripts/build_colab_notebooks.py b/course-115/scripts/build_colab_notebooks.py deleted file mode 100644 index d0ac02f..0000000 --- a/course-115/scripts/build_colab_notebooks.py +++ /dev/null @@ -1,54 +0,0 @@ -"""把 labs 中的教學腳本包裝為可上傳至 Colab 的單一程式碼 Notebook。""" - -from __future__ import annotations -import json -from pathlib import Path - - -ROOT = Path(__file__).resolve().parents[1] -LABS = ROOT / "labs" -OUT = ROOT / "colab" -FILES = { - "W02_Image_Basics.ipynb": "w02_image_basics.py", - "W03_Convolution.ipynb": "w03_convolution.py", - "W04_Diffusion_Forward.ipynb": "w04_diffusion_forward.py", - "W10_Audio_Spectrum.ipynb": "w10_audio_spectrum.py", - "W11_Audio_Edit.ipynb": "w11_audio_edit.py", - "W15_Make_Short.ipynb": "w15_make_short.py", -} - - -def notebook(title: str, script: str) -> dict: - install = "!pip -q install Pillow numpy opencv-python-headless matplotlib librosa soundfile moviepy" - return { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [f"# {title}\n", "請先上傳講義指定的輸入素材,再依序執行。CPU 可完成;Colab GPU 非必要。\n"], - }, - {"cell_type": "code", "execution_count": None, "metadata": {}, "outputs": [], "source": [install]}, - {"cell_type": "code", "execution_count": None, "metadata": {}, "outputs": [], "source": script.splitlines(True)}, - ], - "metadata": { - "colab": {"provenance": []}, - "kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, - "language_info": {"name": "python"}, - }, - "nbformat": 4, - "nbformat_minor": 5, - } - - -def main() -> None: - OUT.mkdir(exist_ok=True) - for notebook_name, script_name in FILES.items(): - source = (LABS / script_name).read_text(encoding="utf-8") - data = notebook(notebook_name.removesuffix(".ipynb").replace("_", " "), source) - (OUT / notebook_name).write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8") - print(notebook_name) - - -if __name__ == "__main__": - main() - diff --git a/course-115/scripts/build_weekly_slides.js b/course-115/scripts/build_weekly_slides.js deleted file mode 100644 index b3cbdd5..0000000 --- a/course-115/scripts/build_weekly_slides.js +++ /dev/null @@ -1,137 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const pptxgen = require('pptxgenjs'); -const html2pptx = require('C:/Users/Willis/.agents/skills/pptx/scripts/html2pptx.js'); - -const ROOT = path.resolve(__dirname, '..'); -const OUT = path.join(ROOT, 'slides'); -const HTML = path.join(OUT, '_html'); -const TMP = path.join(OUT, '_tmp'); - -const weeks = [ - {w:'W01',t:'先拆解,再創作',q:'什麼才算一個多媒體系統?',m:'系統與紀錄',c:'#24d7ff',img:'course-map.png', - goals:['分辨多媒體檔案與多媒體系統','用輸入—處理—輸出—驗證拆解短片','用 Markdown 建立可追溯筆記'], - principles:['媒體管線不是工具清單,而是資料如何流動','輸出要能播放,也要能說明來源與限制','AI 可以協作,但提示、採用與驗證都要留下'], - terms:['input','process','output','validation'],lab:['選一支 15–30 秒短片','記錄圖片、聲音、字幕與時間','畫出最小系統圖','完成 HackMD 個人筆記'], - day:'固定六格觀察表;指出一個可見效果與一個隱藏設定。',night:'拆解工作或生活流程;增加效能限制與權利風險。', - deliver:['HackMD 筆記','媒體拆解表','100–150 字反思'],exit:['檔案與系統差在哪裡?','哪一步最可能出錯?','期末希望觀眾理解什麼?']}, - {w:'W02',t:'數位影像與像素',q:'一張圖片在電腦裡是什麼?',m:'影像模組',c:'#24d7ff',img:'pixel-rgb.png', - goals:['讀取尺寸、模式、格式與像素','解釋 RGB/RGBA 與色彩深度','比較 PNG 與多組 JPEG 品質'], - principles:['解析度是像素數,不等於整體畫質','未壓縮量=寬×高×通道×位元÷8','格式選擇要同時看用途、品質、大小與相容性'], - terms:['pixel','RGB/RGBA','bit depth','lossy/lossless'],lab:['用 Pillow 讀取 input.jpg','輸出 PNG 與 JPEG 95/70/40','記錄檔案大小與可見瑕疵','每次只改一個變因'], - day:'固定輸入與觀察表,回答「最小是否最適合」。',night:'比較照片與文字截圖,分析內容複雜度。',deliver:['程式與四張輸出','格式比較表','150 字結論'],exit:['寬高減半剩多少像素?','透明圖為何不選 JPEG?','格式名稱能保證品質嗎?']}, - {w:'W03',t:'卷積與影像處理',q:'濾鏡為什麼能找出邊緣?',m:'影像模組',c:'#24d7ff',img:'convolution.png', - goals:['手算一個 3×3 卷積','辨認模糊、銳化與邊緣核','解釋 padding 與資料型別'], - principles:['卷積是鄰域加權和,不是魔法按鈕','邊界策略會改變輸出邊緣','負值與大於 255 的結果需要正確處理'], - terms:['kernel','padding','clipping','gradient'],lab:['紙上算 3×3 灰階區塊','用 NumPy 實作卷積','與 OpenCV/Pillow 對照','製作柔和、銳利與線稿三版'], - day:'固定 kernel,只改一個權重或門檻。',night:'建立資料夾批次處理與命名規則。',deliver:['三種濾鏡輸出','參數與時間紀錄','失敗案例'],exit:['平均核為何除以總和?','邊緣等於物體辨識嗎?','整張發黑先查什麼?']}, - {w:'W04',t:'擴散模型原理',q:'AI 如何從雜訊生成圖片?',m:'生成影像',c:'#ef4ed8',img:'diffusion-process.png', - goals:['區分前向加噪與反向生成','解釋時間步條件與雜訊預測','用 CPU 驗證訊號/雜訊比例'], - principles:['前向過程可直接依排程加高斯雜訊','模型常學習 εθ(xₜ,t) 的雜訊估計','生成從隨機雜訊開始,逐步取得較乾淨樣本'], - terms:['DDPM','noise schedule','U-Net','timestep'],lab:['固定 seed=42','比較 ᾱ=.95/.70/.30/.05','輸出連續加噪圖','畫四格技術概念卡'], - day:'固定圖片、seed,只改 ᾱ。',night:'比較線性/餘弦概念排程的加噪速度。',deliver:['CPU 加噪圖','四格概念卡','參數觀察'],exit:['前向加噪需要神經網路嗎?','模型每步預測什麼?','同提示為何有不同結果?']}, - {w:'W05',t:'潛在擴散與提示控制',q:'文字如何控制生成影像?',m:'生成影像',c:'#ef4ed8',img:'latent-diffusion.png', - goals:['說明 VAE 壓縮與解碼','理解文字編碼與交叉注意力','公平比較 prompt、seed、steps、CFG'], - principles:['在 latent 空間去噪可降低空間計算量','交叉注意力把文字條件帶入影像特徵','CFG 過高可能造成失真,steps 也非越多越好'], - terms:['VAE','latent','cross-attention','CFG/seed'],lab:['選中性且可公開的主題','固定比例與可見參數','A/B/C 每次只加一層規格','記錄改善與新失敗'], - day:'固定三段式提示模板,只調整一個段落。',night:'建立三張圖共用的角色與風格規格。',deliver:['三版生成結果','控制變因表','提示與採用紀錄'],exit:['VAE 為何省計算?','seed 不能保證什麼?','CFG 越高一定越好嗎?']}, - {w:'W06',t:'LoRA 與影像微調',q:'影像微調到底改了什麼?',m:'生成影像',c:'#ef4ed8',img:'lora.png', - goals:['區分提示控制與參數更新','用 W′=W+BA 解釋低秩更新','設計合法、可測試的小型資料集'], - principles:['LoRA 凍結原權重,學習小型低秩更新','資料角度、背景與標註決定模型學到什麼','訓練損失下降不等於未見情境表現變好'], - terms:['fine-tuning','rank r','overfitting','hold-out test'],lab:['規劃 12–20 張候選圖','填寫來源、同意與標註資料卡','區分訓練候選與測試提示','判斷欠擬合/適當/過擬合'], - day:'用固定虛構角色找出四類資料問題。',night:'自訂非人物概念,提出測試矩陣與停止條件。',deliver:['LoRA 微調企畫','資料卡','測試與停止條件'],exit:['為何稱為低秩?','小檔案等於低風險嗎?','如何判斷泛化?']}, - {w:'W07',t:'生成影像工作室',q:'如何做出一致而可信的影像系列?',m:'影像作品',c:'#ef4ed8',img:'image-story-workflow.png', - goals:['先建立視覺規格再生成','用版本比較改善一致性','完成尺寸、色調與安全區後製'], - principles:['單張好看不等於能形成影片','固定角色、色盤、構圖語言與字幕空間','AI 輸出是素材;瑕疵與來源仍需人工檢查'], - terms:['visual bible','consistency','safe area','versioning'],lab:['寫故事句與四格分鏡','建立角色/色盤/構圖規格','生成、拒絕、修正並記錄','輸出 3–6 張統一比例圖片'], - day:'固定「狀態—問題—處理—結果」四格。',night:'自訂敘事並建立可重用提示元件。',deliver:['3–6 張影像','視覺規格與分鏡','來源、提示與瑕疵表'],exit:['固定了哪些變因?','哪種一致性最難?','哪張圖最可能造成誤解?']}, - {w:'W08',t:'期中影像展與技術答辯',q:'我能不能解釋作品背後的技術?',m:'期中評量',c:'#ff6b5e',img:'image-showcase.png', - goals:['用三分鐘說明影像作品','以控制實驗支持改善判斷','個別回答影像與生成原理'], - principles:['評量可重現性,不只看華麗程度','展示失敗版比只秀成品更能說明決策','不確定時先區分觀察、推論與待查證'], - terms:['evidence','baseline','failure case','oral defense'],lab:['30 秒問題','60 秒流程','45 秒核心技術','30 秒比較+15 秒限制'], - day:'依固定檢核表說明參數、輸出與錯誤。',night:'補充設計取捨與專題延伸路徑。',deliver:['影像故事組','3–5 頁展示','個人反思'],exit:['哪個證據支持你的選擇?','哪項限制仍存在?','哪些素材進入期末?']}, - {w:'W09',t:'期中考週',q:'本週不授新課',m:'校務週',c:'#7c8799',img:'course-map.png', - goals:['確認班級首頁公告','檢查 W01–W08 檔案可開啟','保留時間準備其他科目'],principles:['不新增技術內容','不新增實作進度','可選整理不列新作業'],terms:['no new lesson'],lab:['確認期中評量安排','整理回饋:保留/修改/待查證','準備下週耳機','不需提前製作後半作品'],day:'依班級公告處理。',night:'依班級公告處理。',deliver:['無新作業'],exit:['下週:數位聲音與頻譜']}, - {w:'W10',t:'數位聲音與頻譜',q:'聲音如何變成可以運算的數字?',m:'聲音模組',c:'#9b6cff',img:'audio-sampling-stft.png', - goals:['解釋取樣率、位元深度與 Nyquist','區分波形、FFT 與 STFT','比較窗長與 hop length'], - principles:['取樣率要高於最高頻率兩倍只是理想基礎','FFT 看整段頻率,STFT 保留局部時間','窗長增加通常改善頻率解析、犧牲時間解析'], - terms:['sample rate','Nyquist','FFT','STFT'],lab:['載入 3–5 秒 WAV','畫波形與 STFT dB 圖','只改 n_fft 或 hop length','比較拍手、母音、環境聲'], - day:'用固定三段音檔辨認時間與頻率特徵。',night:'提出一個必須用 STFT 才容易回答的問題。',deliver:['波形與時頻圖','參數比較','觀察說明'],exit:['44.1 kHz 是可聽上限嗎?','為何要分窗?','窗長如何取捨?']}, - {w:'W11',t:'聲音剪輯與訊號處理',q:'剪輯聲音時,實際改變了什麼?',m:'聲音模組',c:'#9b6cff',img:'audio-editing.png', - goals:['區分裁切、淡化、正規化與壓縮','解釋變速與變調不是同一件事','完成可用於短片的 20–30 秒旁白'], - principles:['淡入淡出是隨時間變化的增益','峰值正規化不等於動態壓縮','極端降噪、time stretch 與 pitch shift 都會產生瑕疵'], - terms:['gain envelope','normalization','compressor','phase vocoder'],lab:['備份原音再裁切','套用淡入淡出與峰值檢查','做一次變速或變調 A/B','以耳機與喇叭複查'], - day:'固定旁白完成三項基本處理。',night:'建立批次腳本與參數停止條件。',deliver:['原音/成品對照','參數與瑕疵紀錄','旁白檔'],exit:['正規化與壓縮差在哪裡?','加快為何會升音?','哪些問題應重錄?']}, - {w:'W12',t:'語音合成與深偽辨識',q:'聲音深偽如何生成,又如何辨識風險?',m:'聲音模組',c:'#9b6cff',img:'voice-synthesis-safety.png', - goals:['區分 TTS、voice cloning、voice conversion','說明 mel、vocoder、speaker embedding','建立多證據查證流程'], - principles:['文字/音素→聲學模型→mel→vocoder→波形','speaker embedding 是說話者特徵表示','偵測器分數只能當線索,不能單獨定論'], - terms:['TTS','mel spectrogram','vocoder','speaker embedding'],lab:['盲聽授權真實/合成音檔','寫判斷、信心與可觀察線索','查看波形與頻譜後修正','提出仍需的外部證據'], - day:'固定音檔比較,排序 TTS 管線。',night:'設計收到可疑語音時的技術+情境查證流程。',deliver:['盲聽紀錄','揭露卡','安全查證流程'],exit:['embedding 是聲音檔嗎?','vocoder 輸入輸出為何?','為何不可單靠偵測分數?']}, - {w:'W13',t:'短影音腳本與數位影片',q:'短影音不是把素材排在一起而已嗎?',m:'影片模組',c:'#ff9f43',img:'short-video-storyboard.png', - goals:['以時間預算寫 15–30 秒腳本','理解 FPS、解析度、timebase 與同步','完成 4–6 格分鏡'], - principles:['FPS 是時間取樣密度,不等於敘事內容量','旁白、字幕與畫面要共享同一時間設計','直式畫面需保留字幕與平台介面安全區'], - terms:['FPS','timebase','9:16','storyboard'],lab:['寫一句核心訊息','朗讀旁白並實際計時','分配 Hook/Context/Process/Result','填入素材、字幕與聲音'], - day:'固定五段時間模板與四格分鏡。',night:'自訂節奏,但需低算力備援與素材風險。',deliver:['15–30 秒旁白','4–6 格分鏡','時間與素材清單'],exit:['影格增加等於內容增加嗎?','字幕安全區在哪裡?','素材不足時先縮小什麼?']}, - {w:'W14',t:'生成內容與素材溯源',q:'如何建立可追溯的多媒體素材庫?',m:'影片模組',c:'#ff9f43',img:'media-provenance.png', - goals:['建立 source/image/audio/subtitle 結構','填寫素材來源、授權、同意與 AI 紀錄','讓素材包可由他人快速接手'], - principles:['素材包是剪輯流程的輸入契約','內嵌 metadata 可能在轉檔或上傳時消失','provenance 應記錄來源、處理與用途鏈'], - terms:['metadata','provenance','asset ID','consent scope'],lab:['整理 8–12 個素材','填 ASSET_LOG.csv','交換素材包做五分鐘驗收','替缺檔或失權素材準備備援'], - day:'使用固定資料夾與表格欄位。',night:'增加版本規則與缺檔自動檢查。',deliver:['完整素材包','ASSET_LOG.csv','AI_USAGE.md'],exit:['metadata 與 provenance 差在哪?','為何不覆寫原始檔?','哪個素材失權就要換?']}, - {w:'W15',t:'FFmpeg 與短影音合成',q:'影片如何被合成與壓縮?',m:'影片模組',c:'#ff9f43',img:'video-codec-gop.png', - goals:['分辨 container 與 codec','理解 I/P/B frame、GOP 與 bitrate','輸出 720×1280 MP4 粗剪版'], - principles:['MP4 是容器,H.264 是視訊編碼方式','編碼利用影格內與影格間冗餘','關鍵影格密度、bitrate、內容動態與品質互相牽動'], - terms:['container','codec','keyframe/GOP','CRF/bitrate'],lab:['用 ffprobe 讀取 streams','維持比例縮放並補邊','合成圖片、旁白與字幕','換兩個 CRF 比較大小與瑕疵'], - day:'固定四張圖與旁白完成組裝。',night:'依自選分鏡建立可重跑腳本與 CPU 降級路徑。',deliver:['720×1280 rough cut','ffprobe 紀錄','兩組壓縮比較'],exit:['MP4 與 H.264 能互換嗎?','關鍵影格越多越好嗎?','為何不可直接拉伸?']}, - {w:'W16',t:'進度小報告與系統測試',q:'作品是否已經成為一個系統?',m:'專題整合',c:'#ff6b5e',img:'final-project-pipeline.png', - goals:['播放從頭到尾可運作的 rough cut','用架構圖說明資料流','完成正常、邊界與錯誤測試'], - principles:['先修不能播放、看不懂、聽不清楚','再修來源、同意、揭露與可重現性','最後才增加轉場、動畫與裝飾'], - terms:['rough cut','architecture','edge case','fallback'],lab:['30 秒問題+60 秒播放','60 秒架構+60 秒技術比較','45 秒權利與 AI 揭露','45 秒風險與期限'], - day:'固定表逐組檢查播放、聲畫、字幕與來源。',night:'說明刪除或延後一項功能如何降低風險。',deliver:['Rough cut','一頁架構圖','三類測試與任務表'],exit:['哪個錯誤最先修?','雲端失效時怎麼辦?','期末前只保留哪三件事?']}, - {w:'W17',t:'期末成果發表 A',q:'如何讓觀眾相信我的技術說明?',m:'期末發表',c:'#ff6b5e',img:'final-project-pipeline.png', - goals:['完整播放與個別答辯','連結作品流程與技術原理','給出可操作的同儕回饋'],principles:['不以特效數與生成量評分','每項主張要有作品或紀錄支持','個人仍需說明自己的決策、失敗與限制'],terms:['demo','evidence','oral defense','peer review'],lab:['播放作品','說明問題與管線','展示技術比較與失敗','回答個別原理問題'],day:'依固定答辯範圍準備。',night:'補充整合取捨與實務限制。',deliver:['完整作品','答辯','兩組同儕回饋'],exit:['哪個證據最有說服力?','哪個問題仍待改善?']}, - {w:'W18',t:'成果發表 B 與封存',q:'如何從成果回推可改進的系統?',m:'期末發表',c:'#ff6b5e',img:'final-project-pipeline.png', - goals:['完成第二梯次發表','封存素材、程式與紀錄','用具體案例完成個人反思'],principles:['雲端網址與免費額度可能失效','應保留原始素材、開放紀錄與可重現步驟','反思要區分觀察、判斷、限制與下一步'],terms:['archive','README','AI_USAGE','reflection'],lab:['完整播放與答辯','確認 final.mp4','檢查 README/ASSET_LOG/AI_USAGE','完成五題個人反思'],day:'依封存清單逐項驗收。',night:'補充未來部署或再利用條件。',deliver:['完整專題資料夾','個人反思','可開啟的最終連結'],exit:['哪個概念改變了決策?','哪次 AI 建議被拒絕?','公開前還要查什麼?']}, -]; - -function esc(s){return String(s).replace(/[&<>"']/g,ch=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[ch]));} -function dataUri(file){const p=path.join(ROOT,'assets','diagrams',file);return `data:image/png;base64,${fs.readFileSync(p).toString('base64')}`;} -function baseCss(color){return ` -*{box-sizing:border-box} html,body{margin:0;width:720pt;height:405pt;overflow:hidden;background:#11151d;color:#f5f7fb;font-family:Arial,sans-serif} -body{position:relative} .slide{width:720pt;height:405pt;padding:30pt 34pt;position:relative;overflow:hidden} -.top{display:flex;align-items:center;justify-content:space-between;margin-bottom:18pt}.week{font:700 12pt 'Courier New',monospace;color:${color};letter-spacing:1.2pt}.module{font-size:10pt;color:#aab3c3} -h1{font-size:30pt;line-height:1.08;margin:0 0 10pt 0;letter-spacing:-.5pt} h2{font-size:21pt;line-height:1.12;margin:0 0 14pt 0} h3{font-size:13pt;margin:0 0 8pt 0;color:${color}} -p{font-size:13pt;line-height:1.35;margin:0}.muted{color:#aab3c3}.accent{color:${color}} .small{font-size:9.5pt;line-height:1.3} -.rule{height:3pt;width:70pt;background:${color};margin:13pt 0}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:18pt}.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:12pt} -.card{background:#1a202b;border:1pt solid #313a49;border-radius:10pt;padding:14pt}.card.ac{border-color:${color}} .num{width:28pt;height:28pt;border-radius:50%;background:${color};color:#10141c;display:flex;align-items:center;justify-content:center;margin-bottom:8pt}.num p{font-weight:800;font-size:13pt} -ul{margin:4pt 0 0 17pt;padding:0}li{font-size:12pt;line-height:1.32;margin-bottom:6pt}.chips{display:flex;gap:7pt;flex-wrap:wrap}.chip{border:1pt solid ${color};border-radius:20pt;padding:5pt 9pt;background:#151b24}.chip p{font:700 9pt 'Courier New',monospace;color:${color}} -.hero{display:grid;grid-template-columns:42% 58%;gap:25pt;align-items:center;height:320pt}.heroImg{width:100%;height:285pt;object-fit:cover;border-radius:13pt;border:1pt solid #30394a} -.wideImg{width:100%;height:185pt;object-fit:cover;border-radius:12pt;border:1pt solid #30394a}.footer{position:absolute;bottom:16pt;left:34pt;right:34pt;display:flex;justify-content:space-between}.footer p{font:8pt 'Courier New',monospace;color:#697386} -.split{display:grid;grid-template-columns:1fr 1fr;gap:16pt;margin-top:18pt}.split .card{min-height:130pt}.tag{font:700 10pt 'Courier New',monospace;color:${color};margin-bottom:7pt}.question{font-size:19pt;line-height:1.22;color:#dfe5ef} -`} -function page(w,body){return `
${body}
`;} -function top(w){return `

${esc(w.w)}

${esc(w.m)}

`;} -function bullets(items){return `
    ${items.map(x=>`
  • ${esc(x)}
  • `).join('')}
`;} - -function slidesFor(w){ - const img=dataUri(w.img); const slides=[]; - slides.push(page(w,`
${top(w)}

${esc(w.t)}

${esc(w.q)}

從原理、實驗到可說明的作品

`)); - slides.push(page(w,`${top(w)}

本週學習地圖

${w.goals.map((x,i)=>`

${i+1}

${esc(x)}

`).join('')}
`)); - slides.push(page(w,`${top(w)}

核心原理

${w.principles.map((x,i)=>`

0${i+1}

${esc(x)}

`).join('')}

關鍵詞

${w.terms.map(x=>`

${esc(x)}

`).join('')}

說明規則

指出輸入、改變的參數、觀察到的輸出,以及仍不能確定的部分。

`)); - slides.push(page(w,`${top(w)}

課堂實驗/任務

${w.lab.map((x,i)=>`

${i+1}

${esc(x)}

`).join('')}
`)); - if(w.w!=='W09') slides.push(page(w,`${top(w)}

同一核心,兩種支架

日間引導

${esc(w.day)}

進修挑戰

${esc(w.night)}

共同底線

CPU 路徑可完成;AI 生成需記錄;素材需有來源與同意;每位學生都能說明關鍵原理。

`)); - slides.push(page(w,`${top(w)}

本週完成條件

繳交

${bullets(w.deliver)}

Exit Ticket

${bullets(w.exit)}

不要只交成品:留下變因、觀察、判斷與限制,才能把作品變成可學習的系統。

`)); - return slides; -} - -async function buildDeck(w){ - const deckDir=path.join(HTML,w.w); fs.mkdirSync(deckDir,{recursive:true}); - const htmlSlides=slidesFor(w); const files=[]; - htmlSlides.forEach((html,i)=>{const f=path.join(deckDir,`slide-${String(i+1).padStart(2,'0')}.html`);fs.writeFileSync(f,html);files.push(f)}); - const pptx=new pptxgen(); pptx.layout='LAYOUT_16X9'; pptx.author='Willis Max'; pptx.subject='多媒體系統 115'; pptx.title=`${w.w}|${w.t}`; pptx.company='課程教材'; pptx.lang='zh-TW'; - pptx.defineSlideMaster({title:'BASE',background:{color:'11151D'},objects:[],slideNumber:{x:12.45,y:7.1,w:.35,h:.18,color:'697386',fontFace:'Arial',fontSize:7}}); - for(const file of files){await html2pptx(file,pptx,{tmpDir:TMP});} - const out=path.join(OUT,`${w.w}_${w.t.replace(/[\\/:*?"<>|]/g,'_')}.pptx`); await pptx.writeFile({fileName:out}); console.log(out); -} - -(async()=>{fs.mkdirSync(OUT,{recursive:true});fs.mkdirSync(TMP,{recursive:true});for(const w of weeks)await buildDeck(w);})().catch(e=>{console.error(e);process.exit(1)}); - diff --git a/course-115/scripts/export_pptx_previews.ps1 b/course-115/scripts/export_pptx_previews.ps1 deleted file mode 100644 index dccb064..0000000 --- a/course-115/scripts/export_pptx_previews.ps1 +++ /dev/null @@ -1,27 +0,0 @@ -$ErrorActionPreference = 'Stop' -$courseRoot = Split-Path -Parent $PSScriptRoot -$slidesRoot = Join-Path $courseRoot 'slides' -$exportRoot = Join-Path $slidesRoot 'previews\exported' -New-Item -ItemType Directory -Force -Path $exportRoot | Out-Null - -$powerPoint = New-Object -ComObject PowerPoint.Application -try { - foreach ($deck in Get-ChildItem -LiteralPath $slidesRoot -Filter '*.pptx' | Sort-Object Name) { - $target = Join-Path $exportRoot $deck.BaseName - New-Item -ItemType Directory -Force -Path $target | Out-Null - $presentation = $powerPoint.Presentations.Open($deck.FullName, $true, $true, $false) - try { - # 18 = ppSaveAsPNG - $presentation.SaveAs($target, 18) - Write-Output $deck.Name - } - finally { - $presentation.Close() - } - } -} -finally { - $powerPoint.Quit() - [System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($powerPoint) | Out-Null -} - diff --git a/course-115/scripts/make_slide_montages.py b/course-115/scripts/make_slide_montages.py deleted file mode 100644 index 8480950..0000000 --- a/course-115/scripts/make_slide_montages.py +++ /dev/null @@ -1,45 +0,0 @@ -"""將 PowerPoint 匯出的 Slide*.PNG 組成每週一張縮圖總覽。""" - -from pathlib import Path -from PIL import Image, ImageDraw, ImageFont - - -ROOT = Path(__file__).resolve().parents[1] / "slides" / "previews" -SOURCE = ROOT / "exported" -OUTPUT = ROOT / "montages" - - -def natural_key(path: Path) -> int: - digits = "".join(ch for ch in path.stem if ch.isdigit()) - return int(digits or 0) - - -def main() -> None: - OUTPUT.mkdir(parents=True, exist_ok=True) - font = ImageFont.load_default() - for deck in sorted(path for path in SOURCE.iterdir() if path.is_dir()): - slides = sorted(list(deck.glob("Slide*.PNG")) + list(deck.glob("投影片*.PNG")), key=natural_key) - if not slides: - slides = sorted(deck.glob("*.PNG"), key=natural_key) - if not slides: - continue - columns, thumb_width = 3, 480 - opened = [Image.open(slide).convert("RGB") for slide in slides] - thumb_height = round(thumb_width * opened[0].height / opened[0].width) - rows = (len(opened) + columns - 1) // columns - sheet = Image.new("RGB", (columns * thumb_width, rows * (thumb_height + 28)), "#0b0e14") - draw = ImageDraw.Draw(sheet) - for index, image in enumerate(opened): - image.thumbnail((thumb_width, thumb_height)) - x = (index % columns) * thumb_width - y = (index // columns) * (thumb_height + 28) - sheet.paste(image, (x, y)) - draw.text((x + 8, y + thumb_height + 6), f"Slide {index + 1}", fill="white", font=font) - output = OUTPUT / f"{deck.name}.jpg" - sheet.save(output, quality=88) - print(output) - - -if __name__ == "__main__": - main() - diff --git a/course-115/scripts/run_weekly_slides_v4.js b/course-115/scripts/run_weekly_slides_v4.js deleted file mode 100644 index c09a816..0000000 --- a/course-115/scripts/run_weekly_slides_v4.js +++ /dev/null @@ -1,15 +0,0 @@ -// 最終相容啟動器:HTML 只負責文字與版面,PNG 由 PptxGenJS 直接加入。 -const fs = require('fs'); -const path = require('path'); -let source = fs.readFileSync(path.join(__dirname, 'build_weekly_slides.js'), 'utf8'); -source = source.replace("LAYOUT_16X9", "LAYOUT_16x9"); -source = source.replace("const HTML = path.join(OUT, '_html');", "const HTML = 'C:/tmp/media-course-slides/html';"); -source = source.replace("const TMP = path.join(OUT, '_tmp');", "const TMP = 'C:/tmp/media-course-slides/tmp';"); -source = source.replace(//g, '
'); -source = source.replace(//g, '
'); -source = source.replace( - "for(const file of files){await html2pptx(file,pptx,{tmpDir:TMP});}", - "for(let i=0;i 外部講義與書目可能更新;正式開課時請在本頁記錄採用版本、章節及最後檢查日期。書籍內容只列閱讀範圍,不將受著作權保護的內容複製進 repository。 - -## 建議單元順序 - -以下是可依學校行事曆伸縮的單元,而非綁死日期的週次表。 - -| 單元 | 核心概念 | Repository 實作 | 建議產出 | -|---|---|---|---| -| 1. 多媒體系統導論 | 媒體類型、取樣、量化、檔案與串流 | 課程講義+格式觀察 | 媒體規格比較表 | -| 2. Python 最小銜接 | 變數、容器、函式、Notebook | [`01.Intro-Python`](../../01.Intro-Python/README.md) 精選 | 能讀取並描述一份媒體資料 | -| 3. 數位影像 | 像素、色彩空間、解析度、壓縮與 metadata | [`09.Apps`](../../09.Apps/README.md)、OpenCV 入門 | 影像轉換小作品 | -| 4. 數位音訊 | 波形、取樣率、位元深度、聲道與編碼 | 待補 `media/audio` 共用模組 | 音訊比較與視覺化 | -| 5. 數位視訊 | 畫格、幀率、容器、codec、空間/時間壓縮 | [`08.OpenCV-Mediapipe-DEMO`](../../08.OpenCV-Mediapipe-DEMO/readme.md) | 視訊擷取或處理實驗 | -| 6. 互動媒體 | 輸入、回饋、介面與可用性 | [`02.Gradio`](../../02.Gradio/README.md) | 可操作的媒體 demo | -| 7. 網路與發布 | 容量、頻寬、延遲、媒體傳輸與基本授權 | [`03.Request`](../../03.Request/README.md) 精選 | 取得合法開放素材並標示來源 | -| 8. 整合專題 | 需求、原型、測試、著作權與展示 | 依題目選用共用模組 | 分組作品、README、展示影片 | - -## 分流原則 - -- **核心**:媒體基本概念、影像、音訊、視訊、互動作品及來源/授權。 -- **選修**:API、Flask、AI、資料庫;只有專題需要時才帶入,避免課程再次變成 Web/API 課。 -- **補強**:沒有 Python 經驗的學生使用 `01.Intro-Python` 精選活動;已有經驗者改做媒體 metadata 挑戰,不需重上全部語法。 - -## 專題最低規格 - -1. 至少處理影像、音訊或視訊其中一類,並正確說明兩項媒體參數。 -2. 具有可操作的輸入與可觀察的輸出。 -3. 專題 README 記錄執行方式、相依套件、素材來源/授權、分工與限制。 -4. 展示測試案例,例如不同解析度、格式、裝置或錯誤輸入。 -5. 若使用生成式 AI 或第三方 API,揭露工具、資料傳送範圍與人工修改內容。 - -## 開課前待補教材 - -以下教材已採用 Colab 友善的 `.ipynb` 格式;每份依序提供目標、環境設定、分格實作、檢查與延伸挑戰。學生先完成基礎必做,再視能力進行標準實作或進階挑戰。 - -- [`media/image`](../../media/image/README.md):色彩、解析度、格式、壓縮與 metadata 的小型實驗。 -- [`media/audio`](../../media/audio/README.md):取樣、量化、波形與常見格式比較。 -- [`media/video`](../../media/video/README.md):frame、fps、container/codec 與基本剪輯/轉碼。 -- [`media/ethics`](../../media/ethics/README.md):著作權、Creative Commons、個資、肖像與生成式媒體標示。 - -日間部主線仍以影像處理與視覺安全為核心:`media/image` 與 `media/ethics` 可直接對應主要週次;音訊與視訊作為導論或專題延伸活動,避免分散核心進度。 diff --git a/courses/evening/README.md b/courses/evening/README.md deleted file mode 100644 index 84a938e..0000000 --- a/courses/evening/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# 進修部一年級:Python、API 與雲端應用 - -## 課程定位 - -承接學生可能具備但程度不一的 Python 經驗,以「程式如何和網路服務合作」為主線,從 HTTP/JSON、開放資料、API 與 Web service,走到可展示的雲端應用及分組專題。 - -- [前一學年課程主頁(HackMD 書本模式)](https://hackmd.io/@wiimax/Hy4cF6OOgx) -- [HackMD 每週教學講義母稿(18 週完整教案)](../../docs/HACKMD_WEEKLY_GUIDE.md) -- [repository 快速開始](../../docs/QUICKSTART.md) - -> 每週的目標、課前任務、150 分鐘課堂流程、分層挑戰、作業與 exit ticket 已整理在教學講義母稿。HackMD 保留公告與課堂互動,程式碼及作業規格以 repository 版本為準。 - -## 建議單元順序 - -| 單元 | 核心概念 | Repository 實作 | 檢核成果 | -|---|---|---|---| -| 0. 程度診斷 | 變數、容器、流程、函式、錯誤訊息 | [`01.Intro-Python`](../../01.Intro-Python/README.md) 精選 | 依結果提供補強清單,不讓全班重修 | -| 1. 網路基礎 | client/server、DNS、URL、HTTP method/status/header | [`03.Request`](../../03.Request/README.md) | 能以文字說明一次 request/response | -| 2. API 與資料 | JSON、參數、分頁、錯誤、速率限制、資料授權 | `擷取API資料.ipynb`、`RequestsOpenData_HW.ipynb` | 開放資料擷取與整理 | -| 3. 互動原型 | 輸入驗證、介面、例外情境 | [`02.Gradio`](../../02.Gradio/README.md) | 將資料流程包成可操作 demo | -| 4. Web API | route、REST、CRUD、測試 | [`05.Flask`](../../05.Flask/README.md)、[`07.Pytest-DEMO`](../../07.Pytest-DEMO/README.md) | 小型 API 與自動測試 | -| 5. 資料保存 | schema、SQLite、CRUD | [`10.sql`](../../10.sql/README.md) | 保存與查詢應用資料 | -| 6. 第三方整合 | token、webhook、secret、API 成本與隱私 | [`06.Line-bot-fly-flask`](../../06.Line-bot-fly-flask/README.md)、[`11.AI`](../../11.AI/README.md) | 串接一項外部服務 | -| 7. 雲端初體驗 | environment、log、部署、健康檢查與限制 | Flask/LINE Bot 專案(部署平台依當期選定) | 公開 demo 或可重現部署紀錄 | -| 8. 分組專題 | 題目驗證、版本控制、分工、測試、簡報 | 依題目選用模組 | 程式、README、展示與反思 | - -## 核心與選修 - -- **核心**:Python 診斷、HTTP/JSON、API、互動原型、secret 管理、部署概念及分組專題。 -- **選修**:爬蟲、LINE Bot、資料庫、LLM、OpenCV。選修由專題需求驅動,不要求每組使用相同技術。 -- **替代方案**:付費 API 或需信用卡的部署平台必須提供免費/本機方案;評分聚焦概念與可重現性,不以付費服務可用性評分。 - -## 專題關卡 - -| 關卡 | 應繳內容 | -|---|---| -| 提案 | 使用者、問題、資料/API 候選、風險、最小可行成果 | -| 技術驗證 | 一次成功及一次失敗的 API 呼叫、資料樣本、secret 管理方式 | -| 原型 | 可操作流程、基本錯誤處理、組員貢獻紀錄 | -| 完成版 | 原始碼、安裝與執行文件、測試、授權、展示連結或影片 | -| 發表 | 問題與取捨、現場展示、限制、後續改善,而非只介紹套件 | - -## 建議共同評量規準 - -- 問題與使用者需求:20% -- HTTP/API/雲端概念與技術整合:25% -- 可執行性、例外處理與測試:25% -- 文件、資料來源、授權與安全:15% -- 分工、展示與反思:15% - -每學期可調整比例,但應在開題前公布。API key、token 與個資不得出現在 Notebook 輸出、commit 或展示畫面中。 diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md deleted file mode 100644 index 4a0cfe9..0000000 --- a/docs/CHANGELOG.md +++ /dev/null @@ -1,227 +0,0 @@ -# 更新摘要 - uv 整合與文檔改進 - -## 📅 更新日期 -2025年11月27日 - -## 🎯 更新目標 -將 `uv` 作為推薦的 Python 套件管理工具整合到專案中,並改進專案文檔結構。 - ---- - -## ✨ 主要更新內容 - -### 1. 新增檔案 - -#### 📄 文檔檔案 -- **QUICKSTART.md** - 快速啟動指南 - - 所有專案的快速啟動指令 - - uv 常用指令參考 - - 各專案的啟動方式表格 - -- **LEARNING_PATH.md** - 完整學習路徑 - - 12週完整課程規劃 - - 6週快速上手路徑 - - 專題導向學習路徑 - - 每個章節的詳細說明 - - 學習建議與評量方式 - -- **scripts/README.md** - 腳本使用說明 - - PowerShell 腳本使用方式 - - 執行政策設定說明 - -#### 🔧 自動化腳本 - -**Windows (PowerShell)** -- **scripts/setup-uv.ps1** - 自動安裝 uv -- **scripts/run-flask.ps1** - 快速啟動 Flask 應用 -- **scripts/run-jupyter.ps1** - 快速啟動 Jupyter Notebook - -**Linux/macOS (Bash)** -- **scripts/run-flask.sh** - Flask 啟動腳本 -- **scripts/run-jupyter.sh** - Jupyter 啟動腳本 - -#### 📚 子專案 README -- **05.Flask/README.md** - Flask 專案說明 -- **06.Line-bot-fly-flask/README.md** - LINE Bot 專案說明(更新) - ---- - -### 2. 更新檔案 - -#### 📝 README.md (主要更新) - -**新增內容**: -- 📖 目錄區塊,連結到新文檔 -- 🚀 uv 快速開始章節 - - uv 安裝指令(Windows/macOS/Linux) - - 一鍵啟動腳本使用說明 - - uv 執行專案的三種方式 - - uv 常用指令參考 -- 🎯 傳統方法重新組織(3選1) - - venv 方法 - - pipenv 方法 - - 直接使用系統 Python(標註不推薦) -- 🌟 為什麼推薦 uv 章節 - - 6大優勢說明 - - 速度對比範例 -- 📚 更多資源連結 -- 💬 問題反饋方式 - -**改進內容**: -- 統一程式碼區塊語法(加入 bash 標記) -- 修正 git clone URL -- 改善章節結構與排版 -- 加入 emoji 提升可讀性 - ---- - -## 🚀 新功能特色 - -### 一鍵啟動腳本 - -使用者現在可以用簡單的指令啟動任何專案: - -```powershell -# Windows -.\scripts\run-flask.ps1 -.\scripts\run-jupyter.ps1 -Path "11.AI" - -# Linux/macOS -./scripts/run-flask.sh -./scripts/run-jupyter.sh "11.AI" -``` - -### 自動環境管理 - -uv 提供的優勢: -- ⚡ 比 pip 快 10-100 倍 -- 🎯 自動依賴解析 -- 🔄 跨平台一致性 -- 📦 無需預裝 Python -- 🛠️ 零配置即可使用 - -### 完整學習路徑 - -提供三種學習路徑: -1. **12週完整課程**(適合初學者) -2. **6週快速上手**(適合有基礎者) -3. **專題導向學習**(依興趣選擇) - ---- - -## 📊 文檔結構改進 - -### 之前 -``` -README.md(包含所有內容,篇幅過長) -各子專案無 README -``` - -### 之後 -``` -README.md(主要入口,精簡明瞭) -├── QUICKSTART.md(快速啟動) -├── LEARNING_PATH.md(學習路徑) -├── scripts/ -│ ├── README.md(腳本說明) -│ ├── setup-uv.ps1 -│ ├── run-flask.ps1 -│ ├── run-jupyter.ps1 -│ ├── run-flask.sh -│ └── run-jupyter.sh -├── 05.Flask/ -│ └── README.md -└── 06.Line-bot-fly-flask/ - └── README.md -``` - ---- - -## 💡 使用建議 - -### 新使用者 -1. 閱讀 [QUICKSTART.md](QUICKSTART.md) 快速開始 -2. 參考 [LEARNING_PATH.md](LEARNING_PATH.md) 規劃學習 -3. 使用啟動腳本快速執行範例 - -### 現有使用者 -- 可以繼續使用 venv 或 pipenv -- 建議嘗試 uv 以體驗更快的速度 -- 使用腳本簡化常用操作 - -### 教師/講師 -- 使用 LEARNING_PATH.md 作為課程大綱 -- 推薦學生使用啟動腳本減少環境問題 -- 可依據不同課程長度選擇對應的學習路徑 - ---- - -## 🔄 向後相容性 - -✅ **完全向後相容** - -- 保留所有原有的安裝方式 -- 現有的 requirements.txt 和 Pipfile 仍然有效 -- 不影響已經建立的虛擬環境 -- 所有原有的程式碼無需修改 - ---- - -## 📈 預期效益 - -1. **降低學習門檻** - - 新手可以更快開始學習 - - 減少環境設定問題 - - 一鍵啟動提升體驗 - -2. **提升開發效率** - - 套件安裝速度大幅提升 - - 自動化腳本節省時間 - - 統一的開發流程 - -3. **改善文檔品質** - - 結構更清晰 - - 內容更豐富 - - 易於維護更新 - -4. **增強可訪問性** - - 多種學習路徑選擇 - - 跨平台支援 - - 完整的使用範例 - ---- - -## 🎓 建議接下來的步驟 - -### 使用者 -1. 安裝 uv:`.\scripts\setup-uv.ps1` (Windows) -2. 測試啟動腳本 -3. 選擇適合的學習路徑開始學習 - -### 維護者 -1. 測試所有腳本在不同平台的執行 -2. 收集使用者回饋 -3. 根據需求持續改進文檔 - ---- - -## 📝 版本資訊 - -- **版本**: 2.0 -- **主要改進**: uv 整合、文檔重構 -- **相容性**: Python 3.8+ -- **測試平台**: Windows 11, macOS, Ubuntu - ---- - -## 🙏 致謝 - -感謝所有對專案提出建議和貢獻的開發者! - ---- - -## 📞 聯繫方式 - -如有任何問題或建議: -- 開啟 [Issue](https://github.com/willismax/MediaSystem-Python-Course/issues) -- 提交 [Pull Request](https://github.com/willismax/MediaSystem-Python-Course/pulls) diff --git a/docs/HACKMD_WEEKLY_GUIDE.md b/docs/HACKMD_WEEKLY_GUIDE.md deleted file mode 100644 index 8dddee8..0000000 --- a/docs/HACKMD_WEEKLY_GUIDE.md +++ /dev/null @@ -1,341 +0,0 @@ -# 多媒體系統:HackMD 每週教學講義(Python、API 與雲端應用) - -> 本頁是 [HackMD 課程首頁](https://hackmd.io/@wiimax/SJemnYy8fg) 的**可版本控制母稿**,適用於進修部一年級。教師可將本頁貼入 HackMD,保留當週公告與互動區;程式、Notebook 與作業規格則以 GitHub 為準,避免兩邊各自修改。 - -## 這份講義怎麼用 - -### 學生每週固定流程 - -1. **課前 20–30 分鐘**:讀「先備任務」,完成環境或概念檢查。 -2. **課中 150 分鐘**:概念短講 → 教師示範 → 引導實作 → 挑戰題。 -3. **下課前 10 分鐘**:提交 exit ticket;寫下今天會做的事與仍不懂的事。 -4. **課後 60–90 分鐘**:完成最小作業,將程式、結果與反思放在同一份 Notebook 或 repository。 - -遇到連結、套件或 API 失效時,先到 [Issues](https://github.com/willismax/MediaSystem-Python-Course/issues) 搜尋;回報時附上作業系統、Python 版本、完整錯誤訊息與重現步驟,**不要附 API key**。 - -### 教師維護分工 - -| 內容 | 唯一來源 | HackMD 怎麼呈現 | -|---|---|---| -| 臨時公告、上課日期、分組、課堂問答 | HackMD | 直接更新 | -| 教學流程、評量與每週索引 | 本文件 | 學期初同步,異動回寫 GitHub | -| Notebook、範例程式、作業模板 | GitHub 各模組 | 使用固定連結,不複製程式碼 | -| 當學期穩定版 | Git tag/Release | HackMD 註明 tag 與檢查日期 | - -同步後請在 HackMD 頂端註明:`教材版本:|最後檢查:YYYY-MM-DD`。相對連結適合在 GitHub 閱讀;貼到 HackMD 時,請改用 `https://github.com/willismax/MediaSystem-Python-Course/blob//...`。 - -## 課程成果與評量 - -完成課程後,學生應能: - -- 讀懂 Python 程式與錯誤訊息,將問題拆成函式並處理例外。 -- 說明 URL、HTTP request/response、JSON、API 與 Web service 的關係。 -- 合法取得資料,清理後以互動介面或 Web API 呈現。 -- 使用環境變數保護密鑰,為核心邏輯撰寫測試並留下執行文件。 -- 以 GitHub repository 交付可重現專題,說明資料來源、限制、分工與改善方向。 - -| 評量項目 | 比例 | 可觀察證據 | -|---|---:|---| -| 每週實作與 exit ticket | 25% | 可執行 Notebook、截圖/輸出、短反思 | -| 階段檢核 | 20% | Python、HTTP/API、Flask 三次小檢核 | -| 期中資料應用 | 20% | API 資料取得、清理、視覺化及來源說明 | -| 期末分組專題 | 30% | 程式、README、測試、展示、個人貢獻 | -| 課堂參與與同儕回饋 | 5% | code review、除錯紀錄、展示回饋 | - -## 開課前:環境與診斷 - -### 必備工具 - -- Git、GitHub 帳號,以及可執行 Python 3.10 以上的環境。 -- 本機建議安裝 `uv`;無法安裝者可使用 Google Colab。 -- 先完成 [快速開始](QUICKSTART.md),再 clone 教材: - -```bash -git clone https://github.com/willismax/MediaSystem-Python-Course.git -cd MediaSystem-Python-Course -git status -``` - -### 10 分鐘程度診斷(不計分) - -請不用 AI,寫出一段程式:接收一組分數、排除非數字資料、計算平均並輸出及格人數。依結果分流: - -- **A 基礎補強**:不熟悉 list、迴圈或函式,先做 `01.Intro-Python` 基礎 Notebook。 -- **B 標準路徑**:可完成但缺少錯誤處理,依每週必做活動前進。 -- **C 延伸挑戰**:能拆函式並測試,優先做挑戰題、協助 code review,不代替同學完成作業。 - ---- - -## 第 1 週|課程導覽、開發環境與可重現成果 - -**本週問題:** 為什麼「在我的電腦可以跑」還不算完成? - -- **學習目標**:辨識 terminal、Python、Notebook 與 repository;能 clone、啟動 Notebook、執行 cell 並解讀第一層錯誤。 -- **課前任務**:登入 GitHub;閱讀 [repository 首頁](../README.md) 與 [快速開始](QUICKSTART.md)。 -- **課堂節奏**:20 分課程地圖與評量;30 分環境示範;50 分 clone/啟動;35 分修改並重跑 Notebook;15 分 pair debugging。 -- **引導實作**:從 [`01.Intro-Python`](../01.Intro-Python/README.md) 選一份入門 Notebook,新增 Markdown 自我介紹、執行三個 cell,故意製造一次 `NameError` 後記錄修正方式。 -- **檢核點**:能指出目前路徑、Python 版本、輸入與輸出;錯誤截圖必須包含訊息而非只有「不能跑」。 -- **課後產出**:一頁環境紀錄(裝置、OS、Python 版本、啟動指令、成功畫面、遇到的問題)。 -- **Exit ticket**:`git clone` 與下載 ZIP 有何差異? - -## 第 2 週|Python 資料型態、容器與媒體 metadata - -**本週問題:** 程式如何表示一筆真實世界資料? - -- **學習目標**:使用字串、數值、布林、list、dict;以索引與 key 取得值;分辨型態轉換和資料遺失。 -- **課前任務**:複習變數及 `type()`;準備一張自行拍攝或可合法使用的圖片。 -- **課堂節奏**:25 分型態短講;35 分容器 live coding;55 分 metadata 實作;25 分錯誤分析;10 分互評。 -- **引導實作**:完成 [`media/image`](../media/image/README.md) 的基礎活動,把檔名、寬、高、模式與格式整理成 dict,再產生一句人能閱讀的摘要。 -- **常見迷思**:`"1920"` 不是 `1920`;解析度不是檔案大小;dict key 不存在時會出現 `KeyError`。 -- **分層挑戰**:A 完成單張;B 比較三種格式;C 寫函式批次整理並對缺值提供預設值。 -- **課後產出**:媒體規格比較表與 150 字觀察。 -- **Exit ticket**:何時應使用 list,何時應使用 dict? - -## 第 3 週|條件、迴圈、函式與除錯 - -**本週問題:** 如何讓重複操作變成可測試、可重用的步驟? - -- **學習目標**:用條件處理不同輸入;用迴圈處理集合;以參數、回傳值拆分函式;讀 traceback 最後一行。 -- **課前任務**:完成第 2 週資料三筆,標記其中一筆為無效輸入。 -- **課堂節奏**:30 分控制流程;30 分函式;30 分 traceback 導讀;50 分重構;10 分同儕檢查。 -- **引導實作**:將「檢查寬高 → 計算像素數 → 分類尺寸 → 產生摘要」拆成至少兩個函式;測試正常值、邊界值、錯誤值。 -- **檢核點**:函式不依賴未說明的全域變數;錯誤訊息對使用者有意義;不使用空白的 `except`。 -- **課後產出**:函式版程式、三組輸入輸出、一次除錯紀錄。 -- **Exit ticket**:`print()` 與 `return` 的用途有何不同? - -## 第 4 週|網路、URL 與 HTTP request/response - -**本週問題:** 瀏覽器輸入網址後,資料如何回來? - -- **學習目標**:拆解 URL;區分 client/server;說明 method、status code、header、body;辨認 2xx、4xx、5xx。 -- **課前任務**:閱讀 [`03.Request`](../03.Request/README.md);從瀏覽器開發者工具找一筆 request。 -- **課堂節奏**:35 分概念與圖解;25 分開發者工具;45 分 Requests 示範;30 分狀態碼實驗;15 分概念圖。 -- **引導實作**:用 `requests.get()` 取得公開端點,印出 URL、status、content-type、前 200 字內容,加入 timeout 與失敗分支。 -- **安全提醒**:遵守網站條款與 robots 規範;不繞過登入、付費牆或存取控制;設定合理頻率。 -- **課後產出**:一張 request/response 流程圖,加上成功與失敗各一次的觀察。 -- **Exit ticket**:收到 404 是否代表「沒有網路」?為什麼? - -## 第 5 週|JSON、API 參數與開放資料 - -**本週問題:** API 回傳的巢狀資料,如何變成需要的欄位? - -- **學習目標**:讀取 JSON object/array;使用 query parameters;查 API 文件;記錄資料來源與更新時間。 -- **課前任務**:選一個免 key 的政府開放資料集,寫下端點、欄位與授權。 -- **課堂節奏**:25 分 JSON 對照 Python;30 分文件閱讀;60 分 [`擷取API資料.ipynb`](../03.Request/擷取API資料.ipynb);25 分欄位字典;10 分互查。 -- **引導實作**:提出一個可由資料回答的問題,只保留必要欄位,輸出前五筆並解釋每欄單位。 -- **常見迷思**:API 有回應不等於資料正確;空陣列可能是合法結果;畫面顯示日期不一定是資料更新日期。 -- **課後產出**:原始資料樣本、欄位字典、來源/授權、研究問題。 -- **Exit ticket**:JSON 的 `{}` 與 `[]` 分別對應哪種 Python 容器? - -## 第 6 週|可靠的 API 程式:分頁、timeout 與例外 - -**本週問題:** 網路慢、資料缺漏或服務拒絕時,程式應怎麼做? - -- **學習目標**:處理 timeout、非 2xx、JSON 解析失敗與空資料;理解分頁、速率限制、重試及快取。 -- **課前任務**:為第 5 週程式列出至少四種失敗情境。 -- **課堂節奏**:30 分 failure taxonomy;35 分防禦式程式;55 分故障注入;20 分 pair review;10 分整理。 -- **引導實作**:替 API 函式加入 `timeout`、`raise_for_status()`、明確例外訊息及本機範例資料 fallback;不可無限重試。 -- **分層挑戰**:A 顯示友善錯誤;B 完成分頁;C 加入有限次 exponential backoff 並記錄 log。 -- **課後產出**:成功、無資料、錯誤狀態、timeout 四種測試紀錄。 -- **Exit ticket**:為什麼重試不一定能修好 401? - -## 第 7 週|資料清理、Pandas 與視覺化敘事 - -**本週問題:** 如何避免用一張「好看的圖」說出錯誤結論? - -- **學習目標**:建立 DataFrame;處理缺值、重複、型態與單位;選擇合適圖表;寫出有限度的結論。 -- **課前任務**:閱讀 [`01.Intro-Python`](../01.Intro-Python/README.md) 中 Pandas 與視覺化教材。 -- **課堂節奏**:30 分整潔資料;35 分清理示範;55 分個人資料集實作;20 分圖表診所;10 分回饋。 -- **引導實作**:保留清理前後筆數,產生一張有標題、單位、資料來源的圖,並用三句話說明發現、證據、限制。 -- **檢核點**:座標軸不誤導;類別與連續資料選圖合理;不把相關說成因果。 -- **課後產出**:期中作品草稿:研究問題、清理步驟、圖表、初步結論與限制。 -- **Exit ticket**:刪除所有缺值可能造成什麼偏差? - -## 第 8 週|期中資料應用發表與同儕審查 - -**本週問題:** 別人能否依我的文件重現相同結果? - -- **學習目標**:以短講清楚呈現問題、資料、方法、發現與限制;依 rubric 提供具體回饋。 -- **課前任務**:清除 Notebook 多餘輸出,從頭 Run All;確認沒有 token、個資或不明授權素材。 -- **課堂節奏**:20 分示範與規準;90 分每組 5 分鐘展示+3 分鐘問答;25 分交叉重現;15 分修正計畫。 -- **繳交內容**:Notebook、必要的小型資料樣本或下載方法、README、資料授權、三種以上測試輸入。 -- **同儕回饋句型**:「我能重現……」「我在……卡住」「證據支持……」「若加入……會更清楚」。 -- **課後產出**:依兩項同儕意見修訂,附修改前後摘要。 -- **Exit ticket**:你採納與不採納哪一項建議?理由是什麼? - -## 第 9 週|Gradio:把資料流程做成互動原型 - -**本週問題:** 如何讓不會寫程式的人也能操作成果? - -- **學習目標**:分離核心函式與 UI;選擇輸入/輸出元件;驗證空值、範圍與格式;理解分享連結限制。 -- **課前任務**:閱讀 [`02.Gradio`](../02.Gradio/README.md),把期中核心流程整理成單一函式。 -- **課堂節奏**:20 分互動流程;35 分元件示範;60 分原型;25 分可用性測試;10 分修正。 -- **引導實作**:建立最少一個輸入、一個輸出與一段使用說明;錯誤不能只顯示 traceback。 -- **分層挑戰**:A 包裝文字函式;B 串接第 6 週 API;C 加入範例、狀態提示與快取。 -- **課後產出**:可執行 Gradio 程式、三位同學的任務測試、改善清單。 -- **Exit ticket**:為什麼 UI 函式不應塞入所有資料處理細節? - -## 第 10 週|Flask 與 Web 應用基本結構 - -**本週問題:** Gradio 原型與一般 Web service 有什麼不同? - -- **學習目標**:理解 application、route、request、response、template;啟動 Flask 並新增頁面。 -- **課前任務**:閱讀 [`05.Flask`](../05.Flask/README.md);完成依賴安裝。 -- **課堂節奏**:30 分 Web framework;35 分 `flask01` 導讀;55 分新增 route;20 分兩人互測;10 分回顧。 -- **引導實作**:啟動 `flask01`,加入 `/about` 與動態參數頁;以瀏覽器和 `curl` 各測一次。 -- **檢核點**:不要使用 production 模式公開 debug server;route 名稱與回應內容清楚;啟動指令寫入 README。 -- **課後產出**:小型網站、路由表、成功與 404 測試。 -- **Exit ticket**:route、URL 與 Python 函式如何連在一起? - -## 第 11 週|REST API、CRUD 與輸入驗證 - -**本週問題:** 怎樣的 API 讓使用者能預測它的行為? - -- **學習目標**:用 resource 思考 endpoint;配對 GET/POST/PATCH/DELETE;使用狀態碼;驗證 request body。 -- **課前任務**:閱讀 [`flask06-api`](../05.Flask/flask06-api/) 程式,畫出現有 endpoint。 -- **課堂節奏**:30 分 REST/CRUD;30 分 API 導讀;60 分新增功能;20 分交換測試;10 分文件。 -- **引導實作**:完成一個 resource 的 list、create、detail;對缺欄位、錯型態、找不到資料回傳一致 JSON 與適當狀態碼。 -- **安全提醒**:不要信任前端輸入;回應不得洩漏 stack trace、secret 或其他使用者資料。 -- **課後產出**:endpoint 表(method、path、輸入、成功/失敗回應)與 curl 測試。 -- **Exit ticket**:新增成功為何通常不是回傳 200 就結束? - -## 第 12 週|SQLite、schema 與資料持久化 - -**本週問題:** 程式關閉後,資料如何仍保持一致? - -- **學習目標**:理解 table、row、column、primary key;執行參數化 CRUD;設計最小 schema。 -- **課前任務**:閱讀 [`10.sql`](../10.sql/README.md),列出專題可能保存的三種資料。 -- **課堂節奏**:30 分關聯資料概念;30 分 SQLite 示範;60 分 CRUD;20 分 schema review;10 分備份討論。 -- **引導實作**:完成 [`SQLite資料庫CRUD.ipynb`](../10.sql/SQLite資料庫CRUD.ipynb) 核心活動,再把第 11 週記憶體資料替換為 SQLite。 -- **檢核點**:使用參數化 query,不以字串拼接使用者輸入;測試重複 key 與不存在資料。 -- **課後產出**:schema 圖、建表語句、CRUD 範例與資料庫重建方式。 -- **Exit ticket**:primary key 解決了什麼問題? - -## 第 13 週|pytest、自動測試與可維護程式 - -**本週問題:** 修改功能時,怎麼知道沒有弄壞舊功能? - -- **學習目標**:使用 arrange-act-assert;撰寫正常、邊界、錯誤案例;區分 unit 與 API test。 -- **課前任務**:閱讀 [`07.Pytest-DEMO`](../07.Pytest-DEMO/README.md),執行既有測試。 -- **課堂節奏**:25 分測試觀念;30 分 demo 導讀;60 分專題測試;25 分刻意製造 regression;10 分回顧。 -- **引導實作**:為第 11 或 12 週功能寫至少三個測試;先看測試失敗,再修到通過。 -- **常見迷思**:測試通過不代表沒有 bug;coverage 高不等於測試有意義;不要依賴測試執行順序。 -- **課後產出**:測試檔、執行指令、失敗到成功的紀錄。 -- **Exit ticket**:哪一個邊界案例最可能被你漏掉? - -## 第 14 週|第三方 API、密鑰、隱私與 AI - -**本週問題:** 能呼叫外部服務,是否就適合把資料傳出去? - -- **學習目標**:以環境變數管理 secret;判斷資料傳送範圍、費用與服務限制;提供無 key fallback。 -- **課前任務**:閱讀 [`11.AI`](../11.AI/README.md) 或 [`06.Line-bot-fly-flask`](../06.Line-bot-fly-flask/README.md),不必先申請付費服務。 -- **課堂節奏**:30 分 threat model;30 分環境變數;45 分受控串接;30 分隱私情境;15 分揭露聲明。 -- **引導實作**:使用 `.env`/系統環境變數(不 commit)讀取測試 key;在 README 提供 `.example` 欄位與本機替代方案。 -- **安全檢核**:搜尋程式、Notebook 輸出與 Git history;若曾洩漏 key,立即撤銷並重發,刪除檔案並不足夠。 -- **課後產出**:資料流圖、風險表、AI/第三方服務揭露聲明。 -- **Exit ticket**:為什麼把 key 寫在前端或 Notebook 隱藏 cell 仍不安全? - -## 第 15 週|部署、環境設定與可觀測性 - -**本週問題:** 本機程式搬到雲端後,哪些假設會失效? - -- **學習目標**:區分 code/config/data;理解 port、dependency、log、health check;留下可重現部署紀錄。 -- **課前任務**:整理啟動指令、依賴及環境變數;選擇免費平台或本機部署展示。 -- **課堂節奏**:30 分部署模型;30 分設定檢查;55 分部署/本機等價演練;25 分 log 除錯;10 分復盤。 -- **引導實作**:讓應用從環境讀取 port/secret;加入 `/health`;以新環境依 README 重建。平台政策變動時不以付費部署作為評分門檻。 -- **檢核點**:log 不含 token/個資;錯誤能定位但不向外洩漏內部細節;服務無法公開時提供錄影與重現步驟。 -- **課後產出**:部署 URL 或本機重現紀錄、health check、一次 log 除錯案例。 -- **Exit ticket**:health check 正常能保證所有功能正常嗎? - -## 第 16 週|期末專題 Sprint:需求、架構與最小可行成果 - -**本週問題:** 在有限兩週內,最小但完整的成果是什麼? - -- **學習目標**:定義使用者與問題;縮小範圍;分離 must/should/could;建立 issue 與分工。 -- **課前任務**:每組準備一頁提案:使用者、痛點、資料/API、輸入輸出、最大風險。 -- **課堂節奏**:25 分優劣案例;35 分提案 pitch;35 分架構與資料流;40 分第一個 vertical slice;15 分站會。 -- **最低規格**:一條端到端可操作流程、一個外部資料或媒體來源、輸入驗證、至少三個測試、README、來源/授權與限制。 -- **不接受**:只有投影片、完全照抄 tutorial、以付費功能掩蓋無法重現、commit 中含 secret、無法說明組員貢獻。 -- **課後產出**:proposal、看板、架構圖、第一個可執行版本。 -- **Exit ticket**:本週刪掉哪項功能,讓核心價值更可能完成? - -## 第 17 週|整合測試、可用性與發布前檢查 - -**本週問題:** 真實使用者會用什麼方式弄壞我們的作品? - -- **學習目標**:設計端到端情境;進行可用性測試;檢查授權、個資、secret、錯誤與文件。 -- **課前任務**:功能凍結;完成 [`media/ethics`](../media/ethics/README.md) 發布前檢查。 -- **課堂節奏**:20 分測試說明;50 分跨組黑箱測試;35 分修復 blocker;30 分 README 重現;15 分展示彩排。 -- **測試情境**:首次使用者、空輸入、超長或錯型態輸入、API 離線、無資料、重複操作、全新環境。 -- **Definition of Done**:核心流程可用;測試通過;安裝與啟動清楚;授權與限制揭露;demo 失敗時有備案。 -- **課後產出**:測試報告、修正清單、release candidate、3–5 分鐘展示腳本。 -- **Exit ticket**:目前最大殘餘風險及因應方式是什麼? - -## 第 18 週|期末成果發表、個人反思與課程收束 - -**本週問題:** 如何用證據說明作品解決了問題,而非只列出技術? - -- **學習目標**:展示問題到成果的完整故事;回答技術取捨;提供尊重且具體的回饋;辨識下一步學習方向。 -- **課前任務**:建立 release/tag;以全新環境最後重現;備妥離線影片或樣本資料。 -- **課堂節奏**:15 分規則;105 分每組 7 分鐘展示+5 分鐘問答;20 分同儕投票與回饋;10 分個人反思。 -- **展示順序**:使用者問題 → 操作成果 → 資料流/架構 → 測試證據 → 限制與倫理 → 下一步;不要逐頁朗讀套件介紹。 -- **最終繳交**:release 連結、README、程式與測試、資料/素材授權、展示影片(若有)、分工紀錄、每人 300 字反思。 -- **Exit ticket**:如果再多一週,你會優先改善哪個經測試證實的問題? - ---- - -## 期末專題評分規準 - -| 面向 | 優良 | 達標 | 待改進 | 比例 | -|---|---|---|---|---:| -| 問題與使用者 | 需求有證據,範圍清楚且成果回應需求 | 能說明目標使用者與基本情境 | 只有技術名稱,無具體使用情境 | 20% | -| 技術整合 | 資料流清楚,合理整合 API/資料/介面 | 核心流程可執行,能解釋主要程式 | 大量照抄或無法解釋、核心不通 | 25% | -| 可靠性與測試 | 正常、邊界、失敗情境皆有證據與處理 | 有基本驗證與三個有效測試 | 只展示成功路徑或無測試 | 25% | -| 文件、安全與授權 | 新環境可重現,secret/隱私/來源處理完整 | README 可啟動,未洩漏 secret,列出來源 | 文件缺漏、來源不明或含敏感資料 | 15% | -| 展示、分工與反思 | 展示聚焦取捨,各成員貢獻可追溯 | 能完成展示並說明分工 | 只有少數成員理解或無貢獻紀錄 | 15% | - -## 每週作業共用繳交模板 - -```markdown -# 第 N 週:題目 - -## 我想回答的問題 - -## 環境與啟動方式 -- Python 版本: -- 安裝/啟動指令: - -## 實作結果 -- 正常案例: -- 邊界或失敗案例: - -## 資料/素材來源與授權 - -## 我遇到的問題與解法 - -## 本週反思 -- 我現在能獨立完成: -- 我仍需要協助: -- 我下一步會嘗試: -``` - -## 助教快速檢核表 - -- [ ] 從頭執行可完成,或已說明外部服務限制與替代方案。 -- [ ] 有自己的問題、輸入與解釋,不只是保留範例輸出。 -- [ ] 正常與至少一個失敗/邊界案例可觀察。 -- [ ] 啟動方式、依賴、資料來源與授權清楚。 -- [ ] Notebook、commit、截圖及 log 沒有 API key、token 或個資。 -- [ ] 使用生成式 AI 時,已揭露用途並能口頭解釋及修改產出。 - -## 延伸與分流索引 - -完成核心 18 週後,可依專題需求選擇: - -- **瀏覽器自動化**:[`04.Playwright`](../04.Playwright/README.md)(優先)或 [`04.Selenium`](../04.Selenium/README.md),只擷取允許存取的內容。 -- **電腦視覺**:[`08.OpenCV-Mediapipe-DEMO`](../08.OpenCV-Mediapipe-DEMO/readme.md),先確認攝影機、裝置效能與肖像同意。 -- **媒體概念**:[`media/image`](../media/image/README.md)、[`media/audio`](../media/audio/README.md)、[`media/video`](../media/video/README.md)。 -- **實用作品**:[`09.Apps`](../09.Apps/README.md);將範例改成有明確使用者與測試的作品。 -- **AI 應用**:[`11.AI`](../11.AI/README.md);不得把個資或未授權內容直接傳給第三方服務。 - -日間部「媒體素養與實作」不應直接套用本週次表,請改走 [日間部課程地圖](../courses/day/README.md);兩班共用原則見 [雙軌課程架構](../courses/README.md)。 diff --git a/docs/README.md b/docs/README.md index f00a35a..d8cdfed 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,99 +1,32 @@ -# 📚 MediaSystem Python Course 文檔中心 - -歡迎來到文檔中心!這裡提供完整的學習指南與專案說明。 - -## 📖 文檔索引 - -| 文檔 | 說明 | 適合對象 | -|------|------|----------| -| [🧭 雙軌課程架構](../courses/README.md) | 多媒體系統日間部/進修部入口、共用教材與維護策略 | 教師、助教、兩班學生 | -| [☀️ 日間部課程地圖](../courses/day/README.md) | 影像、音訊、視訊與互動媒體路徑 | 日間部四技一年級 | -| [🌙 進修部課程地圖](../courses/evening/README.md) | Python、API 與雲端應用路徑 | 進修部一年級 | -| [🗓️ HackMD 每週教學講義](HACKMD_WEEKLY_GUIDE.md) | 18 週課前、課中、課後活動、檢核與專題 rubric | 教師、助教、進修部學生 | -| [🚀 快速開始](QUICKSTART.md) | 各專案快速啟動指令 | 所有使用者 | -| [📚 學習路徑](LEARNING_PATH.md) | 完整課程規劃與建議 | 初學者、課程學習者 | -| [📝 更新日誌](CHANGELOG.md) | 專案更新記錄 | 開發者、維護者 | - ---- - -## 🗂️ 課程目錄結構 - -### 第一部分:Python 基礎 -| 編號 | 專案 | 說明 | -|------|------|------| -| 01 | [Intro-Python](../01.Intro-Python/) | Python 基礎語法、Pandas、資料視覺化 | -| 02 | [Gradio](../02.Gradio/) | 快速建立 GUI 介面 | - -### 第二部分:網頁爬蟲與資料擷取 -| 編號 | 專案 | 說明 | -|------|------|------| -| 03 | [Request](../03.Request/) | HTTP 請求、API 存取、Open Data | -| 04a | [Selenium](../04.Selenium/) | 動態網頁爬蟲(需 WebDriver) | -| 04b | [Playwright](../04.Playwright/) | 新一代網頁自動化工具 | - -### 第三部分:Web 開發 -| 編號 | 專案 | 說明 | -|------|------|------| -| 05 | [Flask](../05.Flask/) | Web 框架基礎、RESTful API | -| 06 | [LINE-Bot](../06.Line-bot-fly-flask/) | LINE Bot 開發與雲端部署 | - -### 第四部分:軟體工程 -| 編號 | 專案 | 說明 | -|------|------|------| -| 07 | [Pytest-DEMO](../07.Pytest-DEMO/) | 單元測試與測試覆蓋率 | - -### 第五部分:電腦視覺與多媒體 -| 編號 | 專案 | 說明 | -|------|------|------| -| 08 | [OpenCV-Mediapipe](../08.OpenCV-Mediapipe-DEMO/) | 電腦視覺、手勢追蹤、姿態估計 | - -### 第六部分:實用工具與資料庫 -| 編號 | 專案 | 說明 | -|------|------|------| -| 09 | [Apps](../09.Apps/) | QR Code 產生器等實用工具 | -| 10 | [SQL](../10.sql/) | SQLite 資料庫 CRUD 操作 | - -### 第七部分:AI 與機器學習 -| 編號 | 專案 | 說明 | -|------|------|------| -| 11 | [AI](../11.AI/) | Gemini API、OpenAI 應用 | - ---- - -## 🛠️ 輔助資源 - -| 資源 | 說明 | -|------|------| -| [scripts/](../scripts/) | 自動化啟動腳本(uv、Flask、Jupyter) | -| [.github/workflows/](../.github/workflows/) | CI/CD 設定 | - ---- - -## ⚠️ 關於路徑編號 - -您可能注意到 `04.Selenium` 和 `04.Playwright` 都是 04 編號。這是因為: - -1. **歷史原因**:Selenium 是較早的爬蟲工具,Playwright 是後來新增的替代方案 -2. **保持相容性**:為避免舊文章連結失效,保留原有路徑 -3. **實際使用**:兩者功能相近,可依需求二選一學習 - -建議學習順序: -- 基礎需求 → `04.Selenium` -- 現代化需求 → `04.Playwright`(推薦) - ---- - -## 🔗 快速連結 - -- [返回首頁](../README.md) -- [GitHub Repo](https://github.com/willismax/MediaSystem-Python-Course) -- [提出問題](https://github.com/willismax/MediaSystem-Python-Course/issues) -- [貢獻指南](https://w3c.hexschool.com/git/cc7d70b7) - ---- - -## 📅 維護資訊 - -- **最後更新**:2025年11月27日 -- **維護者**:willismax -- **授權**:請參閱 [LICENSE](../LICENSE) +# 學習文件索引 + +這裡整理學生使用的啟動說明、V2 教材包與延伸資源。 + +## 主要文件 + +| 文件 | 內容 | +|---|---| +| [快速開始](QUICKSTART.md) | 各專案的安裝與啟動方式 | +| [多媒體系統 V2 學生教材包](../course-115-v2/README.md) | 整合教科書、講義、實驗與作業模板 | +| [單冊整合教科書](../course-115-v2/textbook/MULTIMEDIA_SYSTEMS_V2.md) | 影像、聲音、短影音與系統驗證 | +| [現行課程主題](../course-115-v2/CURRENT_COURSE_TOPICS.md) | 四個主題模組與 W01~W18 實施順序 | +| [指定用書整合](../course-115-v2/TEXTBOOK_INTEGRATION_MAP.md) | 指定用書與 repo 其他教材的重排方式 | +| [延伸學習路徑](LEARNING_PATH.md) | Python、Web、資料庫與 AI 應用的原有教材路徑 | + +## 主題索引 + +| 主題 | 位置 | +|---|---| +| Python 與資料處理 | [`01.Intro-Python`](../01.Intro-Python/) | +| Gradio | [`02.Gradio`](../02.Gradio/) | +| Requests 與 API | [`03.Request`](../03.Request/) | +| Selenium/Playwright | [`04.Selenium`](../04.Selenium/)、[`04.Playwright`](../04.Playwright/) | +| Flask 與 Web API | [`05.Flask`](../05.Flask/) | +| LINE Bot | [`06.Line-bot-fly-flask`](../06.Line-bot-fly-flask/) | +| pytest | [`07.Pytest-DEMO`](../07.Pytest-DEMO/) | +| OpenCV/MediaPipe | [`08.OpenCV-Mediapipe-DEMO`](../08.OpenCV-Mediapipe-DEMO/) | +| 實用工具 | [`09.Apps`](../09.Apps/) | +| SQLite | [`10.sql`](../10.sql/) | +| AI 與 LLM | [`11.AI`](../11.AI/) | + +兩個 `04` 目錄分別保留 Selenium 與 Playwright 範例,可依使用情境擇一練習。 diff --git "a/media/audio/\346\225\270\344\275\215\351\237\263\350\250\212_\345\217\226\346\250\243\350\210\207\346\263\242\345\275\242.ipynb" "b/media/audio/\346\225\270\344\275\215\351\237\263\350\250\212_\345\217\226\346\250\243\350\210\207\346\263\242\345\275\242.ipynb" index 7b64da9..f340497 100644 --- "a/media/audio/\346\225\270\344\275\215\351\237\263\350\250\212_\345\217\226\346\250\243\350\210\207\346\263\242\345\275\242.ipynb" +++ "b/media/audio/\346\225\270\344\275\215\351\237\263\350\250\212_\345\217\226\346\250\243\350\210\207\346\263\242\345\275\242.ipynb" @@ -7,7 +7,7 @@ "source": [ "# 數位音訊:取樣、量化與波形\n", "\n", - "日間部一年級分層教材。先完成基礎必做,再選擇標準實作或進階挑戰。" + "分層學習教材。先完成基礎練習,再選擇標準實作或延伸挑戰。" ] }, { diff --git "a/media/ethics/\345\252\222\351\253\224\345\200\253\347\220\206_\347\231\274\345\270\203\345\211\215\346\252\242\346\237\245.ipynb" "b/media/ethics/\345\252\222\351\253\224\345\200\253\347\220\206_\347\231\274\345\270\203\345\211\215\346\252\242\346\237\245.ipynb" index 0099df9..7da8dfa 100644 --- "a/media/ethics/\345\252\222\351\253\224\345\200\253\347\220\206_\347\231\274\345\270\203\345\211\215\346\252\242\346\237\245.ipynb" +++ "b/media/ethics/\345\252\222\351\253\224\345\200\253\347\220\206_\347\231\274\345\270\203\345\211\215\346\252\242\346\237\245.ipynb" @@ -7,7 +7,7 @@ "source": [ "# 媒體倫理:發布前檢查與 AI 揭露\n", "\n", - "日間部一年級分層教材。先完成基礎必做,再選擇標準實作或進階挑戰。" + "分層學習教材。先完成基礎練習,再選擇標準實作或延伸挑戰。" ] }, { diff --git a/media/image/README.md b/media/image/README.md index 866b99e..57e3303 100644 --- a/media/image/README.md +++ b/media/image/README.md @@ -22,7 +22,7 @@ uv run --with pillow python image_lab.py sample.jpg ``` -沒有 `sample.jpg` 時,先使用自己拍攝、可公開使用或教師提供的素材。不要使用未取得授權的網路圖片。 +沒有 `sample.jpg` 時,先使用自己拍攝、可公開使用或課程提供的素材。不要使用未取得授權的網路圖片。 ## 實驗任務 diff --git "a/media/image/\346\225\270\344\275\215\345\275\261\345\203\217_\350\211\262\345\275\251\350\210\207\346\240\274\345\274\217.ipynb" "b/media/image/\346\225\270\344\275\215\345\275\261\345\203\217_\350\211\262\345\275\251\350\210\207\346\240\274\345\274\217.ipynb" index 0870d3c..170a7e1 100644 --- "a/media/image/\346\225\270\344\275\215\345\275\261\345\203\217_\350\211\262\345\275\251\350\210\207\346\240\274\345\274\217.ipynb" +++ "b/media/image/\346\225\270\344\275\215\345\275\261\345\203\217_\350\211\262\345\275\251\350\210\207\346\240\274\345\274\217.ipynb" @@ -7,7 +7,7 @@ "source": [ "# 數位影像:色彩、解析度、格式與 metadata\n", "\n", - "日間部一年級分層教材。先完成基礎必做,再選擇標準實作或進階挑戰。" + "分層學習教材。先完成基礎練習,再選擇標準實作或延伸挑戰。" ] }, { @@ -27,7 +27,7 @@ "source": [ "## Setup\n", "\n", - "在 Colab 執行下一格安裝 Pillow;接著上傳一張自己拍攝、教師提供或授權清楚的圖片。" + "在 Colab 執行下一格安裝 Pillow;接著上傳一張自己拍攝、課程提供或授權清楚的圖片。" ] }, { diff --git "a/media/video/\346\225\270\344\275\215\350\246\226\350\250\212_\347\225\253\346\240\274\350\210\207\345\271\200\347\216\207.ipynb" "b/media/video/\346\225\270\344\275\215\350\246\226\350\250\212_\347\225\253\346\240\274\350\210\207\345\271\200\347\216\207.ipynb" index 6202b4c..a136e7f 100644 --- "a/media/video/\346\225\270\344\275\215\350\246\226\350\250\212_\347\225\253\346\240\274\350\210\207\345\271\200\347\216\207.ipynb" +++ "b/media/video/\346\225\270\344\275\215\350\246\226\350\250\212_\347\225\253\346\240\274\350\210\207\345\271\200\347\216\207.ipynb" @@ -7,7 +7,7 @@ "source": [ "# 數位視訊:畫格、幀率、容器與 codec\n", "\n", - "日間部一年級分層教材。先完成基礎必做,再選擇標準實作或進階挑戰。" + "分層學習教材。先完成基礎練習,再選擇標準實作或延伸挑戰。" ] }, {