Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NovelTTS - 智能话本处理工具

一个基于 AI 的 Markdown 话本自动处理工具,能够将中文小说/剧本转换为结构化的有声书数据。

🚀 功能特性

五阶段智能处理流程

  1. Stage A - 结构解析:自动解析 Markdown 结构,提取书名、章节和小节信息
  2. Stage B - 分片预处理:按 2000 字上限进行智能切片,生成标准化数据结构
  3. Stage C - AI 智能解析:使用 Kimi AI 进行角色识别、对话分割和情绪标注
  4. Stage D - 校验导出:数据校验和统计分析,生成结构化输出
  5. 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 (用于音频处理)

1. 克隆项目

git clone <repository-url>
cd EpubAutomateTTS

2. 安装依赖

npm install

3. 环境配置

复制 .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

4. 数据库设置

在 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()
);

5. 启动开发服务器

# 同时启动前端和后端
npm run dev

# 或者分别启动
npm run client:dev  # 前端 (http://localhost:5173)
npm run server:dev  # 后端 (http://localhost:3001)

📖 使用指南

1. 上传文件

  • 访问 http://localhost:5173
  • 拖拽或选择 Markdown 文件上传
  • 支持 .md 和 .markdown 格式,最大 10MB

2. 自动处理

  • Stage A:自动解析 Markdown 结构
  • Stage B:智能分片处理
  • 处理完成后自动跳转到预览页面

3. 预览和选择

  • 查看章节和片段列表
  • 选择需要 AI 分析的片段
  • 支持批量选择和预览功能

4. AI 分析

  • 启动 AI 分析选定的片段
  • 实时监控分析进度
  • 查看角色识别和情绪标注结果

5. 音频合成

  • 配置角色音色映射
  • 启动 TTS 音频合成
  • 下载生成的音频文件

🔧 API 接口

文件上传

POST /api/upload

启动处理

POST /api/process

获取状态

GET /api/process/status/:taskId

获取片段列表

GET /api/clips/:taskId

启动 AI 分析

POST /api/analyze

TTS 音色列表

GET /api/tts/voices

启动 TTS 合成

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

🤝 贡献指南

  1. Fork 项目
  2. 创建功能分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 打开 Pull Request

📄 许可证

本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。

🆘 问题反馈

如果您遇到任何问题或有功能建议,请在 Issues 页面提交。

🙏 致谢

About

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages