refactor: rename backend/frontend dirs and remove NovelWriter submodule
- Rename qwen3-tts-backend → canto-backend - Rename qwen3-tts-frontend → canto-frontend - Remove NovelWriter embedded repo Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
16
.gitignore
vendored
16
.gitignore
vendored
@@ -26,16 +26,16 @@ checkpoints/
|
||||
docker/models/
|
||||
docker/data/
|
||||
docker/.env
|
||||
qwen3-tts-frontend/node_modules/
|
||||
qwen3-tts-frontend/dist/
|
||||
qwen3-tts-frontend/.env
|
||||
qwen3-tts-frontend/.env.local
|
||||
canto-frontend/node_modules/
|
||||
canto-frontend/dist/
|
||||
canto-frontend/.env
|
||||
canto-frontend/.env.local
|
||||
CLAUDE.md
|
||||
样本.mp3
|
||||
aliyun.md
|
||||
/nginx.conf
|
||||
deploy.md
|
||||
qwen3-tts-backend/scripts
|
||||
qwen3-tts-backend/examples
|
||||
qwen3-tts-backend/qwen3-tts.service
|
||||
qwen3-tts-frontend/.env.production
|
||||
canto-backend/scripts
|
||||
canto-backend/examples
|
||||
canto-backend/canto.service
|
||||
canto-frontend/.env.production
|
||||
|
||||
348
README.zh.md
348
README.zh.md
@@ -1,348 +0,0 @@
|
||||
# Qwen3-TTS WebUI
|
||||
|
||||
> **⚠️ 注意:** 本项目由大量 AI 生成,目前处于不稳定状态。稳定版将在 [Releases](../../releases) 中发布。
|
||||
|
||||
**非官方** 基于 Qwen3-TTS 的文本转语音 Web 应用,支持自定义语音、语音设计和语音克隆,提供直观的 Web 界面。
|
||||
|
||||
> 这是一个非官方项目。如需查看官方 Qwen3-TTS 仓库,请访问 [QwenLM/Qwen3-TTS](https://github.com/QwenLM/Qwen3-TTS)。
|
||||
|
||||
[English Documentation](./README.md)
|
||||
|
||||
## 功能特性
|
||||
|
||||
- 自定义语音:预定义说话人语音
|
||||
- 语音设计:自然语言描述创建语音
|
||||
- 语音克隆:上传音频克隆语音
|
||||
- **IndexTTS2**:高质量语音克隆,支持情感控制(高兴、愤怒、悲伤、恐惧、惊讶等),由 [IndexTTS2](https://github.com/iszhanjiawei/indexTTS2) 驱动
|
||||
- 有声书生成:上传 EPUB 文件,通过 LLM 自动提取角色并分配语音,生成多角色有声书;支持为每个角色单独启用 IndexTTS2
|
||||
- 双后端支持:支持本地模型和阿里云 TTS API 切换
|
||||
- 多语言支持:English、简体中文、繁體中文、日本語、한국어
|
||||
- JWT 认证、异步任务、语音缓存、暗黑模式
|
||||
|
||||
## 界面预览
|
||||
|
||||
### 桌面端 - 亮色模式
|
||||

|
||||
|
||||
### 桌面端 - 暗黑模式
|
||||

|
||||
|
||||
### 移动端
|
||||
<table>
|
||||
<tr>
|
||||
<td width="50%"><img src="./images/mobile-lightmode-custom.png" alt="移动端亮色模式" /></td>
|
||||
<td width="50%"><img src="./images/mobile-settings.png" alt="移动端设置" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
### 有声书生成
|
||||

|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td width="50%"><img src="./images/audiobook-characters.png" alt="有声书角色列表" /></td>
|
||||
<td width="50%"><img src="./images/audiobook-chapters.png" alt="有声书章节列表" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## 技术栈
|
||||
|
||||
**后端**: FastAPI + SQLAlchemy + PyTorch + JWT
|
||||
- 使用 PyTorch 直接推理 Qwen3-TTS 模型
|
||||
- 异步任务处理与批量优化
|
||||
- 支持本地模型 + 阿里云 API 双后端
|
||||
|
||||
**前端**: React 19 + TypeScript + Vite + Tailwind + Shadcn/ui
|
||||
|
||||
## Docker 部署
|
||||
|
||||
预构建镜像已发布至 Docker Hub:[bdim404/qwen3-tts-backend](https://hub.docker.com/r/bdim404/qwen3-tts-backend)、[bdim404/qwen3-tts-frontend](https://hub.docker.com/r/bdim404/qwen3-tts-frontend)
|
||||
|
||||
**前置要求**:Docker、Docker Compose、NVIDIA GPU + [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html)
|
||||
|
||||
```bash
|
||||
git clone https://github.com/bdim404/Qwen3-TTS-WebUI.git
|
||||
cd Qwen3-TTS-webUI
|
||||
|
||||
# 下载模型到 docker/models/(参见下方"安装部署 > 下载模型")
|
||||
mkdir -p docker/models docker/data
|
||||
|
||||
# 配置
|
||||
cp docker/.env.example docker/.env
|
||||
# 编辑 docker/.env,设置 SECRET_KEY
|
||||
|
||||
cd docker
|
||||
|
||||
# 拉取预构建镜像
|
||||
docker compose pull
|
||||
|
||||
# 启动(仅 CPU)
|
||||
docker compose up -d
|
||||
|
||||
# 启动(GPU 加速)
|
||||
docker compose -f docker-compose.yml -f docker-compose.gpu.yml up -d
|
||||
```
|
||||
|
||||
访问 `http://localhost`,默认账号:`admin` / `admin123456`
|
||||
|
||||
## 安装部署
|
||||
|
||||
### 环境要求
|
||||
|
||||
- Python 3.9+ 并支持 CUDA(用于本地模型推理)
|
||||
- Node.js 18+(用于前端)
|
||||
- Git
|
||||
|
||||
### 1. 克隆仓库
|
||||
|
||||
```bash
|
||||
git clone https://github.com/bdim404/Qwen3-TTS-WebUI.git
|
||||
cd Qwen3-TTS-webUI
|
||||
```
|
||||
|
||||
### 2. 下载模型
|
||||
|
||||
**重要**: 模型**不会**自动下载,需要手动下载。
|
||||
|
||||
详细信息请访问官方仓库:[Qwen3-TTS 模型](https://github.com/QwenLM/Qwen3-TTS)
|
||||
|
||||
进入模型目录:
|
||||
```bash
|
||||
# Docker 部署
|
||||
mkdir -p docker/models && cd docker/models
|
||||
|
||||
# 本地部署
|
||||
cd qwen3-tts-backend && mkdir -p Qwen && cd Qwen
|
||||
```
|
||||
|
||||
**方式一:通过 ModelScope 下载(推荐中国大陆用户)**
|
||||
|
||||
```bash
|
||||
pip install -U modelscope
|
||||
|
||||
modelscope download --model Qwen/Qwen3-TTS-Tokenizer-12Hz --local_dir ./Qwen3-TTS-Tokenizer-12Hz
|
||||
modelscope download --model Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice --local_dir ./Qwen3-TTS-12Hz-1.7B-CustomVoice
|
||||
modelscope download --model Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign --local_dir ./Qwen3-TTS-12Hz-1.7B-VoiceDesign
|
||||
modelscope download --model Qwen/Qwen3-TTS-12Hz-1.7B-Base --local_dir ./Qwen3-TTS-12Hz-1.7B-Base
|
||||
```
|
||||
|
||||
可选的 0.6B 模型(更小、更快):
|
||||
```bash
|
||||
modelscope download --model Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice --local_dir ./Qwen3-TTS-12Hz-0.6B-CustomVoice
|
||||
modelscope download --model Qwen/Qwen3-TTS-12Hz-0.6B-Base --local_dir ./Qwen3-TTS-12Hz-0.6B-Base
|
||||
```
|
||||
|
||||
**方式二:通过 Hugging Face 下载**
|
||||
|
||||
```bash
|
||||
pip install -U "huggingface_hub[cli]"
|
||||
|
||||
hf download Qwen/Qwen3-TTS-Tokenizer-12Hz --local-dir ./Qwen3-TTS-Tokenizer-12Hz
|
||||
hf download Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice --local-dir ./Qwen3-TTS-12Hz-1.7B-CustomVoice
|
||||
hf download Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign --local-dir ./Qwen3-TTS-12Hz-1.7B-VoiceDesign
|
||||
hf download Qwen/Qwen3-TTS-12Hz-1.7B-Base --local-dir ./Qwen3-TTS-12Hz-1.7B-Base
|
||||
```
|
||||
|
||||
可选的 0.6B 模型(更小、更快):
|
||||
```bash
|
||||
hf download Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice --local-dir ./Qwen3-TTS-12Hz-0.6B-CustomVoice
|
||||
hf download Qwen/Qwen3-TTS-12Hz-0.6B-Base --local-dir ./Qwen3-TTS-12Hz-0.6B-Base
|
||||
```
|
||||
|
||||
**IndexTTS2 模型(可选,用于情感控制语音克隆)**
|
||||
|
||||
IndexTTS2 是可选功能。如需使用,在同一 `Qwen/` 目录下运行:
|
||||
|
||||
```bash
|
||||
# 仅下载所需文件,无需下载完整仓库
|
||||
hf download IndexTeam/IndexTTS-2 \
|
||||
bpe.model config.yaml feat1.pt feat2.pt gpt.pth s2mel.pth wav2vec2bert_stats.pt \
|
||||
--local-dir ./IndexTTS2
|
||||
```
|
||||
|
||||
然后安装 indextts 包:
|
||||
```bash
|
||||
git clone https://github.com/iszhanjiawei/indexTTS2.git
|
||||
cd indexTTS2
|
||||
pip install -e . --no-deps
|
||||
cd ..
|
||||
```
|
||||
|
||||
**最终目录结构:**
|
||||
|
||||
Docker 部署(`docker/models/`):
|
||||
```
|
||||
Qwen3-TTS-webUI/
|
||||
└── docker/
|
||||
└── models/
|
||||
├── Qwen3-TTS-Tokenizer-12Hz/
|
||||
├── Qwen3-TTS-12Hz-1.7B-CustomVoice/
|
||||
├── Qwen3-TTS-12Hz-1.7B-VoiceDesign/
|
||||
└── Qwen3-TTS-12Hz-1.7B-Base/
|
||||
```
|
||||
|
||||
本地部署(`qwen3-tts-backend/Qwen/`):
|
||||
```
|
||||
Qwen3-TTS-webUI/
|
||||
└── qwen3-tts-backend/
|
||||
└── Qwen/
|
||||
├── Qwen3-TTS-Tokenizer-12Hz/
|
||||
├── Qwen3-TTS-12Hz-1.7B-CustomVoice/
|
||||
├── Qwen3-TTS-12Hz-1.7B-VoiceDesign/
|
||||
├── Qwen3-TTS-12Hz-1.7B-Base/
|
||||
└── IndexTTS2/ ← 可选,用于 IndexTTS2 功能
|
||||
├── bpe.model
|
||||
├── config.yaml
|
||||
├── feat1.pt
|
||||
├── feat2.pt
|
||||
├── gpt.pth
|
||||
├── s2mel.pth
|
||||
└── wav2vec2bert_stats.pt
|
||||
```
|
||||
|
||||
### 3. 后端配置
|
||||
|
||||
```bash
|
||||
cd qwen3-tts-backend
|
||||
|
||||
# 创建虚拟环境
|
||||
python -m venv venv
|
||||
source venv/bin/activate # Windows: venv\Scripts\activate
|
||||
|
||||
# 安装依赖
|
||||
pip install -r requirements.txt
|
||||
|
||||
# 安装 Qwen3-TTS
|
||||
pip install qwen-tts
|
||||
|
||||
# 创建配置文件
|
||||
cp .env.example .env
|
||||
|
||||
# 编辑配置文件
|
||||
# 本地模型:设置 MODEL_BASE_PATH=./Qwen
|
||||
# 仅阿里云 API:设置 DEFAULT_BACKEND=aliyun
|
||||
nano .env # 或使用其他编辑器
|
||||
```
|
||||
|
||||
**重要的后端配置** (`.env` 文件):
|
||||
```env
|
||||
MODEL_DEVICE=cuda:0 # 使用 GPU(或 cpu 使用 CPU)
|
||||
MODEL_BASE_PATH=./Qwen # 已下载模型的路径
|
||||
DEFAULT_BACKEND=local # 使用本地模型用 'local',API 用 'aliyun'
|
||||
DATABASE_URL=sqlite:///./qwen_tts.db
|
||||
SECRET_KEY=your-secret-key-here # 请修改此项!
|
||||
```
|
||||
|
||||
启动后端服务:
|
||||
```bash
|
||||
# 使用 uvicorn 直接启动
|
||||
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
|
||||
|
||||
# 或使用 conda(如果你喜欢)
|
||||
conda run -n qwen3-tts uvicorn main:app --host 0.0.0.0 --port 8000 --reload
|
||||
```
|
||||
|
||||
验证后端是否运行:
|
||||
```bash
|
||||
curl http://127.0.0.1:8000/health
|
||||
```
|
||||
|
||||
### 4. 前端配置
|
||||
|
||||
```bash
|
||||
cd qwen3-tts-frontend
|
||||
|
||||
# 安装依赖
|
||||
npm install
|
||||
|
||||
# 创建配置文件
|
||||
cp .env.example .env
|
||||
|
||||
# 启动开发服务器
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### 5. 访问应用
|
||||
|
||||
在浏览器中打开:`http://localhost:5173`
|
||||
|
||||
**默认账号**:
|
||||
- 用户名:`admin`
|
||||
- 密码:`admin123456`
|
||||
- **重要**: 登录后请立即修改密码!
|
||||
|
||||
### 生产环境部署
|
||||
|
||||
用于生产环境:
|
||||
|
||||
```bash
|
||||
# 后端:使用 gunicorn 或类似的 WSGI 服务器
|
||||
cd qwen3-tts-backend
|
||||
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000
|
||||
|
||||
# 前端:构建静态文件
|
||||
cd qwen3-tts-frontend
|
||||
npm run build
|
||||
# 使用 nginx 或其他 Web 服务器提供 'dist' 文件夹
|
||||
```
|
||||
|
||||
## 配置
|
||||
|
||||
### 后端配置
|
||||
|
||||
后端 `.env` 关键配置:
|
||||
|
||||
```env
|
||||
SECRET_KEY=your-secret-key
|
||||
MODEL_DEVICE=cuda:0
|
||||
MODEL_BASE_PATH=../Qwen
|
||||
DATABASE_URL=sqlite:///./qwen_tts.db
|
||||
|
||||
DEFAULT_BACKEND=local
|
||||
|
||||
ALIYUN_REGION=beijing
|
||||
ALIYUN_MODEL_FLASH=qwen3-tts-flash-realtime
|
||||
ALIYUN_MODEL_VC=qwen3-tts-vc-realtime-2026-01-15
|
||||
ALIYUN_MODEL_VD=qwen3-tts-vd-realtime-2026-01-15
|
||||
```
|
||||
|
||||
**后端选项:**
|
||||
|
||||
- `DEFAULT_BACKEND`: 默认 TTS 后端,可选值:`local` 或 `aliyun`
|
||||
- **本地模式**: 使用本地 Qwen3-TTS 模型(需要配置 `MODEL_BASE_PATH`)
|
||||
- **阿里云模式**: 使用阿里云 TTS API(需要用户在设置页面配置 API 密钥)
|
||||
|
||||
**阿里云配置:**
|
||||
|
||||
- 用户需要在 Web 界面的设置页面添加阿里云 API 密钥
|
||||
- API 密钥经过加密后安全存储在数据库中
|
||||
- 超级管理员可以控制是否为所有用户启用本地模型
|
||||
- 获取阿里云 API 密钥,请访问 [阿里云控制台](https://dashscope.console.aliyun.com/)
|
||||
|
||||
## 使用说明
|
||||
|
||||
### 切换后端
|
||||
|
||||
1. 登录 Web 界面
|
||||
2. 进入设置页面
|
||||
3. 配置您偏好的后端:
|
||||
- **本地模型**:选择"本地模型"(需要超级管理员启用本地模型)
|
||||
- **阿里云 API**:选择"阿里云"并添加您的 API 密钥
|
||||
4. 选择的后端将默认用于所有 TTS 操作
|
||||
5. 也可以通过 API 的 `backend` 参数为单次请求指定不同的后端
|
||||
|
||||
### 管理阿里云 API 密钥
|
||||
|
||||
1. 在设置页面找到"阿里云 API 密钥"部分
|
||||
2. 输入您的阿里云 API 密钥
|
||||
3. 点击"更新密钥"保存并验证
|
||||
4. 系统会在保存前验证密钥的有效性
|
||||
5. 可随时使用删除按钮删除密钥
|
||||
|
||||
## 特别鸣谢
|
||||
|
||||
本项目基于阿里云 Qwen 团队开源的 [Qwen3-TTS](https://github.com/QwenLM/Qwen3-TTS) 官方仓库构建。特别感谢 Qwen 团队开源如此强大的文本转语音模型。
|
||||
|
||||
## 许可证
|
||||
|
||||
Apache-2.0 license
|
||||
@@ -1,4 +1,4 @@
|
||||
upstream qwen_tts_backend {
|
||||
upstream canto_backend {
|
||||
server 127.0.0.1:8000;
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ server {
|
||||
proxy_send_timeout 300s;
|
||||
|
||||
location / {
|
||||
proxy_pass http://qwen_tts_backend;
|
||||
proxy_pass http://canto_backend;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
@@ -34,20 +34,20 @@ server {
|
||||
}
|
||||
|
||||
location /outputs/ {
|
||||
alias /opt/qwen3-tts-backend/outputs/;
|
||||
alias /opt/canto-backend/outputs/;
|
||||
autoindex off;
|
||||
add_header Cache-Control "public, max-age=3600";
|
||||
add_header Content-Disposition "attachment";
|
||||
}
|
||||
|
||||
location /health {
|
||||
proxy_pass http://qwen_tts_backend/health;
|
||||
proxy_pass http://canto_backend/health;
|
||||
proxy_set_header Host $host;
|
||||
access_log off;
|
||||
}
|
||||
|
||||
location /metrics {
|
||||
proxy_pass http://qwen_tts_backend/metrics;
|
||||
proxy_pass http://canto_backend/metrics;
|
||||
proxy_set_header Host $host;
|
||||
allow 127.0.0.1;
|
||||
deny all;
|
||||
@@ -1,15 +1,15 @@
|
||||
[Unit]
|
||||
Description=Qwen3-TTS Backend API Service
|
||||
Description=Canto Backend API Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=qwen-tts
|
||||
Group=qwen-tts
|
||||
WorkingDirectory=/opt/qwen3-tts-backend
|
||||
Environment="PATH=/opt/conda/envs/qwen3-tts/bin:/usr/local/bin:/usr/bin:/bin"
|
||||
EnvironmentFile=/opt/qwen3-tts-backend/.env
|
||||
ExecStart=/opt/conda/envs/qwen3-tts/bin/python main.py
|
||||
WorkingDirectory=/opt/canto-backend
|
||||
Environment="PATH=/opt/conda/envs/canto/bin:/usr/local/bin:/usr/bin:/bin"
|
||||
EnvironmentFile=/opt/canto-backend/.env
|
||||
ExecStart=/opt/conda/envs/canto/bin/python main.py
|
||||
Restart=on-failure
|
||||
RestartSec=10s
|
||||
StandardOutput=append:/var/log/qwen-tts/app.log
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user