BLOG

README

2026/05/03 14 min read BLOG 视频自动化 README

视频自动化:花生 AI 功能反向分析与实现拆解

基于公开页面、公开前端 bundle、浏览器网络请求与可见 UI 行为整理。未绕过登录、未访问私有后端源码,涉及服务端内部算法的部分均标注为“推断实现”。

1. 产品定位

花生 AI 是一个“文稿/口播输入 -> 自动生成视频项目 -> AI 辅助剪辑与素材匹配 -> 导出成片”的视频创作智能体。

它的核心能力不是单一 TTS 或播放器,而是一条视频自动化生产链:

  1. 输入文稿或上传口播音频/文稿文件。
  2. 自动拆解文稿为分镜/段落/字幕。
  3. 自动匹配公开视频素材、模板素材或用户本地素材。
  4. 自动生成项目方案、分镜规划和初版视频。
  5. 在项目编辑器中通过 AI Agent 或手动操作继续微调。
  6. 完成配音、字幕、素材替换、重排、导出等流程。

2. 已观测到的技术栈

前端

  • Next.js App Router + React。
  • Ant Design、部分 MUI、Tailwind 风格 utility class、CSS Modules。
  • MobX 状态管理。
  • 静态资源由 s1.hdslb.com/bfs/static/innovideo/... 承载。
  • 图片、视频、图标等资源由 i0/i1/i2.hdslb.com 承载。

登录与安全

  • 登录态通过 Bilibili/花生账号体系判断。
  • 登录接口观测:https://api.huasheng.cn/x/web-interface/nav
  • 未登录时项目详情、VIP 信息等接口返回 401-101
  • POST 请求会自动追加 csrf,来源是 cookie 中的 bili_jct
  • 页面加载 Bilibili Gaia/minntaki 相关安全 SDK/WASM。

埋点与实验

  • 错误监控和埋点:biliMirrorreporter-pb
  • 埋点上报:https://data.huasheng.cn/v2/log/web
  • A/B 实验变量包括:
    • agent_page
    • front_montage
    • montage_composite
    • podcast_mtq
    • local_recall

3. 页面与接口入口

用户给定页面

https://www.huasheng.cn/videov2/89228750983169

该页面会请求:

GET /api/innovideo/project/info?pid=89228750983169

未登录观测响应:

{"code":401,"reason":"账号未登录","message":"账号未登录","metadata":{}}

因此未登录状态下页面最终落到首页创作台。

公开配置接口

GET /api/innovideo/config

观测到的关键配置:

  • script_max: 10000
  • audio_script_max: 50000
  • user_material_max: 200
  • tts_speed_switch: true
  • 默认文稿、默认音色、音色列表、举报标签、模型配置等。

首页创作相关入口

/project/create
/podcast/project/create
/api/huasheng/project/create?csrf=...

创建成功后根据项目类型跳转:

/video/{pid}
/videov2/{pid}
/podcast/{pid}
/podcastv2/{pid}

4. 全功能清单

首页创作台

  • 文稿输入。
  • 文稿字数限制。
  • 上传口播音频。
  • 上传文稿文件。
  • 选择画面形式。
  • 选择口播配音。
  • 创建项目。
  • 展示花生介绍视频。
  • 展示灵感发现视频列表。
  • 返回旧版。
  • 联系客服。
  • 隐私政策、服务协议、备案信息。

项目创建

  • 普通视频项目。
  • videov2 新版视频项目。
  • 播客项目。
  • podcastv2 新版播客项目。
  • 示例项目创建。
  • 服务协议确认。
  • 安全风控提示。
  • VIP/套餐权限拦截。
  • 本地素材召回项目标记。

AI Agent 编辑

观测到的 Agent 能力文案和接口表明其支持:

  • 载入项目工程。
  • 获取项目信息。
  • 规划项目方案。
  • 解析视频脚本。
  • 生成分镜规划表。
  • 搜索视频素材。
  • 联网检索创作素材。
  • 检索匹配素材。
  • 匹配分镜字幕。
  • 更新任务清单。
  • 更新视频分镜。
  • 编排新增分镜。
  • 修改分镜字幕。
  • 重排分镜顺序。
  • 移除分镜片段。
  • 重配当前分镜画面。
  • 执行子任务。
  • 取消会话。
  • 加载聊天历史。

相关接口:

/api/huasheng/chat/run
/api/huasheng/chat/events
/api/huasheng/chat/history
/api/huasheng/chat/cancel
/api/huasheng/chat/state
/api/huasheng/chat/answers
/api/huasheng/chat/tool-cost
/api/huasheng/chat/running/effects

SSE 事件流:

//sse.huasheng.cn/api/huasheng/chat/events

TTS 与口播配音

  • 公共音色列表。
  • 口播音色选择。
  • 语速开关。
  • 创建 TTS 任务。
  • 轮询 TTS 结果。
  • 自动播放生成音频。
  • 失败提示和重试。

相关接口:

/material/tts/list
/tts/task
/tts/task/result
/voice/save

音色克隆

  • 10 秒快速克隆。
  • 上传本人录音克隆。
  • 上传身份核实音频。
  • 实名认证拦截。
  • 朗读文案一致性校验。
  • 音色保存。
  • 音色重命名。
  • 音色删除。
  • 音色模型更换。
  • 旧音色升级提示。

相关接口:

/voice/quick/clone/task/v2
/voice/quick/clone/task/result/v2
/voice/clone/prerecorded/task/v2
/voice/clone/prerecorded/task/result/v2
/voice/clone/list
/voice/clone/save
/voice/clone/rename
/voice/clone/delete
/voice/clone/change/engine
/voice/clone/identity
/voice/clone/text

会员、积分、支付

  • VIP 信息。
  • 会员权益。
  • 套餐面板。
  • 充值下单。
  • 订单状态。
  • 开通记录。
  • 订阅记录。
  • 取消订阅。
  • 积分面板。
  • 积分记录。

相关接口:

/api/vip/info
/api/vip/recharge/panel
/api/vip/recharge/pre/order
/api/vip/recharge/order/status
/api/vip/recharge/record
/api/vip/subscribe/record
/api/vip/subscribe/rescind
/api/point/panel
/api/point/record
/api/point/batches

5. 自动分段:需要关注哪些信息

自动分段是整个系统的第一层结构化能力。它决定后面的素材匹配、字幕生成、镜头节奏和手动微调体验。

5.1 输入来源

花生支持至少三类输入:

  1. 直接输入/粘贴视频文稿。
  2. 上传口播音频。
  3. 上传文稿文件,例如 docx

上传控件观测到的 accept 类型包括:

audio/mpeg
audio/wav
audio/vnd.wav
audio/flac
audio/x-flac
audio/mp4
audio/m4a
audio/x-m4a
video/mp4
application/vnd.openxmlformats-officedocument.wordprocessingml.document

5.2 分段目标

自动分段不只是把文本按句号切开,而是要生成“可剪辑单元”:

  • 段落。
  • 分镜。
  • 字幕片段。
  • 口播音频片段。
  • 素材匹配 query。
  • 每段建议时长。
  • 每段画面风格或镜头意图。

5.3 可复刻的数据结构

type ScriptSegment = {
  id: string;
  index: number;
  text: string;
  summary: string;
  keywords: string[];
  visualQuery: string[];
  startTime?: number;
  endTime?: number;
  duration?: number;
  speaker?: string;
  emotion?: string;
  sceneType?: "fact" | "story" | "transition" | "quote" | "conclusion";
  status: "draft" | "matched" | "edited" | "rendering" | "done" | "failed";
};

5.4 推断实现流程

  1. 文稿清洗:去除空行、特殊符号、无意义停顿词。
  2. 语义分段:按主题变化、句群、转折词、时间线、因果结构切分。
  3. 字幕分句:把长段拆成适合展示的字幕句。
  4. 时长估算:按字数、语速、音频识别结果估计每段时间。
  5. 生成视觉 query:为每个段落提取素材检索词。
  6. 生成分镜规划:输出镜头顺序、画面建议、字幕和配音映射。

5.5 口播音频分段

如果输入是音频,自动分段还需要:

  • ASR 转写。
  • 句级时间戳。
  • 静音检测。
  • 换气声/停顿保留。
  • 字幕对齐。
  • 音频片段切分。

页面文案提示音频要求:

  • 音频环境要安静。
  • 音量大小保持一致。
  • 不要重复拼接同一段音频。
  • 支持口播音频文件上传。

5.6 分段质量评估

一个好的自动分段应该满足:

  • 每段语义完整。
  • 字幕长度适合阅读。
  • 时长接近实际口播节奏。
  • 每段都能生成明确的素材搜索意图。
  • 段落边界方便用户手动调整。
  • 分段失败时可回退到原文或重新生成。

6. 自动匹配素材:需要关注哪些信息

自动匹配素材是花生最关键的自动化能力之一。它同时包含服务端素材检索和浏览器本地素材召回。

6.1 素材来源

从页面和 bundle 推断,素材至少来自三类:

  1. 平台运营/推荐素材。
  2. 联网检索或 B 站公开视频素材。
  3. 用户本地关联文件夹中的素材。

首页“灵感发现”视频列表来自:

https://api.huasheng.cn/x/activity_components/eva_operation/list?source_id=29ERAmwloghvktd00&pn=1&ps=50

6.2 画面形式

首页可见“画面”选择:

  • 视频素材。
  • 音画模板。

这说明匹配素材时存在两套策略:

  1. 以真实视频片段填充画面。
  2. 以音频模板/视觉模板生成音画组合。

6.3 匹配对象

自动匹配不是匹配整篇文稿,而是匹配每个分镜或字幕段:

type MaterialMatchRequest = {
  segmentId: string;
  text: string;
  keywords: string[];
  visualQuery: string[];
  desiredDuration: number;
  aspectRatio: "16:9" | "9:16" | "1:1";
  style?: string;
  avoid?: string[];
  source: "platform" | "web" | "local";
};

6.4 匹配结果结构

type MaterialCandidate = {
  id: string;
  source: "platform" | "web" | "local";
  title?: string;
  filePath?: string;
  url?: string;
  cover?: string;
  startTime: number;
  endTime: number;
  duration: number;
  score: number;
  reason?: string;
  tags?: string[];
  copyright?: "unknown" | "allowed" | "restricted";
};

6.5 本地素材召回证据

公开 bundle 中能看到明显的本地召回服务:

  • LocalRecallService
  • Phase1_Query
  • Phase2_Package
  • Phase3_Upload
  • TextSearchService
  • searchByText
  • meta.json
  • local_recall_result_{taskId}.zip

本地召回流程:

  1. 用户关联本地文件夹。
  2. 浏览器读取并索引本地视频素材。
  3. 下载/加载本地 AI 模型。
  4. 用文本 query 搜索视频片段。
  5. 召回结果按 filePath + startTime + endTime 去重。
  6. 生成关键帧 jpg。
  7. 打包 meta.json + jpg 成 zip。
  8. 上传 zip 到 UPOS。
  9. 后端把召回结果绑定到项目分镜。

6.6 本地模型

观测到模型资源:

https://boss.hdslb.com/webcut/models/clip/vit-b-16.img.fp32.onnx
https://boss.hdslb.com/webcut/models/clip/vit-b-16.txt.fp32.onnx
https://boss.hdslb.com/webcut/models/clip/vocab.txt
https://boss.hdslb.com/webcut/resources/onnxruntime-web@1.23.2/

这说明本地素材匹配很可能使用 CLIP 类图文向量检索:

  • 图像模型:提取视频关键帧 embedding。
  • 文本模型:提取分镜 query embedding。
  • 相似度检索:返回最相关视频片段。

6.7 自动匹配流程复刻

文稿分段
  -> 为每段生成素材 query
  -> 搜索平台素材/联网素材/本地素材
  -> 获取候选片段
  -> 按相关性、清晰度、时长、版权、水印、黑边等打分
  -> 给每个分镜选择 Top 1
  -> 保留 Top N 作为手动替换候选
  -> 写入项目时间线

6.8 素材质量过滤

配置接口中举报标签暴露了素材质量维度,可作为过滤规则:

  • 敏感人物或物品。
  • 违法违规。
  • 色情低俗。
  • 引人不适。
  • 侵权。
  • 重复出现。
  • 素材画风突兀。
  • 不相关。
  • 不清晰。
  • 有水印或字幕。
  • 黑边。
  • 其他。

这些标签说明素材匹配后有质量反馈闭环,适合做:

  • 自动降权。
  • 用户反馈训练。
  • 二次推荐。
  • 黑名单过滤。

7. 手动微调:需要关注哪些信息

手动微调是自动生成后的关键体验。自动化系统必须允许用户快速纠错,而不是只给一个不可编辑的视频。

7.1 可微调对象

应支持至少这些编辑对象:

  • 分镜顺序。
  • 分镜字幕。
  • 每段素材。
  • 素材裁剪起止时间。
  • 口播配音音色。
  • TTS 语速。
  • 音频模板。
  • 画面模板。
  • 分镜新增/删除。
  • 本地素材替换。
  • AI 重新匹配。

bundle 文案中观测到的相关能力:

  • 修改分镜字幕
  • 重排分镜顺序
  • 移除分镜片段
  • 请重配当前分镜的画面
  • 搜索分镜
  • 搜索分镜(输入描述关键词,按回车搜索)
  • 已匹配我的素材
  • 已搜索视频素材
  • 目标分镜正在合成中,请稍后再试

7.2 手动微调的数据模型

type TimelineScene = {
  id: string;
  order: number;
  subtitle: string;
  voiceText: string;
  material: MaterialCandidate | null;
  alternatives: MaterialCandidate[];
  startTime: number;
  endTime: number;
  locked: boolean;
  renderState: "idle" | "rendering" | "done" | "failed";
};

7.3 微调交互建议

适合实现的交互:

  • 点击分镜,右侧显示字幕、素材、音频、模板。
  • 字幕可直接编辑。
  • 素材可一键“重配”。
  • 素材可搜索替换。
  • 保留候选素材列表。
  • 分镜可拖拽排序。
  • 分镜可锁定,避免 AI 后续改动。
  • 支持撤销/重做。
  • 支持保存点/版本点。
  • 支持“只重配当前分镜”,避免全局重生成。

7.4 撤销重做与保存点

观测到项目版本相关接口:

/api/huasheng/project/checkpoint/list
/api/huasheng/project/checkpoint/undo_redo
/api/huasheng/project/savepoint/list
/api/huasheng/project/savepoint/apply
/api/huasheng/project/savepoint/undo_redo

这说明手动微调不是直接覆盖项目,而是有操作历史或保存点机制。

可复刻方案:

type ProjectOperation = {
  id: string;
  type:
    | "segment.updateText"
    | "segment.replaceMaterial"
    | "segment.reorder"
    | "segment.remove"
    | "segment.add"
    | "voice.change"
    | "template.change";
  payload: unknown;
  inversePatch: unknown;
  createdAt: number;
};

8. 推荐实现架构

前端模块

apps/web
  /create             首页创作台
  /video/[pid]        视频编辑器
  /podcast/[pid]      播客编辑器
  /components
  /stores             MobX/Zustand 状态
  /services
    project.ts
    agent.ts
    tts.ts
    voiceClone.ts
    material.ts
    upload.ts
    localRecall.ts

后端服务

services
  auth-service
  project-service
  script-segmentation-service
  material-search-service
  tts-service
  voice-clone-service
  agent-service
  billing-service
  upload-service

核心流程

CreateProject
  -> NormalizeInput
  -> SegmentScript
  -> GenerateStoryboard
  -> MatchMaterials
  -> GenerateVoice
  -> BuildTimeline
  -> SaveProject
  -> OpenEditor

Agent 流程

POST /chat/run
  -> 创建 run
  -> SSE /chat/events 推送执行状态
  -> 工具调用修改项目
  -> 用户确认或继续追问
  -> 写入 checkpoint/savepoint

9. 最小可行复刻版本

如果要做一个简化版,建议优先实现:

  1. 文稿输入。
  2. LLM 自动分段。
  3. 每段生成素材 query。
  4. 从本地素材库或公开视频 API 搜索候选素材。
  5. 自动选 Top 1 生成时间线。
  6. 用户可编辑字幕、替换素材、重排分镜。
  7. TTS 生成配音。
  8. FFmpeg 合成视频。
  9. 操作历史支持撤销/重做。

可以先不做:

  • 会员支付。
  • 音色克隆。
  • 浏览器端 ONNX 本地召回。
  • 复杂 Agent 工具链。
  • 多人播客。
  • 大规模素材质量反馈系统。

10. 风险与边界

  • 服务端具体模型、排序规则、版权策略不可从公开前端完全确认。
  • 未登录状态无法验证完整项目编辑器界面和导出流程。
  • 自动素材匹配涉及版权、肖像权、水印、平台授权,需要在自研实现中单独设计合规策略。
  • 本地文件夹召回依赖浏览器 File System Access、OPFS、ONNX Runtime,兼容性和性能都需要实测。

11. 证据索引

观测页面:

https://www.huasheng.cn/videov2/89228750983169

关键公开接口:

GET https://www.huasheng.cn/api/innovideo/config
GET https://www.huasheng.cn/api/innovideo/project/info?pid=89228750983169
GET https://api.huasheng.cn/x/web-interface/nav
GET https://api.huasheng.cn/x/activity_components/eva_operation/list?source_id=29ERAmwloghvktd00&pn=1&ps=50

关键前端 bundle 证据:

/_next/static/chunks/app/video/page-*.js
/_next/static/chunks/app/page-*.js
/_next/static/chunks/app/layout-*.js

关键功能字符串:

规划项目方案
解析视频脚本
生成分镜规划表
搜索视频素材
检索匹配素材
匹配分镜字幕
修改分镜字幕
重排分镜顺序
移除分镜片段
本地模型未启用,无法选择参与匹配成片
下载本地AI模型,并启用素材智能解析