Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions courses/day/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,11 @@

## 開課前待補教材

- `media/image`:色彩、解析度、格式、壓縮與 metadata 的小型實驗。
- `media/audio`:取樣、量化、波形與常見格式比較。
- `media/video`:frame、fps、container/codec 與基本剪輯/轉碼。
- `media/ethics`:著作權、Creative Commons、個資、肖像與生成式媒體標示。
以下教材已採用 Colab 友善的 `.ipynb` 格式;每份依序提供目標、環境設定、分格實作、檢查與延伸挑戰。學生先完成基礎必做,再視能力進行標準實作或進階挑戰。

這些模組完成前,可先將概念放在 HackMD、實作沿用現有 OpenCV/Apps;完成後再由本頁連入,避免一次搬動舊教材。
- [`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` 可直接對應主要週次;音訊與視訊作為導論或專題延伸活動,避免分散核心進度。
46 changes: 46 additions & 0 deletions media/audio/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# 數位音訊:取樣、量化與波形

## 學習目標

- 說明取樣率、位元深度、聲道與資料量的意義。
- 用波形辨識振幅、時間與失真風險。
- 比較 WAV 與常見壓縮音訊格式的使用情境。

## 核心概念

未壓縮 PCM WAV 的粗略資料量:

`秒數 × 取樣率 × 位元深度 ÷ 8 × 聲道數`

例如 10 秒、44.1 kHz、16-bit、雙聲道約為 1.76 MB。MP3/AAC 通常較小,但屬有損壓縮;WAV 適合編輯與保存中間版本。

## 小實驗

```bash
uv run --with matplotlib python audio_lab.py sample.wav
```

程式會讀取 WAV 標頭、計算時長與未壓縮估計值,並輸出波形圖。建議使用 5–15 秒、授權清楚的短音檔。

## 任務

### 基礎必做

1. 執行程式並打開波形圖。
2. 在波形中圈出一段音量較大與一段較小的位置。

### 標準實作

1. 比較兩個 WAV:取樣率、聲道、位元深度與檔案大小。
2. 找出一段音量明顯變化的位置,從波形說明原因。
3. 針對「語音備忘錄、音樂母帶、網頁背景音」各選擇一種合適格式並說明理由。

### 進階挑戰

將左右聲道各畫一張波形圖,並比較單聲道與雙聲道素材的差異。

## 繳交問題

- 取樣率提高會影響什麼?它不保證改善什麼?
- 單聲道與雙聲道各適合哪些情境?
- 何時應保留未壓縮版本?
124 changes: 124 additions & 0 deletions media/audio/數位音訊_取樣與波形.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "a29239e2",
"metadata": {},
"source": [
"# 數位音訊:取樣、量化與波形\n",
"\n",
"日間部一年級分層教材。先完成基礎必做,再選擇標準實作或進階挑戰。"
]
},
{
"cell_type": "markdown",
"id": "d13feab9",
"metadata": {},
"source": [
"## Goal\n",
"\n",
"以波形把音訊的時間、振幅、取樣率與聲道變成可觀察結果。"
]
},
{
"cell_type": "markdown",
"id": "2bad87c4",
"metadata": {},
"source": [
"## Setup\n",
"\n",
"在 Colab 安裝必要套件並上傳一個 16-bit PCM WAV 短音檔。"
]
},
{
"cell_type": "markdown",
"id": "74464f2a",
"metadata": {},
"source": [
"## Steps"
]
},
{
"cell_type": "markdown",
"id": "307ae1dd",
"metadata": {},
"source": [
"### 1. 安裝與上傳\n",
"\n",
"基礎必做:上傳一個合法使用的 WAV 檔。"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "40f456d5",
"metadata": {},
"outputs": [],
"source": [
"!pip -q install numpy matplotlib\n",
"from google.colab import files\n",
"uploaded = files.upload()\n",
"source_name = next(iter(uploaded))"
]
},
{
"cell_type": "markdown",
"id": "33c43099",
"metadata": {},
"source": [
"### 2. 讀取與繪圖\n",
"\n",
"標準實作:讀取 WAV 規格,畫出第一聲道波形。"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d5941849",
"metadata": {},
"outputs": [],
"source": [
"import wave, numpy as np, matplotlib.pyplot as plt\n",
"with wave.open(source_name, 'rb') as w:\n",
" ch, width, rate, frames = w.getnchannels(), w.getsampwidth(), w.getframerate(), w.getnframes()\n",
" data = np.frombuffer(w.readframes(frames), dtype=np.int16).reshape(-1, ch)\n",
"print({'channels': ch, 'sample_rate': rate, 'bit_depth': width*8, 'seconds': frames/rate})\n",
"t = np.arange(frames)/rate\n",
"plt.plot(t, data[:,0], linewidth=.4); plt.xlabel('seconds'); plt.ylabel('amplitude'); plt.show()"
]
},
{
"cell_type": "markdown",
"id": "34c0ffbd",
"metadata": {},
"source": [
"## Checks\n",
"\n",
"能否在圖上指出音量較大與較小的片段,並解釋取樣率與聲道的意義?"
]
},
{
"cell_type": "markdown",
"id": "ebc8b898",
"metadata": {},
"source": [
"## Next Steps\n",
"\n",
"進階挑戰:分別繪出左右聲道並比較差異。"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.11"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
53 changes: 53 additions & 0 deletions media/ethics/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# 媒體倫理與發布:來源、授權、個資與生成式媒體

## 學習目標

- 在作品發布前辨識著作權、授權、肖像與個資風險。
- 能依素材來源建立可追溯的標示。
- 對使用生成式 AI 或第三方 API 的部分做透明揭露。

## 發布前檢查表

- [ ] 我有權使用每一份圖片、音訊、視訊、字型與程式碼嗎?
- [ ] 是否記錄來源、作者、網址、授權條款與修改內容?
- [ ] 素材是否含有人臉、姓名、學號、定位、車牌、通訊紀錄或其他可辨識資訊?
- [ ] 是否取得必要的同意,或已遮蔽、移除、改用替代素材?
- [ ] 是否清楚標示生成式 AI、第三方 API 及其資料可能傳送的範圍?
- [ ] 是否避免把「網路上找得到」誤認為「可任意使用」?

## Creative Commons 快速判讀

| 標示 | 一句話理解 |
|---|---|
| CC BY | 可使用與改作,但需署名。 |
| CC BY-SA | 改作後通常須以相同條款分享。 |
| CC BY-NC | 不得作商業用途。 |
| CC BY-ND | 不得散布改作版本。 |
| CC0 | 作者放棄大部分著作權利,但仍宜保留來源紀錄。 |

授權條款有細節與例外;不確定時,選擇替代素材、向權利人確認,或暫不公開。

## 專題 README 必填欄位

```text
素材名稱:
來源與作者:
授權:
本專題如何使用/修改:
人物或個資處理:
生成式 AI/第三方 API:使用目的、傳送資料類型、人工修改:
```

## 討論案例

### 基礎必做

從自己的練習素材選一項,填完「來源與作者、授權、如何使用」三欄。

### 標準實作

以小組專題為例,找出一項「可以做但需要標示」與一項「應先取得同意或改用素材」的情境,寫出處置理由。

### 進階挑戰

為期末作品建立一份發布前檢查流程,指定由誰在何時確認素材授權、個資與 AI 揭露。
121 changes: 121 additions & 0 deletions media/ethics/媒體倫理_發布前檢查.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "c8711ce1",
"metadata": {},
"source": [
"# 媒體倫理:發布前檢查與 AI 揭露\n",
"\n",
"日間部一年級分層教材。先完成基礎必做,再選擇標準實作或進階挑戰。"
]
},
{
"cell_type": "markdown",
"id": "d6fe70a8",
"metadata": {},
"source": [
"## Goal\n",
"\n",
"在發布前辨識素材授權、個資、肖像與生成式 AI 揭露需求。"
]
},
{
"cell_type": "markdown",
"id": "7f79c21c",
"metadata": {},
"source": [
"## Setup\n",
"\n",
"此單元不需要安裝套件;直接填寫下列欄位並存下自己的專題紀錄。"
]
},
{
"cell_type": "markdown",
"id": "a2b7e5a5",
"metadata": {},
"source": [
"## Steps"
]
},
{
"cell_type": "markdown",
"id": "1c93c5d5",
"metadata": {},
"source": [
"### 1. 素材紀錄\n",
"\n",
"基礎必做:完成一筆素材來源紀錄。"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d8f09846",
"metadata": {},
"outputs": [],
"source": [
"asset = {\n",
" '素材名稱': '', '來源與作者': '', '授權': '',\n",
" '使用或修改方式': '', '人物或個資處理': '',\n",
" 'AI或第三方API揭露': ''\n",
"}\n",
"asset"
]
},
{
"cell_type": "markdown",
"id": "94c428c2",
"metadata": {},
"source": [
"### 2. 發布前檢查\n",
"\n",
"標準實作:逐項確認;有任何一項不確定就先不要公開。"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "433e47da",
"metadata": {},
"outputs": [],
"source": [
"checklist = ['來源與授權清楚', '無未同意的人臉或個資', 'AI/API 使用已揭露', '沒有在版本庫放入金鑰']\n",
"for item in checklist: print('□', item)"
]
},
{
"cell_type": "markdown",
"id": "744a9307",
"metadata": {},
"source": [
"## Checks\n",
"\n",
"能否說出一個需要標示的情境,以及一個應先取得同意或改用素材的情境?"
]
},
{
"cell_type": "markdown",
"id": "a807986a",
"metadata": {},
"source": [
"## Next Steps\n",
"\n",
"進階挑戰:為期末作品訂出由誰、何時完成發布前審核的流程。"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.11"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Loading
Loading