Skip to content

wang2032/SilkFlow

Repository files navigation

🎵 SilkFlow - 高性能音频转换服务

快速 · 智能 · 可靠

基于 Bun + Hono 构建的高性能音频转换服务
支持微信 SILK、AMR 等多种格式智能转换为 MP3
自动上传至 MinIO 对象存储

Bun Hono License Docker


🌟 项目简介

SilkFlow 是一个专为微信语音转换设计的高性能音频处理服务。采用 Bun 运行时和 Hono 框架构建,提供极致的转换速度和最小的资源占用。

适用场景

  • 📱 微信语音转文字系统
  • 📦 语音消息归档
  • 🎵 音频格式标准化
  • ☁️ 云端音频处理平台

✨ 核心特性

  • 🚀 高性能: 基于 Bun 运行时,比 Node.js 快数倍
  • 🎯 轻量级: 使用 Hono 框架,极小的内存占用
  • 📦 开箱即用: 内置 SILK 解码器和 FFmpeg
  • 🎵 多格式支持: 自动识别并转换 SILK、AMR 及其他音频格式
  • 🔄 批量处理: 支持单文件和批量转换
  • 📊 任务追踪: 实时查询转换任务状态
  • 🛡️ 错误处理: 完善的错误捕获和提示
  • 🔍 智能检测: 自动检测音频格式并选择最佳转换方案
  • ☁️ 云存储集成: 自动上传至 MinIO,无需本地存储
  • 🔒 安全认证: Token 认证保护 API 接口
  • 🐳 Docker 支持: 一键部署到 Linux 服务器

📋 系统要求

本地开发

  • Bun >= 1.0.0
  • Windows 系统(使用 .exe 工具)或 Linux 系统(使用 FFmpeg)

生产部署

  • Docker 20.10+
  • Docker Compose 2.0+
  • Linux 服务器(推荐 Ubuntu 20.04+)

🚀 快速开始

方式一:本地开发(Windows)

1. 安装依赖

cd silkflow
bun install

2. 配置环境变量

创建 .env 文件:

PORT=3005
API_ACCESS_TOKEN=your_secret_token
MINIO_ACCESS_KEY=your_access_key
MINIO_SECRET_KEY=your_secret_key
MINIO_BUCKET_NAME=wechat
MINIO_URL=https://minio-api.wyts.tech

3. 启动服务

# 开发模式(热重载)
bun run dev

# 生产模式
bun start

方式二:Docker 部署(Linux 服务器)

1. 克隆项目

git clone <your-repo> /opt/silkflow
cd /opt/silkflow

2. 配置环境

cp .env.production .env
nano .env.production  # 编辑配置

3. 一键部署

chmod +x deploy.sh
./deploy.sh --build

详细部署文档请查看 DEPLOYMENT.md

📖 API 文档

服务启动后访问:

主要接口

1. 单文件转换

POST /api/convert/wechat-to-mp3
Authorization: Bearer your_token
Content-Type: application/json

{
  "url": "http://example.com/audio.silk",
  "quality": "128k",
  "filename": "my_audio.mp3"
}

响应:

{
  "success": true,
  "taskId": "task_xxx",
  "filename": "audio.mp3",
  "minioUrl": "https://minio-api.wyts.tech/wechat/silk-mp3/2025-10-22/audio.mp3",
  "fileSize": 21165,
  "duration": 305
}

2. 批量转换

POST /api/convert/batch
Authorization: Bearer your_token
Content-Type: application/json

{
  "urls": [
    "http://example.com/audio1.silk",
    "http://example.com/audio2.silk"
  ],
  "options": {
    "quality": "192k"
  }
}

3. 查询任务状态

GET /api/status/:taskId
Authorization: Bearer your_token

4. 语音转文字

POST /api/voice-to-text
Authorization: Bearer your_token
Content-Type: application/json

{
  "url": "https://minio-api.wyts.tech/wechat/silk-mp3/audio.mp3",
  "format": "mp3"
}

响应:

{
  "success": true,
  "data": {
    "text": "识别出的文字内容",
    "duration": 1319
  },
  "timestamp": "2025-10-23T..."
}

5. 一步到位:转换 + 转文字

POST /api/convert/wechat-to-mp3
Authorization: Bearer your_token
Content-Type: application/json

{
  "url": "http://example.com/audio.silk",
  "convertToText": true
}

响应:

{
  "success": true,
  "taskId": "task_xxx",
  "filename": "audio.mp3",
  "minioUrl": "https://minio-api.wyts.tech/wechat/silk-mp3/...",
  "fileSize": 21165,
  "duration": 366,
  "transcription": {
    "text": "识别出的文字内容",
    "duration": 1319
  },
  "timestamp": "2025-10-23T..."
}

📝 转换流程

SILK 格式流程

SILK 文件 → 下载 → 格式检测 → SILK 解码 → PCM → FFmpeg 转换 → MP3 → 上传 MinIO

AMR/其他格式流程

音频文件 → 下载 → 格式检测 → FFmpeg 直接转换 → MP3 → 上传 MinIO

支持的格式:

  • SILK V3 - 标准 SILK 格式(#!SILK_V3 开头)
  • 微信 SILK - 微信特殊格式(0x02 开头,自动添加头部)
  • AMR-NB/WB - AMR 窄带/宽带格式
  • 其他格式 - FFmpeg 支持的任意音频格式(自动检测)

详细步骤:

  1. 下载: 从 URL 下载音频文件
  2. 检测: 智能检测文件格式(SILK、AMR 或其他)
  3. 转换:
    • SILK → 使用 silk_v3_decoder 解码为 PCM → FFmpeg 转 MP3
    • 其他 → FFmpeg 直接转换为 MP3
  4. 上传: 上传 MP3 到 MinIO 对象存储
  5. 清理: 删除所有临时文件(包括 MP3)

注意:转换后的 MP3 文件会自动上传到 MinIO,本地不保留。如果上传失败,会保留本地文件。

🐳 Docker 部署

快速部署

# 使用部署脚本
./deploy.sh --build

# 或使用 docker-compose
docker-compose --env-file .env.production up -d --build

常用命令

# 查看日志
./deploy.sh --logs

# 重启服务
./deploy.sh --restart

# 停止服务
./deploy.sh --stop

# 查看状态
./deploy.sh --status

Nginx 反向代理

server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass http://localhost:3005;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        
        # 超时设置
        proxy_connect_timeout 300s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
    }
}

完整部署文档:DEPLOYMENT.md

🔒 安全配置

生成 API Token

# 方式一
openssl rand -hex 32

# 方式二
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"

使用 Token

# Header 方式(推荐)
Authorization: Bearer your_token_here

# URL 参数方式
?access_token=your_token_here

🏗️ 项目结构

silkflow/
├── src/
│   ├── index.ts           # 主入口
│   ├── middleware/        # 中间件
│   │   └── auth.ts       # 认证中间件
│   ├── routes/           # 路由
│   │   ├── health.ts     # 健康检查
│   │   ├── convert.ts    # 转换接口
│   │   ├── status.ts     # 状态查询
│   │   └── docs.ts       # API 文档
│   └── services/         # 服务层
│       ├── converter.ts  # 转换服务
│       ├── minio.ts      # MinIO 服务
│       └── taskManager.ts # 任务管理
├── bin/                  # 工具
│   ├── ffmpeg.exe       # FFmpeg 编码器
│   └── silk_v3_decoder.exe # SILK 解码器
├── e2e/
│   └── silk.http        # API 测试用例
├── Dockerfile           # Docker 镜像配置
├── docker-compose.yml   # Docker Compose 配置
├── deploy.sh            # 部署脚本
├── DEPLOYMENT.md        # 部署文档
├── package.json
└── README.md

🧪 测试

使用 VSCode REST Client 插件,打开 e2e/silk.http 直接测试所有接口。

📊 性能优化

  • ✅ 使用 Bun 原生 API 进行文件操作
  • ✅ 并发批量转换
  • ✅ 自动清理临时文件
  • ✅ 任务状态缓存管理
  • ✅ Docker 多阶段构建,减小镜像体积

🛠️ 开发

# 安装依赖
bun install

# 开发模式(热重载)
bun run dev

# 构建
bun run build

🤝 贡献

欢迎提交 Issue 和 Pull Request!

📄 许可证

MIT License

🔗 相关链接


Made with ❤️ using Bun and Hono

如果这个项目对你有帮助,欢迎 Star ⭐

About

高性能微信语音转换服务 - 快速、智能、可靠

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors