本地录播分析
约 2601 字大约 9 分钟
本地录播导入复用现有的 ASR、音频特征、热点检测、LLM 分析、候选审核与切片流程。语音转写由设置中心选择的本地或远程引擎完成,转写后的文本整理、高光分析、整场总结及文案生成沿用已配置的 LLM 服务商、功能开关和预算;配置可指向本地或远程 LLM。导入不会启动直播监控,也不会自动渲染、审核或投稿。需要 FFmpeg;本地引擎及启用的本地回退还需准备相应 ASR 模型。远程引擎会把标准化音频上传至所配转写服务,详见使用指南。
页面入口
在工作台导航中点击「录播分析」,或打开 /imports。页面提供「语音转写设置」与「LLM 服务商」入口,沿用设置中心选择的主引擎、模型路径和设备,以及 LLM 配置;将 Whisper 选为主引擎时,不受「Whisper 兜底」开关影响。
- 一次选择一段或多段视频,可选多份配套 XML、JSON、SRT、ASS 文件。先查看文件配对预览;标题留空时使用文件名,多文件时填写的标题作为各段标题前缀。时间偏移应用到本批每段视频。
- 点击「上传并开始分析」,页面按文件名自然排序逐段上传原文件并提交分析,每次只上传一个文件。页面显示当前第几段、单文件百分比和已提交数量。上传失败或停止会保留当前标签页的队列,切换工作台页面不会丢失;点击「继续上传并分析」先核对服务端状态,再跳过已完成文件。
- 全部文件上传并提交后可以关闭页面。导入记录分别展示预处理状态、分段分析进度、转写记录数量和失败或语音证据不足的提示。自动重试期间不会显示为分析完成。
- 点击「查看热点时间线」或「查看转写」直接打开该场次。「全部任务与重试」进入全局任务页;模型缺失或识别失败时先修正模型设置,再重试或重新识别。
没有弹幕或初步未发现热点时,仍会进入完整转写。SRT、ASS 不替代模型识别。导入分段为 MKV,转写页展示真实源文件名;现有 TS 转 MP4 导出只对 TS 来源开放。
多文件配对
例如同时选择 直播01.mp4、直播02.mp4 和 直播01.xml、直播02.xml,页面会按去掉扩展名后的文件名配对;也支持 直播01.mp4.xml 这样的弹幕命名。匹配忽略大小写并统一 Unicode 组合形式,排序按数字顺序处理 2 与 10,不依赖选择器返回的顺序。
- 每个视频只配一份弹幕;没有弹幕的视频可正常导入。多余弹幕、同名视频、同一视频匹配多份弹幕均在上传前阻止提交并提示修正,不猜测配对或静默丢弃文件。
- 单独选择一个视频和一个弹幕时,保留手动配对,可使用不同文件名。继续已有导入记录时须选择其声明的同名文件。
- 每段视频建立独立场次和导入任务。按小时分段的文件逐段分析,不自动拼接成一个场次;每份弹幕的时间应相对于对应视频起点,统一偏移也分别应用,不累计前一段时长。
- 队列仅保存在当前页面。刷新或关闭前会提示未完成操作;已创建导入可从记录恢复,尚未创建的后续文件需要重新选择。文件上传中断后重新上传该文件,不提供文件内字节断点续传。
- 创建、上传或提交响应丢失后继续操作会复用原导入编号,避免重复场次;已上传文件不会重复发送,其他分段保持独立状态。
输入与预处理
- 视频支持 MP4、MKV、FLV、TS、MOV、WebM、M4V 容器,必须同时具有视频与音频流;单文件上限 50 GiB、时长上限 7 天。实际可用编解码器取决于 FFmpeg。
- 弹幕可不提供;支持 XML、JSON、SRT、ASS,单文件上限 32 MiB、最多 300000 条事件。支持 UTF-8(含 BOM)、带 BOM 的 UTF-16、GB18030。
- XML 使用 B 站常见的
<i><d p="1.25,1,25,16777215,0,0,user,1">文本</d></i>结构,第一项是视频相对秒数;禁止 DTD 和实体声明。 - JSON 接受事件数组,或以
comments、danmaku、body之一为键的事件数组对象。每条必须有且只有一个时间字段offset_s、time、from,以及一个文本字段text、content;可选user、to(结束时间)。数字时间单位为秒,也接受HH:MM:SS.mmm,不推断 Unix 时间戳或毫秒。 - SRT 按字幕开始时间产生一条文本事件。ASS 读取
[Events]中的Format和Dialogue;Text 必须在最后一列,保留正文逗号,移除样式、换行控制和纯矢量绘图。字幕只作为可选文本互动信号,不冒充 ASR 转写。
直播场次导出的 danmaku.jsonl 是原始消息档案,不是此处的媒体相对时间 JSON 输入。再次导入前,需要按对应录像起点和录制缺口将消息转换成上述相对秒数结构;不要仅把 .jsonl 改名为 .json。直播存档说明见使用指南。
JSON 示例:
{"comments":[{"offset_s":1.25,"text":"高能!","user":"观众甲"},{"offset_s":8,"text":"666"}]}统一预处理会验证结构与有限时间数值、清理显示标签及空白、稳定排序,保留同时间同文本的真实重复弹幕。可设置整体时间偏移,正数把事件向视频后方移动。空白、绘图及视频范围外的事件会报告忽略数量;所有非空事件都越界时拒绝导入,便于发现选错文件或时间基准。其他格式错误会中止导入,不发布部分分析任务。
视频按现有分段时长设置无重编码切段,真实切点受关键帧影响。分段和弹幕共用导入时刻作为显示时间原点,该时刻不代表原始开播时间;弹幕使用媒体相对时间,不扣直播接收延迟。没有弹幕文件时,该分析证据明确为不可用。
上传、恢复与存储
浏览器所选文件会复制到运行 BiliLiveCut 的机器上,用户原文件保持不变。大视频以流式方式写入暂存文件;文件完整上传后才能开始预处理。预处理探测媒体、解析弹幕并完成所有分段,然后以一个数据库事务登记来源、场次、弹幕及分析任务。导入过程中的失败或取消不会产生半份任务;失败可以通过后台作业重试。
导入编号保证同一导入重复启动或重试不产生重复场次。再次新建导入属于新的独立分析。上传中断可以重新上传未完成的文件,不支持断点续传;尚未登记场次的导入可以清理。后台硬中断会按现有作业机制重排,正常关服取消的作业需要手动重试。提交后的取消不撤销已登记场次,再次重试会返回同一场次。
预处理期间需要额外一份视频大小加 256 MiB 的空间。未发布的分段在失败或下次恢复时清理;成功登记后删除上传的视频副本,保留正式分段和弹幕输入。文件位于 storage/raw/imports/<导入编号>/,正式分段遵循原始媒体的保留与清理策略。
本地场次沿用当前数据库实体,不增加表列;以 LiveRoom.platform=local 标识来源,平台房号 LiveRoom.room_id 保持空值。Danmaku.room_id 对本地来源表示内部来源主键,分析关联始终以场次编号为准。
API
接口遵守现有管理员认证和同源保护。录播导入管理不开放给审核员。
POST /api/recording-imports:JSON 声明title、video_name、可选comments_name与offset_s,返回导入编号。可选request_id为 32 位小写十六进制随机标识;相同账号及相同声明的重试返回已有记录,冲突声明会被拒绝。网页自动携带该标识,避免创建响应丢失造成重复记录。PUT /api/recording-imports/{id}/files/video:请求体为原始视频二进制。若已声明弹幕,同样上传到/files/comments。不要使用 multipart 包装。POST /api/recording-imports/{id}/start:完整上传后创建持久预处理作业,返回job。GET /api/recording-imports:查询导入、预处理作业及analysis分段进度(total、done、failed、retrying、asr_unavailable、transcripts);作业取消、重试沿用/api/jobs/{job_id}/cancel、/retry。DELETE /api/recording-imports/{id}:清理未登记场次且无活动作业的导入。
预处理成功后 session_id 关联已有转写、时间轴、任务与审核接口。预处理完成不等于模型分析完成;后续分段任务独立报告状态。语音由所选 ASR 引擎处理,选择远程引擎时会上传标准化音频,转写文本及相关分析上下文可提交所配置的 LLM。整场总结读取全场最终转写生成,不以首段摘录代替分析。
LLM 未配置、调用失败或预算用尽时,转写保留原始 ASR 文本,热点及文案沿用现有回退;有转写的整场总结会按持久任务策略重试,耗尽后显示失败,可在配置服务商后重新生成。启用的评分插件遵循现有全局配置,新导入默认继承,不强制关闭。已有本地摘录摘要会自动失效并重新排队;已完成的热点可点击「按新阈值重分析」,重新调用 LLM 且保留人工审核、边界和成品,无需重新上传或转写。