Move reverse proxy docs to PWA_NPS.md for NPS setup; remove bundled nginx config.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -140,50 +140,26 @@ SKIP_PYTORCH=1 bash deploy.sh deps
|
||||
|
||||
下载过程中出现 `Retrying... Read timed out` 属于正常重试,**并非卡死**,请耐心等待 10-30 分钟。
|
||||
|
||||
### 0.7 PWA 安装 App 与 HTTPS 反向代理
|
||||
### 0.7 PWA 安装 App(需 HTTPS)
|
||||
|
||||
| 访问方式 | 浏览器行为 |
|
||||
|----------|------------|
|
||||
| `http://IP:5683` | 只能「快捷方式 / 添加到主屏幕」,**不能**系统级一键安装 |
|
||||
| `https://IP` 或 `https://域名` | Chrome/Edge 可弹出 **「安装 Trading Studio」**,独立窗口运行 |
|
||||
| `http://内网IP:5683` | 只能「快捷方式 / 添加到主屏幕」 |
|
||||
| `https://域名`(经云服务器反代) | Chrome/Edge 可 **「安装 Trading Studio」** |
|
||||
|
||||
**原因:** PWA 规范要求 **HTTPS 安全上下文**(`localhost` 除外)。局域网直连 HTTP 是正常现象,不是代码 bug。
|
||||
内网 HTTP 直连无法一键安装 App,这是浏览器 PWA 安全策略,不是程序缺陷。
|
||||
|
||||
#### 推荐方案:Nginx + 自签证书(纯局域网)
|
||||
**反向代理不在本仓库代码中配置。** 若你使用 **云服务器 + NPS 内网穿透**(或其它反代方案),请阅读独立教程:
|
||||
|
||||
```bash
|
||||
cd /opt/Trading_Studio
|
||||
bash server-update.sh # 或 git pull
|
||||
👉 **[PWA_NPS.md](./PWA_NPS.md)** — 云服务器 HTTPS 反代 + NPS 穿透到 `5683` 的完整步骤
|
||||
|
||||
# 1. 安装 Nginx
|
||||
sudo apt install -y nginx
|
||||
要点摘要:
|
||||
|
||||
# 2. 生成自签 SSL(替换为你的服务器局域网 IP)
|
||||
sudo bash scripts/gen_ssl_cert.sh 192.168.8.100
|
||||
|
||||
# 3. 启用站点配置
|
||||
sudo cp nginx/trading_studio.conf /etc/nginx/sites-available/trading_studio.conf
|
||||
sudo ln -sf /etc/nginx/sites-available/trading_studio.conf /etc/nginx/sites-enabled/
|
||||
sudo nginx -t && sudo systemctl reload nginx
|
||||
|
||||
# 4. 确保 Gradio 仍由 PM2 监听 127.0.0.1:5683(仅本机),外网只走 443
|
||||
pm2 restart trading_studio
|
||||
```
|
||||
|
||||
**访问:** `https://192.168.8.100`(首次需在手机/平板点「高级 → 继续访问」信任证书)
|
||||
|
||||
**安装 App:**
|
||||
- 电脑 Chrome:地址栏出现 ⊕ 安装图标,或点页面「安装 App」按钮
|
||||
- 安卓 Chrome:菜单 → 安装应用
|
||||
- iPad/iPhone Safari:分享 → 添加到主屏幕(iOS 无系统安装弹窗,但 HTTPS 下体验更完整)
|
||||
|
||||
#### 有公网域名时
|
||||
|
||||
在 Nginx 前加 [Let's Encrypt](https://letsencrypt.org/) 免费证书(`certbot`),可免信任自签证书步骤。
|
||||
|
||||
#### 无反向代理时的替代
|
||||
|
||||
HTTP 下点击「安装 App」会显示手动引导;桌面快捷方式仍可用,功能不受影响。
|
||||
1. 内网物理机 PM2 监听 `5683` 即可
|
||||
2. NPS 将 `127.0.0.1:5683` 穿透到云服务器
|
||||
3. 云服务器用已有 Nginx/面板配置 **HTTPS 域名** 反代到 NPS 端口
|
||||
4. 反代须透传 **WebSocket**(Gradio 必需)
|
||||
5. 用户通过 `https://你的域名` 访问后再安装 App
|
||||
|
||||
---
|
||||
|
||||
|
||||
+187
@@ -0,0 +1,187 @@
|
||||
# PWA 安装 App 教程 — 云服务器反代 + NPS 内网穿透
|
||||
|
||||
Trading Studio 的 Gradio 服务跑在**内网物理机** `0.0.0.0:5683`。
|
||||
要通过浏览器 **「安装 App」**(而非仅快捷方式),用户访问的地址必须是 **HTTPS**。
|
||||
|
||||
本教程面向:**云服务器做 HTTPS 反向代理 + NPS 穿透到内网 3060Ti 机器** 的架构。
|
||||
**不在 Trading Studio 代码仓库内捆绑任何 Nginx/Caddy 配置文件**,反代在你自己的云服务器 / NPS 面板中完成。
|
||||
|
||||
---
|
||||
|
||||
## 一、为什么 HTTP 只能快捷方式?
|
||||
|
||||
| 访问地址 | 安装表现 |
|
||||
|----------|----------|
|
||||
| `http://内网IP:5683` | 仅「添加快捷方式 / 创建快捷方式」 |
|
||||
| `https://你的域名`(经云服务器) | Chrome/Edge 可 **「安装 Trading Studio」** |
|
||||
|
||||
PWA 要求 **安全上下文(HTTPS)**。内网直连 HTTP 是浏览器限制,与项目代码无关。
|
||||
|
||||
---
|
||||
|
||||
## 二、推荐架构
|
||||
|
||||
```
|
||||
手机 / 平板 / 电脑
|
||||
│
|
||||
▼ https://studio.example.com (云服务器:SSL 证书 + 反代)
|
||||
│
|
||||
云服务器 Nginx / Caddy / 面板反代
|
||||
│
|
||||
▼ NPS 隧道(TCP 或 HTTP 代理)
|
||||
│
|
||||
内网 3060Ti 物理机
|
||||
PM2 → Gradio 0.0.0.0:5683
|
||||
```
|
||||
|
||||
要点:
|
||||
|
||||
1. **内网机**:只跑 `pm2`,监听 `5683`,无需在云服务器上装 PyTorch。
|
||||
2. **NPS**:把内网 `5683` 映射到云服务器某一端口,或做 HTTP 域名转发。
|
||||
3. **云服务器**:对外提供 **HTTPS 域名**,反代到 NPS 暴露的地址。
|
||||
4. **用户永远用 HTTPS 域名访问**,不要用 `http://IP:5683` 装 App。
|
||||
|
||||
---
|
||||
|
||||
## 三、内网物理机(Trading Studio)
|
||||
|
||||
确保服务正常:
|
||||
|
||||
```bash
|
||||
cd /opt/Trading_Studio
|
||||
pm2 status
|
||||
# 应看到 trading_studio 运行中,监听 5683
|
||||
|
||||
curl -I http://127.0.0.1:5683
|
||||
```
|
||||
|
||||
`config.py` 中保持:
|
||||
|
||||
```python
|
||||
HOST = "0.0.0.0"
|
||||
PORT = 5683
|
||||
```
|
||||
|
||||
Ollama 等仍走局域网 `.env` 配置,与穿透无关。
|
||||
|
||||
---
|
||||
|
||||
## 四、NPS 客户端配置(内网机)
|
||||
|
||||
在 NPS **客户端**(npc)新增隧道,将本机 Gradio 暴露给服务端。常见两种方式:
|
||||
|
||||
### 方式 A:TCP 隧道(简单)
|
||||
|
||||
| 配置项 | 示例值 |
|
||||
|--------|--------|
|
||||
| 类型 | TCP |
|
||||
| 内网目标 | `127.0.0.1:5683` |
|
||||
| 服务端端口 | 如 `25683`(云服务器上监听) |
|
||||
|
||||
云服务器反代目标:`http://127.0.0.1:25683`
|
||||
|
||||
### 方式 B:HTTP 代理 / 域名模式(推荐,若 NPS 面板支持)
|
||||
|
||||
| 配置项 | 示例值 |
|
||||
|--------|--------|
|
||||
| 类型 | HTTP 代理 |
|
||||
| 内网目标 | `127.0.0.1:5683` |
|
||||
| 自定义域名 | `studio.example.com`(需在云解析到云服务器 IP) |
|
||||
|
||||
此时 HTTPS 可在 NPS 服务端或上层 Nginx 终止,按你现有 NPS 面板习惯配置即可。
|
||||
|
||||
> 不同 NPS 版本面板字段名略有差异,核心都是:**外网请求 → NPS → 内网 5683**。
|
||||
|
||||
---
|
||||
|
||||
## 五、云服务器 HTTPS 反向代理
|
||||
|
||||
在**云服务器**(已安装 SSL 证书)上配置反代。以下为**示例**,请按你现有环境(宝塔 / 1Panel / 手写 Nginx)调整,**勿复制到 Trading Studio 仓库**。
|
||||
|
||||
### Nginx 示例(仅文档参考)
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name studio.example.com;
|
||||
|
||||
ssl_certificate /path/to/fullchain.pem;
|
||||
ssl_certificate_key /path/to/privkey.pem;
|
||||
|
||||
client_max_body_size 200M;
|
||||
|
||||
location / {
|
||||
# TCP 隧道时指向 NPS 映射端口;HTTP 模式时指向 NPS 提供的 upstream
|
||||
proxy_pass http://127.0.0.1:25683;
|
||||
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
proxy_read_timeout 86400s;
|
||||
proxy_send_timeout 86400s;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Gradio 必须开启 WebSocket 透传**(`Upgrade` / `Connection` 头),否则页面能开但交互/上传会失败。
|
||||
|
||||
### 证书
|
||||
|
||||
- 有域名:Let's Encrypt / 云厂商免费证书均可。
|
||||
- 仅 IP:部分浏览器 PWA 安装仍要求可信证书,**强烈建议绑定域名**。
|
||||
|
||||
---
|
||||
|
||||
## 六、验证穿透与 HTTPS
|
||||
|
||||
1. 内网机:`curl http://127.0.0.1:5683` 返回 200
|
||||
2. 云服务器:`curl http://127.0.0.1:25683`(NPS 映射端口)正常
|
||||
3. 外网浏览器:`https://studio.example.com` 能打开 Trading Studio
|
||||
4. 地址栏为 **🔒 安全**(非「不安全」)
|
||||
|
||||
---
|
||||
|
||||
## 七、安装 App(各端)
|
||||
|
||||
配置好 HTTPS 域名后:
|
||||
|
||||
| 设备 | 操作 |
|
||||
|------|------|
|
||||
| Windows Chrome / Edge | 地址栏 **⊕ 安装**,或点击页面 **「安装 App」** |
|
||||
| 安卓 Chrome | 菜单 → **安装应用** |
|
||||
| iPad / iPhone Safari | 分享 → **添加到主屏幕**(iOS 无 Chrome 式安装弹窗,但 HTTPS 下可全屏独立运行) |
|
||||
|
||||
若仍只能快捷方式,检查:
|
||||
|
||||
- [ ] 是否仍用 `http://` 或内网 IP 访问
|
||||
- [ ] 证书是否有效、是否混合内容报错
|
||||
- [ ] NPS / 反代是否透传 WebSocket
|
||||
- [ ] 浏览器 DevTools → Application → Manifest 是否加载成功
|
||||
|
||||
---
|
||||
|
||||
## 八、安全建议
|
||||
|
||||
1. **不要**将 `5683` 直接端口映射到公网而不加鉴权;至少使用 HTTPS + 强密码或 IP 白名单。
|
||||
2. NPS 服务端与客户端使用强密钥,定期更换。
|
||||
3. 云服务器防火墙仅开放 443 / NPS 必要端口。
|
||||
4. Trading Studio 处理交易录音,建议域名 + HTTPS + 访问控制。
|
||||
|
||||
---
|
||||
|
||||
## 九、HTTP 内网直连(不装 App)
|
||||
|
||||
局域网内 `http://192.168.x.x:5683` 可正常使用全部功能,仅 **PWA 安装** 受限。
|
||||
点击页面「安装 App」会提示需 HTTPS;功能不受影响。
|
||||
|
||||
---
|
||||
|
||||
## 相关文档
|
||||
|
||||
- 内网部署:`DEPLOY.md`
|
||||
- 服务器更新:`bash server-update.sh`
|
||||
@@ -1,219 +1,220 @@
|
||||
# Trading Studio
|
||||
|
||||
**本地量化交易复盘 → B 站长视频配音生产流水线**
|
||||
|
||||
Trading Studio 是一套运行在 Ubuntu 物理服务器(RTX 3060 Ti)上的自动化配音系统,专为数字资产量化交易员设计。通过「盲录碎碎念 → 本地 GPU 识别 → 局域网大模型严厉润色 → 本地 GPU 声音克隆」的闭环,高效产出 B 站反思类长视频配音,辅助交易纪律的自我进化。
|
||||
|
||||
**Git 仓库:** https://git.bz121.com/dekun/Trading_Studio.git
|
||||
|
||||
---
|
||||
|
||||
## 系统定位
|
||||
|
||||
| 环节 | 技术栈 | 运行位置 |
|
||||
|------|--------|----------|
|
||||
| 碎碎念录音转写 | Faster-Whisper (CUDA float16) | 本地 3060 Ti |
|
||||
| 纪律审判式润色 | Gemma4 Abliterated @ Ollama | 局域网 `192.168.8.64` |
|
||||
| 固定音色配音 | ChatTTS (CUDA) | 本地 3060 Ti |
|
||||
| Web 中控 | Gradio | 端口 **5683** |
|
||||
|
||||
---
|
||||
|
||||
## 架构说明
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Gradio 中控 (app.py:5683) │
|
||||
├──────────────┬──────────────────────┬───────────────────────┤
|
||||
│ 音色锁定 │ 音频识别 │ 润色 + 合成 │
|
||||
│ tts_service │ whisper_service │ llm_service │
|
||||
│ │ │ tts_service │
|
||||
└──────┬───────┴──────────┬───────────┴──────────┬────────────┘
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
speaker_emb.pt Faster-Whisper Ollama HTTP
|
||||
(本地持久化) CUDA / small 192.168.8.64:11434
|
||||
gemma-4-abliterated
|
||||
```
|
||||
|
||||
### 模块解耦
|
||||
|
||||
| 文件 | 职责 |
|
||||
|------|------|
|
||||
| `config.py` | Ollama 地址、模型名、Prompt、路径等全局配置 |
|
||||
| `whisper_service.py` | Faster-Whisper CUDA 转写 |
|
||||
| `llm_service.py` | 远程 Ollama HTTP 非流式润色 |
|
||||
| `tts_service.py` | ChatTTS 音色提取与 wav 合成 |
|
||||
| `app.py` | Gradio 前端与流程编排 |
|
||||
|
||||
---
|
||||
|
||||
## 快速开始
|
||||
|
||||
> 完整环境配置请参阅 [DEPLOY.md](./DEPLOY.md)
|
||||
|
||||
### 一键部署(生产环境推荐)
|
||||
|
||||
以 **root** 用户部署到 `/opt/Trading_Studio` 并由 PM2 常驻:
|
||||
|
||||
```bash
|
||||
sudo -i
|
||||
git clone https://git.bz121.com/dekun/Trading_Studio.git /opt/Trading_Studio
|
||||
cd /opt/Trading_Studio
|
||||
chmod +x deploy.sh
|
||||
bash deploy.sh
|
||||
```
|
||||
|
||||
浏览器访问:`http://<服务器IP>:5683`
|
||||
|
||||
日常更新:
|
||||
|
||||
```bash
|
||||
cd /opt/Trading_Studio && bash deploy.sh update
|
||||
```
|
||||
|
||||
### 手动部署(开发调试)
|
||||
|
||||
```bash
|
||||
git clone https://git.bz121.com/dekun/Trading_Studio.git /opt/Trading_Studio
|
||||
cd /opt/Trading_Studio
|
||||
python3 -m venv venv
|
||||
source venv/bin/activate
|
||||
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
|
||||
pip install -r requirements.txt
|
||||
python app.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 使用流程
|
||||
|
||||
### 首次使用:锁定音色
|
||||
|
||||
1. 进入 **「音色锁定」** 标签页
|
||||
2. 上传 10-30 秒干净人声参考(你的碎碎念盲录样本)
|
||||
3. (可选)填写参考音频的精确转写,提升 zero-shot 还原度
|
||||
4. 点击 **锁定音色** → 生成 `speaker_emb.pt`
|
||||
|
||||
### 日常生产
|
||||
|
||||
**方式 A — 分步操作:**
|
||||
|
||||
1. **音频极速识别**:上传复盘录音 → Whisper 转写
|
||||
2. **Gemma4 纪律审判**:一键润色,生成逻辑清晰、语气严厉的反思稿
|
||||
3. **ChatTTS 合成**:输出 24kHz `.wav` 成品配音
|
||||
|
||||
**方式 B — 一键生产:**
|
||||
|
||||
上传录音后点击 **启动全流程**,系统自动串联三步。
|
||||
|
||||
---
|
||||
|
||||
## 核心配置(config.py)
|
||||
|
||||
| 配置项 | 默认值 |
|
||||
|--------|--------|
|
||||
| 中控端口 | `5683`(`0.0.0.0` 局域网可访问) |
|
||||
| Ollama 地址 | `http://192.168.8.64:11434` |
|
||||
| 模型名称 | `huihui_ai/gemma-4-abliterated:e4b` |
|
||||
| Whisper 模型 | `small` / CUDA / float16 |
|
||||
| 音色文件 | `speaker_emb.pt` |
|
||||
| 音频输出 | `outputs/` 目录 |
|
||||
|
||||
---
|
||||
|
||||
## PM2 守护运行
|
||||
|
||||
标准路径 `/opt/Trading_Studio`,root 用户:
|
||||
|
||||
```bash
|
||||
# 一键部署 + PM2 启动(推荐)
|
||||
cd /opt/Trading_Studio && bash deploy.sh
|
||||
|
||||
# 或手动 PM2
|
||||
pm2 start ecosystem.config.js
|
||||
|
||||
# 常用管理
|
||||
pm2 status
|
||||
pm2 logs trading_studio
|
||||
bash deploy.sh restart # 重启
|
||||
bash deploy.sh update # 拉代码 + 更新依赖 + 重启
|
||||
pm2 save && pm2 startup # 开机自启(deploy.sh 已自动配置)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## .gitignore 配置
|
||||
|
||||
提交 Git 时请确保忽略以下产物(已在 `.gitignore` 中预设):
|
||||
|
||||
```gitignore
|
||||
venv/
|
||||
*.wav
|
||||
*.pt
|
||||
*.log
|
||||
uploads/
|
||||
outputs/
|
||||
```
|
||||
|
||||
**说明:**
|
||||
|
||||
- `venv/` — Python 虚拟环境,每台机器独立创建
|
||||
- `*.wav` — 录音与合成音频,体积大且含隐私
|
||||
- `*.pt` — ChatTTS 音色 Embedding 与模型权重
|
||||
- `*.log` — 运行日志
|
||||
|
||||
---
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
Trading_Studio/
|
||||
├── deploy.sh # 一键部署脚本(/opt + PM2)
|
||||
├── app.py # Gradio 主入口
|
||||
├── config.py # 全局配置
|
||||
├── whisper_service.py # Whisper CUDA 识别
|
||||
├── llm_service.py # Ollama 远程润色
|
||||
├── tts_service.py # ChatTTS 音色与合成
|
||||
├── ecosystem.config.js # PM2 守护配置
|
||||
├── requirements.txt # Python 依赖
|
||||
├── README.md # 本文件
|
||||
├── DEPLOY.md # 部署指南(含一键部署教程)
|
||||
├── .gitignore
|
||||
├── speaker_emb.pt # 音色文件(运行时生成,不入库)
|
||||
├── uploads/ # 上传临时目录
|
||||
└── outputs/ # 合成 wav 输出
|
||||
```
|
||||
|
||||
**生产标准路径:** `/opt/Trading_Studio`
|
||||
|
||||
---
|
||||
|
||||
## 硬件要求
|
||||
|
||||
- **GPU:** NVIDIA RTX 3060 Ti(8GB 显存,建议锁定 120W 功耗墙)
|
||||
- **系统:** Ubuntu 22.04 / 24.04 LTS
|
||||
- **CUDA:** 12.1+(与 PyTorch cu121 匹配)
|
||||
- **局域网:** 可访问 `192.168.8.64:11434` 的 Ollama 节点
|
||||
|
||||
---
|
||||
|
||||
## 常见问题
|
||||
|
||||
**Q: Whisper 报 CUDA 错误?**
|
||||
A: 确认 `nvidia-smi` 正常,且未同时运行其他占显存任务。Whisper 使用 `float16` 已针对 8GB 优化。
|
||||
|
||||
**Q: Ollama 连接失败?**
|
||||
A: 在服务器上执行 `curl http://192.168.8.64:11434/api/tags` 验证连通性,确认模型已 `ollama pull`。
|
||||
|
||||
**Q: TTS 音色不稳定?**
|
||||
A: 重新锁定音色,填写参考音频精确转写,并保持 `temperature=0.3` 低随机性。
|
||||
|
||||
**Q: 合成音频为空或噪声?**
|
||||
A: 检查润色文本长度(过短可能导致异常),确认 `speaker_emb.pt` 存在且有效。
|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
Private — 仅供个人量化交易复盘使用。
|
||||
# Trading Studio
|
||||
|
||||
**本地量化交易复盘 → B 站长视频配音生产流水线**
|
||||
|
||||
Trading Studio 是一套运行在 Ubuntu 物理服务器(RTX 3060 Ti)上的自动化配音系统,专为数字资产量化交易员设计。通过「盲录碎碎念 → 本地 GPU 识别 → 局域网大模型严厉润色 → 本地 GPU 声音克隆」的闭环,高效产出 B 站反思类长视频配音,辅助交易纪律的自我进化。
|
||||
|
||||
**Git 仓库:** https://git.bz121.com/dekun/Trading_Studio.git
|
||||
|
||||
---
|
||||
|
||||
## 系统定位
|
||||
|
||||
| 环节 | 技术栈 | 运行位置 |
|
||||
|------|--------|----------|
|
||||
| 碎碎念录音转写 | Faster-Whisper (CUDA float16) | 本地 3060 Ti |
|
||||
| 纪律审判式润色 | Gemma4 Abliterated @ Ollama | 局域网 `192.168.8.64` |
|
||||
| 固定音色配音 | ChatTTS (CUDA) | 本地 3060 Ti |
|
||||
| Web 中控 | Gradio | 端口 **5683** |
|
||||
|
||||
---
|
||||
|
||||
## 架构说明
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Gradio 中控 (app.py:5683) │
|
||||
├──────────────┬──────────────────────┬───────────────────────┤
|
||||
│ 音色锁定 │ 音频识别 │ 润色 + 合成 │
|
||||
│ tts_service │ whisper_service │ llm_service │
|
||||
│ │ │ tts_service │
|
||||
└──────┬───────┴──────────┬───────────┴──────────┬────────────┘
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
speaker_emb.pt Faster-Whisper Ollama HTTP
|
||||
(本地持久化) CUDA / small 192.168.8.64:11434
|
||||
gemma-4-abliterated
|
||||
```
|
||||
|
||||
### 模块解耦
|
||||
|
||||
| 文件 | 职责 |
|
||||
|------|------|
|
||||
| `config.py` | Ollama 地址、模型名、Prompt、路径等全局配置 |
|
||||
| `whisper_service.py` | Faster-Whisper CUDA 转写 |
|
||||
| `llm_service.py` | 远程 Ollama HTTP 非流式润色 |
|
||||
| `tts_service.py` | ChatTTS 音色提取与 wav 合成 |
|
||||
| `app.py` | Gradio 前端与流程编排 |
|
||||
|
||||
---
|
||||
|
||||
## 快速开始
|
||||
|
||||
> 完整环境配置请参阅 [DEPLOY.md](./DEPLOY.md)
|
||||
|
||||
### 一键部署(生产环境推荐)
|
||||
|
||||
以 **root** 用户部署到 `/opt/Trading_Studio` 并由 PM2 常驻:
|
||||
|
||||
```bash
|
||||
sudo -i
|
||||
git clone https://git.bz121.com/dekun/Trading_Studio.git /opt/Trading_Studio
|
||||
cd /opt/Trading_Studio
|
||||
chmod +x deploy.sh
|
||||
bash deploy.sh
|
||||
```
|
||||
|
||||
浏览器访问:`http://<服务器IP>:5683`
|
||||
|
||||
日常更新:
|
||||
|
||||
```bash
|
||||
cd /opt/Trading_Studio && bash deploy.sh update
|
||||
```
|
||||
|
||||
### 手动部署(开发调试)
|
||||
|
||||
```bash
|
||||
git clone https://git.bz121.com/dekun/Trading_Studio.git /opt/Trading_Studio
|
||||
cd /opt/Trading_Studio
|
||||
python3 -m venv venv
|
||||
source venv/bin/activate
|
||||
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
|
||||
pip install -r requirements.txt
|
||||
python app.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 使用流程
|
||||
|
||||
### 首次使用:锁定音色
|
||||
|
||||
1. 进入 **「音色锁定」** 标签页
|
||||
2. 上传 10-30 秒干净人声参考(你的碎碎念盲录样本)
|
||||
3. (可选)填写参考音频的精确转写,提升 zero-shot 还原度
|
||||
4. 点击 **锁定音色** → 生成 `speaker_emb.pt`
|
||||
|
||||
### 日常生产
|
||||
|
||||
**方式 A — 分步操作:**
|
||||
|
||||
1. **音频极速识别**:上传复盘录音 → Whisper 转写
|
||||
2. **Gemma4 纪律审判**:一键润色,生成逻辑清晰、语气严厉的反思稿
|
||||
3. **ChatTTS 合成**:输出 24kHz `.wav` 成品配音
|
||||
|
||||
**方式 B — 一键生产:**
|
||||
|
||||
上传录音后点击 **启动全流程**,系统自动串联三步。
|
||||
|
||||
---
|
||||
|
||||
## 核心配置(config.py)
|
||||
|
||||
| 配置项 | 默认值 |
|
||||
|--------|--------|
|
||||
| 中控端口 | `5683`(`0.0.0.0` 局域网可访问) |
|
||||
| Ollama 地址 | `http://192.168.8.64:11434` |
|
||||
| 模型名称 | `huihui_ai/gemma-4-abliterated:e4b` |
|
||||
| Whisper 模型 | `small` / CUDA / float16 |
|
||||
| 音色文件 | `speaker_emb.pt` |
|
||||
| 音频输出 | `outputs/` 目录 |
|
||||
|
||||
---
|
||||
|
||||
## PM2 守护运行
|
||||
|
||||
标准路径 `/opt/Trading_Studio`,root 用户:
|
||||
|
||||
```bash
|
||||
# 一键部署 + PM2 启动(推荐)
|
||||
cd /opt/Trading_Studio && bash deploy.sh
|
||||
|
||||
# 或手动 PM2
|
||||
pm2 start ecosystem.config.js
|
||||
|
||||
# 常用管理
|
||||
pm2 status
|
||||
pm2 logs trading_studio
|
||||
bash deploy.sh restart # 重启
|
||||
bash deploy.sh update # 拉代码 + 更新依赖 + 重启
|
||||
pm2 save && pm2 startup # 开机自启(deploy.sh 已自动配置)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## .gitignore 配置
|
||||
|
||||
提交 Git 时请确保忽略以下产物(已在 `.gitignore` 中预设):
|
||||
|
||||
```gitignore
|
||||
venv/
|
||||
*.wav
|
||||
*.pt
|
||||
*.log
|
||||
uploads/
|
||||
outputs/
|
||||
```
|
||||
|
||||
**说明:**
|
||||
|
||||
- `venv/` — Python 虚拟环境,每台机器独立创建
|
||||
- `*.wav` — 录音与合成音频,体积大且含隐私
|
||||
- `*.pt` — ChatTTS 音色 Embedding 与模型权重
|
||||
- `*.log` — 运行日志
|
||||
|
||||
---
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
Trading_Studio/
|
||||
├── deploy.sh # 一键部署脚本(/opt + PM2)
|
||||
├── app.py # Gradio 主入口
|
||||
├── config.py # 全局配置
|
||||
├── whisper_service.py # Whisper CUDA 识别
|
||||
├── llm_service.py # Ollama 远程润色
|
||||
├── tts_service.py # ChatTTS 音色与合成
|
||||
├── ecosystem.config.js # PM2 守护配置
|
||||
├── requirements.txt # Python 依赖
|
||||
├── README.md # 本文件
|
||||
├── DEPLOY.md # 部署指南(含一键部署教程)
|
||||
├── PWA_NPS.md # 云服务器反代 + NPS 穿透 + PWA 安装教程
|
||||
├── .gitignore
|
||||
├── speaker_emb.pt # 音色文件(运行时生成,不入库)
|
||||
├── uploads/ # 上传临时目录
|
||||
└── outputs/ # 合成 wav 输出
|
||||
```
|
||||
|
||||
**生产标准路径:** `/opt/Trading_Studio`
|
||||
|
||||
---
|
||||
|
||||
## 硬件要求
|
||||
|
||||
- **GPU:** NVIDIA RTX 3060 Ti(8GB 显存,建议锁定 120W 功耗墙)
|
||||
- **系统:** Ubuntu 22.04 / 24.04 LTS
|
||||
- **CUDA:** 12.1+(与 PyTorch cu121 匹配)
|
||||
- **局域网:** 可访问 `192.168.8.64:11434` 的 Ollama 节点
|
||||
|
||||
---
|
||||
|
||||
## 常见问题
|
||||
|
||||
**Q: Whisper 报 CUDA 错误?**
|
||||
A: 确认 `nvidia-smi` 正常,且未同时运行其他占显存任务。Whisper 使用 `float16` 已针对 8GB 优化。
|
||||
|
||||
**Q: Ollama 连接失败?**
|
||||
A: 在服务器上执行 `curl http://192.168.8.64:11434/api/tags` 验证连通性,确认模型已 `ollama pull`。
|
||||
|
||||
**Q: TTS 音色不稳定?**
|
||||
A: 重新锁定音色,填写参考音频精确转写,并保持 `temperature=0.3` 低随机性。
|
||||
|
||||
**Q: 合成音频为空或噪声?**
|
||||
A: 检查润色文本长度(过短可能导致异常),确认 `speaker_emb.pt` 存在且有效。
|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
Private — 仅供个人量化交易复盘使用。
|
||||
|
||||
@@ -239,7 +239,7 @@ PWA_HEAD = """
|
||||
function manualInstallGuide() {
|
||||
var httpWarn = "";
|
||||
if (!isSecure()) {
|
||||
httpWarn = "<div class='pwa-modal-warn'><strong>⚠️ 当前为 HTTP 访问</strong><br>浏览器只能创建<strong>快捷方式</strong>,无法弹出系统级「安装 App」。<br>要一键安装,请配置 <strong>HTTPS 反向代理</strong>(见服务器 DEPLOY.md)。</div>";
|
||||
httpWarn = "<div class='pwa-modal-warn'><strong>⚠️ 当前为 HTTP 访问</strong><br>浏览器只能创建<strong>快捷方式</strong>,无法弹出系统级「安装 App」。<br>请通过 <strong>HTTPS 域名</strong>(云服务器反代 + NPS 穿透)访问,详见 <strong>PWA_NPS.md</strong>。</div>";
|
||||
}
|
||||
var steps = isIOS()
|
||||
? "<ol><li>点击 Safari 底部分享按钮 <strong>□↑</strong></li><li>选择 <strong>「添加到主屏幕」</strong></li><li>点击 <strong>添加</strong></li></ol>"
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
# Trading Studio — Nginx HTTPS 反向代理
|
||||
# 将 https://你的域名或IP 转发到本机 Gradio 5683
|
||||
#
|
||||
# 安装步骤见 DEPLOY.md「PWA 安装与 HTTPS」
|
||||
|
||||
# HTTP 自动跳转 HTTPS(可选,不需要可删除此 server 块)
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name trading.local _;
|
||||
|
||||
return 301 https://$host$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
server_name trading.local _;
|
||||
|
||||
# 自签证书路径(先用 scripts/gen_ssl_cert.sh 生成)
|
||||
ssl_certificate /etc/nginx/ssl/trading_studio.crt;
|
||||
ssl_certificate_key /etc/nginx/ssl/trading_studio.key;
|
||||
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||
|
||||
client_max_body_size 200M;
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:5683;
|
||||
proxy_http_version 1.1;
|
||||
|
||||
# Gradio WebSocket 必需
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
proxy_read_timeout 86400s;
|
||||
proxy_send_timeout 86400s;
|
||||
}
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# 生成本地 HTTPS 自签证书(局域网 PWA 安装用)
|
||||
# 用法: sudo bash scripts/gen_ssl_cert.sh [服务器局域网IP]
|
||||
set -euo pipefail
|
||||
|
||||
SERVER_IP="${1:-}"
|
||||
SSL_DIR="/etc/nginx/ssl"
|
||||
KEY="${SSL_DIR}/trading_studio.key"
|
||||
CRT="${SSL_DIR}/trading_studio.crt"
|
||||
|
||||
if [[ "${EUID:-0}" -ne 0 ]]; then
|
||||
echo "请使用 root: sudo bash scripts/gen_ssl_cert.sh 192.168.x.x"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -z "${SERVER_IP}" ]]; then
|
||||
SERVER_IP=$(hostname -I | awk '{print $1}')
|
||||
echo "[INFO] 未指定 IP,使用: ${SERVER_IP}"
|
||||
fi
|
||||
|
||||
mkdir -p "${SSL_DIR}"
|
||||
|
||||
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
|
||||
-keyout "${KEY}" \
|
||||
-out "${CRT}" \
|
||||
-subj "/CN=TradingStudio/O=Trading/C=CN" \
|
||||
-addext "subjectAltName=IP:${SERVER_IP},DNS:trading.local,DNS:localhost"
|
||||
|
||||
chmod 600 "${KEY}"
|
||||
echo "[OK] 证书已生成:"
|
||||
echo " ${CRT}"
|
||||
echo " ${KEY}"
|
||||
echo ""
|
||||
echo "手机/平板首次访问 HTTPS 需点「继续访问」信任自签证书,之后即可安装 App。"
|
||||
Reference in New Issue
Block a user