Windows / GPU 本地端輔導談話逐字稿處理工具
- 使用 faster-whisper 完成語音轉文字(ASR)。
- 透過本地 LLM(LM Studio 或 Ollama)產出逐字稿摘要與分類。
- 輸出標準化 JSON,包含
summary、categories、risk_flags、followups。
所有資料皆在本地端處理,不需上傳雲端。適合需要資料不離機、重視個資與合規的教育現場與研究環境。
- 批次支援:給定資料夾即可遞迴處理所有支援的音檔。
- ASR 快取:若既有
outputs/<檔名>.txt或音檔同層的 TXT,即可跳過轉錄(可用--force強制重跑)。 - 摘要快取:若既有
outputs/<檔名>.json,則跳過摘要生成(同樣可用--force覆寫)。 - 狀態日誌:輸出每個檔案的轉錄與摘要耗時,以及整批處理總耗時。
- JSON 結構:方便匯入校務系統或資料庫,亦可搭配 CSV 匯出工具。
CounselNote/ # 專案根目錄
├─ AGENTS.md # 協作者Codex CLI指南,說明流程與規範
├─ README.md # 專案概述、安裝與使用教學
├─ requirements.txt # Python 依賴套件清單
├─ src/ # 主要程式碼
│ ├─ local_asr_pipeline.py # 轉錄+摘要 CLI 主流程 (含快取邏輯、計時)
│ └─ merge_json_to_csv.py # 將 outputs/ 中的摘要 JSON 合併為 CSV 的小工具
└─ outputs/ # 產生的逐字稿與摘要結果(已在 .gitignore 中忽略內容)
# 範例路徑
D:\> git clone <your-repo-url> CounselNote
D:\> cd CounselNotepython --version
python -m venv .venv
.venv\Scripts\Activate.ps1python -m pip install --upgrade pip
pip install -r requirements.txtGPU 使用者建議安裝 CUDA 並更新 NVIDIA 顯示卡驅動程式。
- 安裝 LM Studio,下載一個 Instruct 類型的中文版模型(如
qwen2.5-7b-instruct)。 - 啟動 Local Server(OpenAI Compatible API),確認端點為
http://localhost:1234/v1。 - 執行程式時帶入
--provider lmstudio --lmstudio_model <模型名稱>。
- 安裝 Ollama:https://ollama.com/
- 下載模型範例:
ollama pull qwen3:4b
- 執行程式時帶入
--provider ollama --ollama_model qwen3:4b。
.venv\Scripts\Activate.ps1
python src\local_asr_pipeline.py D:\audio\case_20241003.mp3 --provider lmstudio --lmstudio_model qwen2.5-7b-instructpython src\local_asr_pipeline.py D:\audio --provider ollama --ollama_model qwen3:4b --ext mp3,wav,m4a,aac,flacpython src\local_asr_pipeline.py D:\audio --force此外,src/merge_json_to_csv.py 可將 outputs/ 內的摘要 JSON 合併為單一 CSV。執行範例:
python src/merge_json_to_csv.py outputs -o summaries.csv| 參數 | 說明 | 預設值 |
|---|---|---|
path |
單檔或資料夾路徑 | 必填 |
--provider |
lmstudio 或 ollama |
ollama |
--lmstudio_model |
LM Studio 模型名稱 | qwen2.5-7b-instruct |
--ollama_model |
Ollama 模型名稱 | qwen3:4b |
--out_dir |
輸出資料夾 | outputs |
--ext |
批次模式下的副檔名清單 | mp3,wav,m4a,aac,flac |
--force |
即使存在 TXT/JSON 也強制重跑 | False |
- 每個音檔會對應一份
outputs/<檔名>.txt(逐字稿)與outputs/<檔名>.json(摘要)。 processed_at使用來源音檔的最後修改時間。- JSON 範例:
{
"file": "D:/audio/case_20241003.mp3",
"processed_at": "2025-10-05T12:00:00",
"duration_sec": 3725,
"summary": "150-250 字內的重點概述,拆解師生觀點。",
"categories": ["課業", "心理"],
"risk_flags": ["提及長期失眠"],
"followups": ["兩週後回訪睡眠狀況", "轉介校內諮商初談"]
}下方是用於生成結構化摘要的提示詞。它要求模型僅輸出一個格式正確的 JSON 物件,確保欄位、型別與內容都符合輔導紀錄需求:
SUMMARY_PROMPT = """
你是一位學輔紀錄助理。請根據「逐字稿」產出結構化結果。
請只輸出一個 JSON 物件(不得有任何前後解說文字、標點或程式碼圍欄),鍵與型別 **必須** 完全符合以下規範:
{
"summary": "<以繁體中文撰寫,350–450字。請在摘要中清楚區分老師與學生的觀點/重點>",
"categories": [ "<從下列候選值中擇一或多個:課業、生活、交友、心理、生涯、課外活動>", ... ],
"risk_flags": [ "<可留空陣列;如有,列出具體風險點,如:長期失眠、疑似焦慮、自傷念頭等>", ... ],
"followups": [ "<教師後續追蹤行動建議(條列列點)>", ... ]
}
規則:
- 不得輸出任何解說、步驟、分析、推理或思考內容;**只允許輸出單一 JSON 物件**。
- 只能輸出 **一個** JSON 物件,且必須是合法 JSON(雙引號、逗號與括號位置正確)。
- "categories" 陣列的元素必須只來自以下候選值:["課業","生活","交友","心理","生涯","課外活動"];可多選或給空陣列。
- "summary" 必須 350–450 個中文字,避免個資;必要時可用「學生」「老師」指稱。
- 不得新增除了 "summary","categories","risk_flags","followups" 以外的鍵。
"""
ASR_MODEL_SIZE可依 GPU 記憶體調整:large-v3精準、medium較快。compute_type建議int8或int8_float16。beam_size可降低至1~3以提升速度。- 預設啟用
vad_filter=True以去除靜音段落。
- Q:找不到 GPU?
A:請更新 NVIDIA 驅動並安裝 CUDA Runtime;若仍失敗可將
DEVICE改為cpu。 - Q:LLM 回傳不是 JSON?
A:請確認選用 Instruct 模型並保持
temperature=0.2;仍失敗可檢查日誌並調整提示詞。 - Q:依賴版本不相容?
A:請將目前環境輸出:
pip freeze > requirements.txt
- 本程式可選擇使用 LM Studio 之本地模型進行摘要總結,但尚未經過詳細測試,可能仍有錯誤存在,尚待除錯。而經實測, Ollama qwen3:4b 可用,但由於預設具備思考模式,因此需後處理相關標籤:
</think>。例如local_asr_pipeline.py裡第 165 行的函式text_after_last_think。 - 後續製作 GUI 介面(Tkinter / PySimpleGUI),方便操作。
- SRT 字幕輸出(含毫秒時間軸)。
- 說話者分離(speaker diarization)。
- JSON Schema 驗證與
.jsonl匯出。
本專案原為一份在 Google Colab 上運作的 ipynb 筆記本。當時的流程是用 faster-whisper(large-v3、中文初始提示)把錄音轉成逐字稿,再把文字交給 Gemini 進行摘要。就技術驗證而言,這條路線很快證明可行:轉錄品質穩定、摘要足以生成會議紀要;而且只要換 file_index 就能處理不同錄音。
但當流程落地到校園情境,敏感與隱私成了關鍵考量:輔導內容屬於高度敏感個資,不宜離開校內/本機環境;把逐字稿送到雲端 LLM 進一步處理,資料外流風險與合規壓力偏高。因此,專案轉向「本地端全流程」:以 faster-whisper 在本機 GPU 完成 ASR,再透過 LM Studio 或 Ollama 調用開源 LLM 做摘要與分類,全程不出機。為了讓日常操作更順手,進一步加入:資料夾遞迴批次處理與逐字稿快取偵測(同名 .txt 即跳過 ASR),或 --force 參數(必要時強制重跑 ASR)。
最終形成了 CounselNote:一個以隱私優先、可維運為核心的本地端工具,能把輔導會談錄音穩定地轉成逐字稿(TXT)與結構化摘要(JSON),並為後續的去識別化、SRT、說話者分離與報表分析預留擴充空間。
本專案之開發過程,先以 ChatGPT 5 網頁對話,草擬核心程式碼,再到本機端使用 OpenAI Codex CLI(model: gpt-5-codex) 完成後續程式碼編寫和除錯,以及補充說明文件。最終 token 使用量為: Token usage: total=646,184 input=552,595 (+ 8,362,240 cached) output=93,589 (reasoning 58,560)。
本專案以 MIT License 發布。使用、修改或散布程式碼時,請保留原始的著作權與授權聲明,並在相關文件中標示出處。詳細條款請參考根目錄的 LICENSE 檔案。