一个基于 AI 的 Markdown 话本自动处理工具,能够将中文小说/剧本转换为结构化的有声书数据。
- Stage A - 结构解析:自动解析 Markdown 结构,提取书名、章节和小节信息
- Stage B - 分片预处理:按 2000 字上限进行智能切片,生成标准化数据结构
- Stage C - AI 智能解析:使用 Kimi AI 进行角色识别、对话分割和情绪标注
- Stage D - 校验导出:数据校验和统计分析,生成结构化输出
- Stage E - TTS 音频合成:调用 Azure Speech Service 生成高质量音频
- ✅ 智能角色识别:AI 自动识别对话角色,支持别名合并和角色统一
- ✅ 情绪标注:基于文本内容自动分析情绪和语气,提升音频表现力
- ✅ 高质量 TTS:集成 Azure Speech Service,支持多种中文音色
- ✅ 灵活导出:支持 JSON、CSV 等多种格式导出,便于后续处理
- ✅ 音频合成:自动合成完整音频文件,支持多种格式输出
- ✅ 用户友好:直观的界面设计,支持实时进度监控和预览
- React 18 + TypeScript
- Tailwind CSS
- Vite
- React Router
- Heroicons
- React Hot Toast
- Express 4 + TypeScript
- Supabase (PostgreSQL)
- Multer (文件上传)
- FFmpeg (音频处理)
- Kimi AI (兼容 OpenAI API)
- Azure Speech Service
- Node.js 18+
- npm 或 yarn
- FFmpeg (用于音频处理)
git clone <repository-url>
cd EpubAutomateTTSnpm install复制 .env.example 到 .env 并配置以下环境变量:
# Server Configuration
PORT=3001
NODE_ENV=development
# Supabase Configuration
SUPABASE_URL=your_supabase_url_here
SUPABASE_ANON_KEY=your_supabase_anon_key_here
# AI Service Configuration (Kimi API)
KIMI_API_KEY=your_kimi_api_key_here
KIMI_BASE_URL=https://api.moonshot.cn/v1
# Azure Speech Service Configuration
AZURE_SPEECH_KEY=your_azure_speech_key_here
AZURE_SPEECH_REGION=your_azure_speech_region_here
# File Upload Configuration
UPLOAD_DIR=./uploads
MAX_FILE_SIZE=10485760
# Audio Processing Configuration
AUDIO_OUTPUT_DIR=./audio_output
DEFAULT_AUDIO_FORMAT=mp3
DEFAULT_AUDIO_BITRATE=128k
# Processing Configuration
MAX_CLIP_SIZE=2000
PROCESSING_TIMEOUT=300000在 Supabase 中创建以下表结构:
-- 创建 books 表
CREATE TABLE books (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
title VARCHAR(255) NOT NULL,
original_filename VARCHAR(255) NOT NULL,
file_path TEXT,
status VARCHAR(50) DEFAULT 'uploaded' CHECK (status IN ('uploaded', 'processing', 'completed', 'failed')),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 创建 chapters 表
CREATE TABLE chapters (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
book_id UUID NOT NULL REFERENCES books(id) ON DELETE CASCADE,
chapter_index INTEGER NOT NULL,
chapter_title VARCHAR(255) NOT NULL,
chapter_slug VARCHAR(255) NOT NULL,
content TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 创建 clips 表
CREATE TABLE clips (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
chapter_id UUID NOT NULL REFERENCES chapters(id) ON DELETE CASCADE,
clip_index INTEGER NOT NULL,
clip_id VARCHAR(255) NOT NULL UNIQUE,
content TEXT NOT NULL,
char_count INTEGER NOT NULL,
source_info JSONB,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 创建 clip_analysis 表
CREATE TABLE clip_analysis (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
clip_id UUID NOT NULL REFERENCES clips(id) ON DELETE CASCADE,
roles JSONB NOT NULL DEFAULT '[]',
utterances JSONB NOT NULL DEFAULT '[]',
stats JSONB NOT NULL DEFAULT '{}',
errors JSONB NOT NULL DEFAULT '[]',
status VARCHAR(50) DEFAULT 'pending' CHECK (status IN ('pending', 'processing', 'completed', 'failed')),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 创建 audio_synthesis 表
CREATE TABLE audio_synthesis (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
clip_id UUID NOT NULL REFERENCES clips(id) ON DELETE CASCADE,
voice_mapping JSONB NOT NULL DEFAULT '{}',
audio_format VARCHAR(10) DEFAULT 'mp3',
status VARCHAR(50) DEFAULT 'pending' CHECK (status IN ('pending', 'processing', 'completed', 'failed')),
final_audio_path TEXT,
duration_seconds INTEGER,
file_size_bytes BIGINT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
completed_at TIMESTAMP WITH TIME ZONE
);
-- 创建 audio_segments 表
CREATE TABLE audio_segments (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
synthesis_id UUID NOT NULL REFERENCES audio_synthesis(id) ON DELETE CASCADE,
utterance_index INTEGER NOT NULL,
speaker_id VARCHAR(255) NOT NULL,
voice_name VARCHAR(255) NOT NULL,
text_content TEXT NOT NULL,
segment_audio_path TEXT,
duration_ms INTEGER,
status VARCHAR(50) DEFAULT 'pending' CHECK (status IN ('pending', 'processing', 'completed', 'failed')),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);# 同时启动前端和后端
npm run dev
# 或者分别启动
npm run client:dev # 前端 (http://localhost:5173)
npm run server:dev # 后端 (http://localhost:3001)- 访问 http://localhost:5173
- 拖拽或选择 Markdown 文件上传
- 支持 .md 和 .markdown 格式,最大 10MB
- Stage A:自动解析 Markdown 结构
- Stage B:智能分片处理
- 处理完成后自动跳转到预览页面
- 查看章节和片段列表
- 选择需要 AI 分析的片段
- 支持批量选择和预览功能
- 启动 AI 分析选定的片段
- 实时监控分析进度
- 查看角色识别和情绪标注结果
- 配置角色音色映射
- 启动 TTS 音频合成
- 下载生成的音频文件
POST /api/upload
POST /api/process
GET /api/process/status/:taskId
GET /api/clips/:taskId
POST /api/analyze
GET /api/tts/voices
POST /api/tts/synthesize
GET /api/audio/:clipId
EpubAutomateTTS/
├── api/ # 后端代码
│ ├── config/ # 数据库配置
│ ├── routes/ # API 路由
│ ├── services/ # 业务服务
│ └── app.ts # 应用入口
├── src/ # 前端代码
│ ├── components/ # React 组件
│ ├── pages/ # 页面组件
│ ├── hooks/ # 自定义 Hooks
│ └── lib/ # 工具函数
├── uploads/ # 上传文件目录
├── audio_output/ # 音频输出目录
└── README.md
- Fork 项目
- 创建功能分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 打开 Pull Request
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
如果您遇到任何问题或有功能建议,请在 Issues 页面提交。
- Kimi AI - 提供强大的 AI 分析能力
- Azure Speech Service - 提供高质量的 TTS 服务
- Supabase - 提供便捷的数据库服务
- FFmpeg - 提供音频处理能力