* feat(editor): 剪辑成片验收闭环 - 概览渲染成功计数、媒体导入/字幕/预览修复与本地 whisper 转写运行时 - 概览:渲染成功计数接入项目概览 SQL/JSON,成片状态随 timeline_render 任务联动 - 修复:本地媒体导入后列表为空(挂载时服务端重同步 + 导入后校验重取)、 字幕工具残留 M6 占位文案、预览监视器悬浮遮挡层改为顶部信息条、 生成任务轮询连续查询失败即抛错不再空转至超时 - 本地转写:新增 scripts/start-whisper-local.sh 一键启动 whisper.cpp, local-development 文档补安装/启动/后端注入指引 - 同步 docs(overview/features、pending-test、index) * fix(assets): 素材库封面未知 kind 兜底,避免 AssetCover 渲染崩溃 运行时素材记录若带未知/脏 kind(历史遗留或本地存储异常),assetKindIcons[asset.kind] 得到 undefined,AssetCover/AssetDrawer 渲染 <KindIcon/> 触发 'Element type is invalid ... got: undefined' 使 /assets 整页崩溃。 新增 isKnownAssetKind 守卫:未知 kind 回退 FileText 图标与通用文案,脏数据不再崩页。 * fix(editor): mp4v 播放死循环修复——MPEG-4 Part 2 归入播放转码通道,监视器加终态护栏 - 后端把 mp4v 与 H.264/AV1/VP9 一并判为浏览器可播 → playbackStatus=none; Chromium/Firefox/Edge 实际均不支持 MPEG-4 Part 2,原件解码即失败。 现将其并入 H.265 转码通道(转 H.264 兼容副本);损坏文件转码失败落 failed,前端据此显示终止性错误而非死循环。 - 前端监视器轮询到 none/failed 或超时后不再回退 primary 重试;副本 URL 回退原件反复触发 onError 时保持终态文案,不再覆盖成"正在生成兼容版本"。 * feat(editor): 画布产物自动同步剪辑素材库,素材面板新增「画布素材」分组 - 打开剪辑器时自动把画布工作台当前采用(storyboard/action_board/分镜/导出成片, ready 且有资源)的产物 linkProjectAsset(source=canvas) 并入项目素材库; 后端幂等、前端按 storageKey+会话 ref 去重,失败静默下次进入自动补同步。 - LinkProjectAsset 支持 source 白名单(uploaded/canvas)并写入素材 payload, 供素材面板按来源分组;面板新增「画布素材」页签与分组,与「本地上传」「项目素材」并列。 - 补 source=canvas 写入断言测试。 * docs(progress): 记录 mp4v 播放死循环修复与画布产物素材同步的待浏览器验收项
118 lines
3.7 KiB
Plaintext
118 lines
3.7 KiB
Plaintext
---
|
||
title: 本地开发
|
||
description: 在宿主机启动影策前后端开发服务
|
||
---
|
||
|
||
# 本地开发
|
||
|
||
## 一键启动(Windows PowerShell)
|
||
|
||
在仓库根目录执行:
|
||
|
||
```powershell
|
||
.\scripts\start-local.ps1
|
||
```
|
||
|
||
脚本会:
|
||
|
||
- 使用 `.local/project-workbench-debug` 作为后端 SQLite 开发数据目录;
|
||
- 创建 `.local/cache/go-build` 和 `.local/cache/go-mod` 缓存目录;
|
||
- 首次启动时,如果 `web/node_modules` 不存在,执行 `bun install --frozen-lockfile`;
|
||
- 打开两个 PowerShell 窗口,分别运行后端和前端;
|
||
- 将前端 `/api` 请求代理到 `http://127.0.0.1:8080`。
|
||
|
||
启动后访问 <http://localhost:3000>。后端健康检查地址是 <http://127.0.0.1:8080/api/health>。
|
||
|
||
脚本使用固定的本地开发端口:前端 `3000`,后端 `8080`。如果端口被占用,脚本会先退出,不会关闭已有进程。请分别在两个开发窗口中按 `Ctrl+C` 停止服务。
|
||
|
||
如果 PowerShell 的执行策略阻止脚本运行,可以只对当前进程临时放行:
|
||
|
||
```powershell
|
||
Set-ExecutionPolicy -Scope Process Bypass
|
||
.\scripts\start-local.ps1
|
||
```
|
||
|
||
## 手工启动
|
||
|
||
后端:
|
||
|
||
```bash
|
||
mkdir -p .local/project-workbench-debug .local/cache/go-build .local/cache/go-mod
|
||
cd backend
|
||
CANVAS_BACKEND_ADDR=127.0.0.1:8080 \
|
||
CANVAS_BACKEND_DATA_DIR=../.local/project-workbench-debug \
|
||
GOCACHE=../.local/cache/go-build \
|
||
GOMODCACHE=../.local/cache/go-mod \
|
||
go run ./cmd/server
|
||
```
|
||
|
||
前端另开终端:
|
||
|
||
```bash
|
||
cd web
|
||
bun install
|
||
bun run dev
|
||
```
|
||
|
||
前端默认监听 `0.0.0.0:3000`,Vite 将 `/api` 和 OAuth 回调代理到 `127.0.0.1:8080`。如需修改代理目标,可设置 `VITE_API_PROXY_TARGET`。
|
||
|
||
## 时间线字幕转写(whisper.cpp)
|
||
|
||
时间线“字幕转写”由**本地 whisper.cpp server** 执行:后端将片段音频预处理为 16k mono wav 后,POST 到 `CANVAS_WHISPER_BASE_URL/inference`(whisper server 原生接口,`response_format=verbose_json`)。未配置该地址时,转写任务会立即明确失败,提示“撰写失败未配置本地转写服务”。
|
||
|
||
### 安装 whisper-server
|
||
|
||
```bash
|
||
brew install whisper-cpp
|
||
```
|
||
|
||
### 下载模型
|
||
|
||
仓库脚本将模型放在 `.local/whisper-models/`(已被 `.gitignore` 忽略)。多语言模型(含中文)用 `ggml-base.bin`(约 141MB);网络受限时可用 aifasthub 镜像:
|
||
|
||
```bash
|
||
mkdir -p .local/whisper-models
|
||
curl -fL -o .local/whisper-models/ggml-base.bin \
|
||
https://aifasthub.com/ggerganov/whisper.cpp/resolve/main/ggml-base.bin
|
||
```
|
||
|
||
### 启动服务
|
||
|
||
```bash
|
||
scripts/start-whisper-local.sh
|
||
```
|
||
|
||
脚本默认以 `ggml-base.bin` 监听 `127.0.0.1:8082`(`-l auto` 自动识别语言)。需要换模型或端口时:`WHISPER_MODEL=ggml-small.bin WHISPER_PORT=8083 scripts/start-whisper-local.sh`。
|
||
|
||
### 让后端指向该服务
|
||
|
||
后端不读取 `.env` 文件,环境变量必须由启动 shell 注入(在手工启动命令基础上追加):
|
||
|
||
```bash
|
||
cd backend
|
||
CANVAS_BACKEND_DATA_DIR=../.local/project-workbench-debug \
|
||
CANVAS_WHISPER_BASE_URL=http://127.0.0.1:8082 \
|
||
go run ./cmd/server
|
||
```
|
||
|
||
### 验证
|
||
|
||
```bash
|
||
# 服务就绪:返回 200/404 即可
|
||
curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8082/
|
||
# 冒烟:20 秒语音 → verbose_json 字幕段
|
||
curl -s -X POST http://127.0.0.1:8082/inference \
|
||
-F 'file=@sample.wav' -F 'response_format=verbose_json'
|
||
```
|
||
|
||
## Docker 开发
|
||
|
||
需要容器化热更新时,在仓库根目录执行:
|
||
|
||
```bash
|
||
LOCAL_UID=$(id -u) LOCAL_GID=$(id -g) \
|
||
docker compose -f docker-compose.dev.yml up --build
|
||
```
|
||
|
||
Docker 开发编排也使用 `.local/project-workbench-debug`,并默认暴露前端 `3000` 和后端 `8080`。端口冲突时,可通过 `CANVAS_WEB_HOST_PORT` 和 `CANVAS_BACKEND_HOST_PORT` 调整宿主机端口。
|