基于 aham-voice(MIT,原项目已归档)改造。
录音转写工具不少,但多是网页服务:音频要上传到别人的服务器,转写完只给一段没分说话人、没结构的纯文本。本地能离线跑的,又通常停在「出一段字」。
TitanVault Minutes 把整条链路在你的服务器上接完整——转写、说话人分离、声学情绪全部本地离线 GPU 加速,只有纪要才交给你的大模型,音频和数据不离开你的机器。
本项目 fork 自 aham-voice(macOS 桌面应用,MIT),核心转写/声纹/纪要/情绪管线原样保留,重做了形态、平台、扩展性和工程结构:
| 维度 | 原版 aham-voice | 本项目 titanvault-minutes |
|---|---|---|
| 🖥️ 形态 | macOS 桌面 app(pywebview 打包 .app) |
Web 应用,浏览器访问,手机/平板同 Wi-Fi 可用 |
| 💻 平台 / GPU | 仅 macOS · MPS | Linux + Windows · CUDA / ROCm(AMD) / CPU 三档;Mac 原生 MPS |
| 🤖 大模型 | 硬编码 DeepSeek | 任意 OpenAI 兼容端点(DeepSeek / 通义 / Kimi / Ollama / vLLM) |
| 🏷️ 热词 | 仅手工录入 / txt 导入 | + LLM 智能发现:转写后自动抽取候选词 → 批量审阅确认 |
| 📝 纪要 | 模板 + 改写 | + 热词规范名注入、智能分块、时间戳跳转音频、docx 导出 |
| 🔐 访问控制 | 多用户体系(users / sessions / teams / roles) | 单密码门(删掉多用户死代码,局域网共享够用) |
| 📦 部署 | 手动打包 .app |
docker compose up -d 一键起,含模型自动下载 |
| 🧩 代码结构 | 单文件 main.py 5000+ 行 |
拆成 13 个聚焦模块(asr / hotwords / voiceprint / summary / emotion …) |
| 🧪 测试 | 无 | pytest + 74 单测(config / security / 热词发现 / docx / 方言纠错等) |
| 🩺 健壮性 | — | 中断任务自动恢复、ffmpeg 路径 fallback、错误信息脱敏 |
Mac 用户可以用下方"Mac 原生部署"一键脚本(MPS GPU 加速),也可以用 Docker(仅 CPU)。
| 特性 | 说明 |
|---|---|
| 🔒 隐私优先 | 转写/说话人/情绪全部本地,音频不上传 |
| ⚡ GPU 加速 | AMD ROCm / NVIDIA CUDA / CPU 三种模式,21 分钟录音 30 秒转完 |
| 🤖 任意大模型 | 纪要走 OpenAI 兼容端点——DeepSeek / 通义 / Kimi / Ollama / vLLM 随便换 |
| 🏷️ 热词智能发现 | 转写后 LLM 自动抽取专业术语,批量审阅确认 |
| 📝 结构化纪要 | 会议类型智能判断 + 智能分块 + 热词规范名注入,纪要专有名词写法统一 |
| 🌐 方言口音纠错 | 贵州话/四川话等方言的近音错字,转写后 LLM 结合上下文纠正(实测纠错率约 80%) |
| 🔗 时间戳跳转 | 纪要里的时间戳可点击,自动跳转音频对应位置播放 |
| 📄 Word 导出 | 纪要支持 docx 导出(国内主流格式),Markdown/Word 自由切换 |
| 💬 IM 集成 | API Token 供飞书/Hermes 等 agent 调用,发录音自动生成纪要发回 |
| 🗣️ 说话人分离 | CAM++ 声纹,逐句标注谁在说,声纹可管理 |
| 🎭 双层情绪 | emotion2vec 声学层 + LLM 语义层对冲分析 |
| 🔧 双 ASR 引擎 | 默认 FunASR(Paraformer+CAM++);可选 MOSS-Transcribe-Diarize(0.9B 端到端转写+分离,INTERSPEECH 2026 冠军,支持 90 分钟长音频) |
| 🐳 一键部署 | Docker 镜像,docker compose up -d 即用 |
git clone https://github.com/kaka86mm/titanvault-minutes.git
cd titanvault-minutes
cp .env.example .env # 填 LLM Key(纪要用)
./start-mac.sh # 首次自动装依赖+下模型,约 5-10 分钟脚本自动完成:检查环境 → 装 ffmpeg → 创建 venv → 装依赖 → 启动(MPS GPU 加速)。后续运行直接 ./start-mac.sh。
浏览器打开 http://localhost:8765。
git clone https://github.com/kaka86mm/titanvault-minutes.git && cd titanvault-minutes
cp .env.example .env # 填密码 + LLM Key
docker compose up -d # 首次自动下载 ~4GB 模型浏览器打开 http://<服务器IP>:8765,手机/平板同 Wi-Fi 也能访问。
🖥️ GPU 加速
NVIDIA CUDA(Linux):
# docker-compose.yml 改 image: titanvault-minutes:gpu, dockerfile: Dockerfile.gpu
# 取消 deploy.resources 注释,.env 设 TITANVAULT_ASR_DEVICE=cudaAMD ROCm(gfx1151/Radeon 等):
docker compose -f docker-compose.yml -f docker-compose.rocm.yml up -d⚙️ 配置项(.env)
TITANVAULT_ACCESS_PASSWORD= # 空=裸奔;非空=启用单密码门
LLM_API_KEY= # OpenAI 兼容端点的 Key
LLM_API_BASE=https://api.deepseek.com
LLM_MODEL=deepseek-chat
TITANVAULT_ASR_DEVICE=cpu # cpu / cuda🔧 ASR 引擎切换(FunASR / MOSS)
默认使用 FunASR(Paraformer + VAD + 标点 + CAM++ 说话人分离),开箱即用。
可选切换到 MOSS-Transcribe-Diarize(复旦 OpenMOSS,0.9B 端到端转写+说话人分离,INTERSPEECH 2026 MLC-SLM 冠军):
| FunASR(默认) | MOSS | |
|---|---|---|
| 转写+分离 | 两步:Paraformer ASR + CAM++ 聚类 | 一步端到端,不存在对齐问题 |
| 长音频 | 分块处理,说话人标签可能跨块不一致 | 单次推理 90 分钟,说话人全局一致 |
| 声纹匹配 | CAM++ 精确,分数高 | 合并段 + 兜底阈值 + 排除法 |
| 热词 | 声学层硬约束 | prompt 软引导 + 后置替换 |
| 情绪分析 | ✅ emotion2vec | ✅ emotion2vec(引擎无关) |
| GPU 显存 | ~4GB | ~6.4GB(需 SDPA/Efficient Attention) |
启用 MOSS(仅 ROCm Docker):
# 1. 构建镜像(装 MOSS helper 包)
docker compose -f docker-compose.rocm.yml build --build-arg BUILD_MOSS=1
# 2. 下载模型到挂载目录
# 从 HuggingFace 下载 OpenMOSS-Team/MOSS-Transcribe-Diarize 到 ./models/moss-transcribe-diarize/
# 3. .env 切换引擎
echo "TITANVAULT_ASR_ENGINE=moss" >> .env
# ROCm Efficient Attention(MOSS 长音频必需,防 OOM)
echo "TORCH_ROCM_AOTRITON_ENABLE_EXPERIMENTAL=1" >> .env
docker compose -f docker-compose.rocm.yml up -d🏗️ 架构
backend/app/
├── main.py # FastAPI + 路由 + 静态托管
├── config.py # 路径/env/LLM 配置
├── db.py # SQLite + schema + 中断恢复
├── security.py # 单密码门
├── asr.py # ASR 转写(枢纽):FunASR 默认 / MOSS 可选 (TITANVAULT_ASR_ENGINE)
├── hotwords.py # 热词双轨系统
├── hotword_discover.py # 热词 LLM 智能发现
├── voiceprint.py # 声纹多采样匹配
├── emotion.py # emotion2vec + LLM 情绪
├── summary.py # 纪要 map-reduce + 改写
└── deepseek.py # LLM 传输层
🔧 本地开发
# 后端
python -m venv .venv && source .venv/bin/activate
pip install -r backend/requirements.txt
TITANVAULT_HOME=/tmp/aham-dev python -m uvicorn backend.app.main:app --port 8765 --reload
# 前端(另一个终端)
cd frontend-src && npm install && npm run dev # Vite 5174
# 测试
python -m pytest backend/tests/ -v| 平台 | 方案 | GPU |
|---|---|---|
| Mac | 本项目一键脚本(./start-mac.sh) |
MPS ✅ |
| Linux | 本项目 Docker | CUDA / ROCm / CPU |
| Windows | 本项目 Docker | CPU |
Forked from aham-voice (MIT, original archived).
Most transcription tools are cloud services: you upload audio to someone else's server, and get back unstructured plain text without speaker labels. Local tools usually stop at "here's some text."
TitanVault Minutes completes the entire pipeline on your own server — transcription, speaker diarization, and acoustic emotion all run locally with GPU acceleration. Only the meeting summary goes to your LLM. Audio and data never leave your machine.
This project is forked from aham-voice (a macOS desktop app, MIT). The core transcription / voiceprint / summary / emotion pipeline is preserved as-is — what we rebuilt is the form, platform, extensibility, and engineering structure:
| Dimension | Original aham-voice | This project titanvault-minutes |
|---|---|---|
| 🖥️ Form | macOS desktop app (pywebview, packaged .app) |
Web app — browser access, phone/tablet on same Wi-Fi |
| 💻 Platform / GPU | macOS only · MPS | Linux + Windows · CUDA / ROCm (AMD) / CPU; Mac native MPS |
| 🤖 LLM | Hard-coded DeepSeek | Any OpenAI-compatible endpoint (DeepSeek / Qwen / Kimi / Ollama / vLLM) |
| 🏷️ Hotwords | Manual entry / txt import only | + Smart LLM discovery: auto-extract candidates post-transcription → batch review |
| 📝 Summaries | Template + revision | + Glossary injection, smart chunking, timestamp seek to audio, docx export |
| 🔐 Access control | Multi-user system (users / sessions / teams / roles) | Single password gate (removed multi-user dead code, enough for LAN sharing) |
| 📦 Deployment | Manual .app packaging |
docker compose up -d one-command, with auto model download |
| 🧩 Code structure | Single main.py 5000+ lines |
Split into 13 focused modules (asr / hotwords / voiceprint / summary / emotion …) |
| 🧪 Tests | None | pytest + 74 unit tests (config / security / hotword discovery / docx / dialect correction, etc.) |
| 🩺 Robustness | — | Interrupted-task auto-recovery, ffmpeg PATH fallback, sanitized error messages |
Mac users can use the one-click native script below (MPS GPU acceleration), or Docker (CPU only).
| Feature | Description |
|---|---|
| 🔒 Privacy-first | Transcription/diarization/emotion all local — audio never uploaded |
| ⚡ GPU accelerated | AMD ROCm / NVIDIA CUDA / CPU — 21-min audio in 30 seconds |
| 🤖 Any LLM | Summaries via OpenAI-compatible endpoint — DeepSeek / Qwen / Kimi / Ollama / vLLM |
| 🏷️ Smart hotword discovery | LLM auto-extracts domain terms post-transcription, batch review |
| 📝 Structured summaries | Smart meeting-type detection + smart chunking + glossary injection for consistent terminology |
| 🌐 Dialect correction | LLM fixes tonal-dialect misrecognitions (Guizhou/Sichuan etc.) post-transcription (~80% correction rate) |
| 🔗 Timestamp seek | Click any timestamp in the summary to jump to that audio moment |
| 📄 Word export | Export summaries as .docx (de facto format in CN) or Markdown |
| 💬 IM integration | API Token for Feishu/Hermes agents — send audio, get summary back |
| 🗣️ Speaker diarization | CAM++ voiceprints, per-utterance speaker labels, manageable profiles |
| 🎭 Dual-layer emotion | emotion2vec acoustic + LLM semantic analysis |
| 🔧 Dual ASR engine | Default FunASR (Paraformer+CAM++); optional MOSS-Transcribe-Diarize (0.9B end-to-end, INTERSPEECH 2026 champion, 90-min long-form audio) |
| 🐳 One-command deploy | Docker image, docker compose up -d and you're running |
git clone https://github.com/kaka86mm/titanvault-minutes.git
cd titanvault-minutes
cp .env.example .env # Set LLM key (for summaries)
./start-mac.sh # First run: auto-installs deps + models (~5-10 min)The script auto-checks environment, installs ffmpeg, creates venv, installs deps, and launches with MPS GPU acceleration. Subsequent runs: just ./start-mac.sh.
Open http://localhost:8765.
git clone https://github.com/kaka86mm/titanvault-minutes.git && cd titanvault-minutes
cp .env.example .env # Set password + LLM key
docker compose up -d # Auto-downloads ~4GB models on first runOpen http://<server-ip>:8765 in your browser. Phones/tablets on the same Wi-Fi can access it too.
🖥️ GPU Acceleration
NVIDIA CUDA (Linux):
# Edit docker-compose.yml: image: titanvault-minutes:gpu, dockerfile: Dockerfile.gpu
# Uncomment deploy.resources, set TITANVAULT_ASR_DEVICE=cuda in .envAMD ROCm (gfx1151/Radeon etc.):
docker compose -f docker-compose.yml -f docker-compose.rocm.yml up -d⚙️ Configuration (.env)
TITANVAULT_ACCESS_PASSWORD= # Empty=no gate; set to enable password
LLM_API_KEY= # Your OpenAI-compatible API key
LLM_API_BASE=https://api.deepseek.com
LLM_MODEL=deepseek-chat
TITANVAULT_ASR_DEVICE=cpu # cpu / cudaMIT — forked from aham-voice (MIT)
把灵光一现,做成能用的 AI 工具。
Turn sparks of insight into AI tools that actually work.
