73 lines
5.0 KiB
Markdown
73 lines
5.0 KiB
Markdown
# 改动记录(CHANGELOG)
|
||
|
||
本文件按时间**倒序**记录每次改动的**位置**与**内容**,中文注释,便于后续接手的同学快速定位。
|
||
|
||
---
|
||
|
||
## 2026-09-18:TTS 页面调整 + 真人声音配音模式 + 推送凭据修复
|
||
|
||
**分支**:`feat/chip-resources`
|
||
**最新提交**:`74110fb`(已推送)
|
||
**线上状态**:已发布到 `www.kaotings.com`,服务器 `45.197.145.138` 上的 release 为 `~/releases/74110fb-www`(systemd 服务 `kaotings-web`,Caddy 反代 `127.0.0.1:3000`)
|
||
|
||
### 1. 删除「减负区」标题与说明文字(提交 `b4c3a99`)
|
||
|
||
- **文件**:`app/tts/page.tsx`
|
||
- **位置**:原输入卡片下方独立区块的头部
|
||
- **删除内容**:`03 / Assist`、`减负区`、`把识别、校对和分段交给系统,客户只需要确认内容和听结果。`
|
||
- **连带处理**:移除该区块上已失效的 `aria-labelledby="assist-title"`(全站无其它引用)
|
||
|
||
### 2. 三个功能卡移到「音色清单」文字下方(提交 `d79c6cb`、`12eef4b`)
|
||
|
||
- **文件**:`app/tts/page.tsx`(现约 576–582 行)
|
||
- **改动**:把「图片转文字 / 生成前查错字 / 自动分段」三张 `assist-card` 从页面底部独立区块移入「01 / Input 输入文本」卡片内部,放在 `音色清单已更新 · N 个音色` 这行文字**下方**,用 `md:grid-cols-3` 三列对齐
|
||
- **功能保全**:隐藏的图片选择 `input`(`fileInputRef`)与 OCR 提示 `helperMessage` 一并迁入,行为不变
|
||
- **删除**:原底部独立区块(移走卡片后只剩「少打字 · 少校对 · 少返工」徽标,已随区块删除)
|
||
- **说明**:`d79c6cb` 先放到编辑器下方,`12eef4b` 按反馈修正到「音色清单」下方,最终位置以后者为准
|
||
|
||
### 3. 新增「真人声音配音模式」(提交 `14bc759`)
|
||
|
||
**前端 `app/tts/page.tsx`**
|
||
|
||
- 新增状态:`myVoice`(声音样本 `{ name, dataUrl }`)、`recording`(是否正在录音)
|
||
- 新增 ref:`recorderRef`(MediaRecorder 实例)、`voiceFileRef`(音频文件选择)
|
||
- 新增函数(约 405–470 行):
|
||
- `startRecording()`:`navigator.mediaDevices.getUserMedia` + `MediaRecorder` 录音,停止后转成 data URL 存入 `myVoice`
|
||
- `stopRecording()`:停止录音
|
||
- `handleVoiceFile()`:上传音频文件(类型校验 + 8 MB 上限)
|
||
- `clearMyVoice()`:清除样本,回到内置音色
|
||
- `createSpeech()` 改为**双通道**:有 `myVoice` → 调 `/tts-clone`;否则走原 `/tts/v1/audio/speech`
|
||
- 面板 JSX(约 584–600 行):位于三张功能卡下方,包含 `🎙 真人声音配音模式` 标题、使用说明、`● 录制我的声音 / ■ 停止录音`、`上传声音`、`清除样本`、样本试听条与「已就绪」状态
|
||
|
||
**服务端 `app/tts-clone/route.ts`(新增文件)**
|
||
|
||
- `POST /tts-clone`,入参 `{ text, reference_audio(data URL), response_format, speed }`
|
||
- 读取服务端环境变量 `TTS_CLONE_URL` 转发给克隆引擎;**未配置时返回 501**(前端提示「真人配音引擎尚未接通,请先选择内置音色」,不假装成功);上游失败返回 502
|
||
- **路径选择原因**:线上 Caddy 中 `/api/*` 转发到 FastAPI(:8000)、`/tts/*` 转发到 TTS 引擎,只有 `/tts-clone` 这类路径会落到 Next.js
|
||
|
||
**样式 `app/globals.css`**
|
||
|
||
- 新增 `.voice-clone-panel`(380 行)与 `.voice-clone-panel.is-ready`(388 行):青色描边面板,样本就绪后高亮
|
||
|
||
**本地联调 `services/mock-tts/server.mjs`**
|
||
|
||
- 新增 `POST /v1/audio/clone-speech`(174 行):校验文本与 `reference_audio` 后返回演示音频
|
||
- 配合**未提交**的 `.env.local` 中 `TTS_CLONE_URL=http://127.0.0.1:8100/v1/audio/clone-speech`,本地可跑通「录音/上传 → 生成」全流程
|
||
|
||
**待后续程序员跟进**
|
||
|
||
- 实测上游 TTS 引擎(`qwen3-tts`,129 个固定音色)**目前没有声音克隆接口**:无音色注册端点,未知参数会被静默忽略
|
||
- 引擎方提供克隆接口后,只需在服务器为 `kaotings-web` 增加环境变量 `TTS_CLONE_URL`(指向克隆接口)即可启用,**前端零改动**
|
||
|
||
### 4. 推送凭据问题修复(提交 `438a4d7`、`cee2074`)
|
||
|
||
- **文件**:`docs/OPERATIONS.md` §8
|
||
- **内容**:Gitea 的 OAuth access token 仅 1 小时有效,而 Git Credential Manager 无法感知过期 → 闲置超 1 小时后**第一次推送必失败**(`remote: Verify` / `Authentication failed`)
|
||
- **修复**:新增凭据助手 `C:/Users/kts/.git-credential-kaotings.mjs`,每次用 refresh token 换新 access token;全局配置中按「空值重置 + 助手 + manager」排序(详见该章节)
|
||
|
||
### 5. 本地配置纳入版本管理(提交 `74110fb`)
|
||
|
||
- `next.config.ts`:新增 `rewrites()`,**仅当**设置了 `TTS_MOCK_UPSTREAM` 时把 `/tts/v1/*` 代理到本地 mock TTS(生产不设置该变量,行为不变)
|
||
- `AGENTS.md` / `CLAUDE.md`:Next.js 16 `next dev` 自动生成的 AI 说明文件
|
||
- `next-env.d.ts`:自动生成文件,保持生产路径(`.next/types/...`),未提交 dev 路径的临时改动
|