基于火山引擎豆包语音妙记 API 的音频转写工具,支持说话人分离、AI 总结、同步播放。基于 Nuxt 4 构建,完全隐私安全,零配置开箱即用,Serverless 友好~
- 💾 本地存储 - Token 存储在 localStorage,任务记录存储在 IndexedDB
- 🔄 智能轮询 - 自动查询任务状态,页面隐藏时暂停
- 📥 音频下载 - 原始音频保存在本地,支持随时下载
- 🗣️ 说话人分离 - 支持多人对话场景,可重命名说话人
- 🤖 AI 总结 - 自动生成会议/音频内容摘要
- 🎵 歌词式播放 - 播放时自动滚动高亮当前句子
- ✂️ 音频裁剪 - 超长音频自动提示裁剪
- ☁️ S3 存储 - 可选配置 S3 兼容存储(R2/MinIO 等)
# 克隆项目
git clone https://github.com/ZaneL1u/ai-voice-summary.git
cd ai-voice-summary
# 启动服务
docker compose up -d
# 访问 http://localhost:3000# 构建镜像
docker build -t ai-voice-summary .
# 运行容器
docker run -d -p 3000:3000 --name ai-voice-summary ai-voice-summary
# 访问 http://localhost:3000docker run -d -p 3000:3000 ghcr.io/ZaneL1u/ai-voice-summary:latest# 需要 Node.js >= 20 和 pnpm
pnpm installpnpm dev- 访问 http://localhost:3000/settings
- 前往 火山引擎控制台 获取 AppId 和 Token
- 填入并保存
- 回到首页,拖拽或点击上传音频文件
- 等待转写完成
- 查看结果、复制文本或下载音频
# 修改 nuxt.config.ts
nitro: {
preset: 'vercel'
}
# 部署
vercel# 修改 nuxt.config.ts
nitro: {
preset: 'netlify'
}
# 部署
netlify deploy# 修改 nuxt.config.ts
nitro: {
preset: 'cloudflare-pages'
}参见上方 Docker 部署 章节。
├── app/
│ ├── app.vue # 根组件
│ ├── assets/css/main.css # 全局样式
│ ├── components/
│ │ ├── AudioPlayer.vue # 底部悬浮播放器
│ │ ├── TaskCard.vue # 任务卡片组件
│ │ ├── TrimDialog.vue # 音频裁剪弹窗
│ │ └── ui/ # shadcn-vue 组件
│ ├── composables/
│ │ ├── useAudioPlayer.ts # 音频播放器状态
│ │ ├── useTokenStorage.ts # Token 存储 (localStorage)
│ │ ├── useTaskStore.ts # 任务存储 (IndexedDB)
│ │ ├── usePolling.ts # 智能轮询
│ │ ├── useS3Storage.ts # S3 存储
│ │ └── useTranscription.ts # 转写业务逻辑
│ ├── pages/
│ │ ├── index.vue # 首页 - 上传
│ │ ├── history.vue # 历史记录
│ │ └── settings.vue # 设置页面
│ └── types/
│ └── index.ts # TypeScript 类型定义
├── server/
│ └── api/
│ ├── transcribe/ # 转写 API
│ └── s3/ # S3 代理 API
├── Dockerfile
├── docker-compose.yml
├── nuxt.config.ts
└── package.json
提交转写任务
Headers:
x-vc-token: 火山引擎 Tokenx-vc-appid: 火山引擎 AppId
Body:
{
"fileUrl": "https://example.com/audio.mp3"
}Response:
{
"taskId": "xxx",
"requestId": "xxx"
}批量查询任务状态
Body:
{
"taskIds": ["task1", "task2"]
}| 变量名 | 说明 | 默认值 |
|---|---|---|
NUXT_HOST |
监听地址 | 0.0.0.0 |
NUXT_PORT |
监听端口 | 3000 |
注意:火山引擎凭证在浏览器端配置,不需要服务端环境变量。
- ✅ Token 仅存储在您的浏览器本地
- ✅ 音频文件、历史记录仅存储在您的浏览器 IndexedDB
- ✅ 服务端不保存任何用户数据
- ✅ 音频数据直接发送到火山引擎,服务端仅作代理
欢迎提交 Issue 和 Pull Request!