黃予岑KEN
← 所有作品
Applied ML

nobook

手機當錄音端、自己的筆電當推論伺服器,課堂上即時產出逐字稿、段落摘要與能直接照抄的手抄版筆記。ASR 與 LLM 全部在一張 8GB 顯卡上輪流執行,不呼叫任何雲端 API,錄音與逐字稿不離開自己的機器。

角色:獨立開發、已用於真實課堂技術主軸:本地 ASR + LLM · VRAM 資源管理平台:手機 PWA + 筆電 GPU(Tailscale)
GitHub

重點

+

約 1 秒出字

說完一句,逐字稿中位數 0.88 秒出現(P95 1.66 秒)

三小時連續運轉實測:1701 段、RTF 平均 0.236、端到端延遲中位數 0.88 秒,記憶體穩態下幾乎不成長。

+

8GB 塞下兩種模型

Breeze-ASR-25 + Qwen3 4B / 8B 輪流共用顯卡

課中用 Qwen3-4B 做段落摘要、課後切到 8B 重新整理;切換約 4.6 秒,ASR 卸載可釋放 1.5GB。

+

術語表 +46.4%

課程術語當 initial_prompt,真實錄音正確率大幅提升

同樣的比較在合成 TTS 音檔上只有 +6.2%——乾淨音檔有天花板效應,所以驗收一律以真實課堂錄音為準。

+

閘門式驗收

G0–G4 閘門與 109 項自檢全數通過

環境、即時逐字稿、分段摘要、模型切換、混沌測試各有獨立的驗證腳本,前一關沒過就不進下一個里程碑。

↑ 點任一張卡片看它怎麼做到的

為什麼做這個

有些課要邊聽邊在紙上寫筆記,一下課就得交。我需要的不是「課後產一份漂亮的整理」,而是課還在上的時候,就有一份能直接照著抄、而且抄得完的東西。

市面上的轉錄服務大多要把錄音上傳雲端,我不想讓整學期的上課錄音離開自己的電腦。手邊剛好有一台 RTX 4060 筆電,於是決定把 ASR 和 LLM 都搬到本地,挑戰在 8GB 顯卡上把即時轉錄和摘要同時跑起來。

功能總覽

🎙️ 即時逐字稿+說完一句約 1 秒出現

手機或平板透過 WebSocket 串流音訊,筆電端經 VAD 切段後送 faster-whisper(Breeze-ASR-25)辨識,逐字稿即時回傳。斷線時前端最多本地累積 60 秒,重連後補送。

📝 分段整理與手抄版+按一下就整理,錄音不中斷

上課中按一次,把「上次按到現在」整理成一則段落筆記;隨時可把目前為止的段落彙整成能直接抄到紙上的手抄版。

📋 學習單模式+照固定欄位產出,每欄多給幾則挑

有些課要填「今天上課內容 / 印象深刻 / 想法 / 反思」這類固定欄位,可以在課程設定裡定義欄位,系統照欄位產出。

🔍 接地檢查與術語修正+標出逐字稿找不到依據的內容

筆記中的數字與專有名詞若在逐字稿裡找不到依據會被標出,避免把模型自己補的東西抄上去交;另用課程術語表與拼音把讀音相近的錯字改回來。

📄 課後完整筆記與匯出+切大模型重整、匯出 Word

下課後切到較大的模型重新整理,同時產出手抄版與完整版;可匯出 Markdown 與使用 Word 原生樣式的 .docx,同一天多段錄音也能合併重產。

關鍵技術決策

資源衝突時,永遠犧牲摘要保逐字稿

逐字稿是核心、摘要是加值。ASR 推論前先檢查 VRAM 餘量,不足就推入延遲佇列而不是直接 OOM;真的遇到 CUDA OOM 時先卸載摘要模型再重試 ASR。llama-server 掛掉或磁碟寫入失敗,都不會中斷逐字稿。

取捨

摘要可能晚一點或暫時降級,但上課內容一句都不會漏。

系統架構

手機 / 平板(PWA,錄音端)
↓ WebSocket over Tailscale
筆電(FastAPI 推論伺服器)
├─ 音訊管線:ring buffer → silero-vad 切段 → ASR 佇列
├─ ASR:faster-whisper(Breeze-ASR-25, int8_float16)
├─ 摘要:llama-server 子行程(Qwen3 4B 課中 / 8B 課後)
│ └─ VRAM 監控、OOM 時卸載摘要模型保 ASR
├─ 後處理:術語近似音修正、接地檢查
└─ 儲存與匯出:SQLite · Markdown · Word(.docx)

技術棧

PythonFastAPIWebSocketfaster-whisper / CTranslate2silero-vadllama.cppQwen3SQLiteTailscalePWA
← 回到作品列表