字幕能力接入方案(火山引擎)
目标与策略
- 统一为分镜/音频生成精准字幕时间轴,服务前端合成与展示
- 优先策略:
- 自动字幕打轴(VC ATA):当段内存在文案(subtitleText/text/line)时,按文案精准对齐到音频
- 音视频字幕生成(VC):当段内不存在文案时,直接识别音频获得文本与时间轴
- 输出格式:
subtitle_segments: 数组片段{ text, start, duration }srt_text: 整片 SRT 文本
接入概览
- 环境变量(已配)
VOLC_TTS_APPIDVOLC_TTS_ACCESS_TOKEN
- 端点(HTTP API)
- 生成字幕:
/api/v1/vc/submit→/api/v1/vc/query - 打轴:
/api/v1/vc/ata/submit→/api/v1/vc/ata/query
- 生成字幕:
后端实现
- 服务类:
api/app/service/VolcCaption.phpgenerateFromAudioUrl(url, params): 提交音频地址 → 阻塞查询 → 返回utterancesalignTextToAudioUrl(url, text, params): 提交音频地址与文案 → 阻塞查询 → 返回utterancesutterancesToSegmentsAndSrt(utterances, offset): 转{ text,start,duration }与整片 SRT(毫秒转 SRT 时间戳)
- MCP 工具:
generate_subtitle_volc- 入口:
POST /api/mcp/tools/call,tool=generate_subtitle_volc - 输入:
timeline_json(含segments[]:audioUrl,subtitleText/text/line可选) - 逻辑:
- 遍历
segments[] - 若段内文本存在 → 用打轴接口;否则 → 用生成字幕接口
- 将每段
utterances累加为整片subtitle_segments与srt_text(按段偏移)
- 遍历
- 输出:
{ subtitle_segments, srt_text }
- 入口:
前端与合成衔接
- 弹窗(合成)默认使用
overlay_mode=subtitles直接烧录 SRT(精确且性能稳定) - 逐行
drawtext为备选(文案模板化或动效需求时使用),已记录在pybridge/README.md - 支持解析模式(仅输出规划到日志),加快验证时间轴与样式
常见问题与排查
status=pending:- 内存丢失时,pybridge 已按磁盘日志推断状态(
finished successfully/stage:render:success/stage:drawtext:plan_written)
- 内存丢失时,pybridge 已按磁盘日志推断状态(
- 文案为空:
- 打轴需提供段内文案;若无则走生成字幕,或通过
options.subtitle_segments[]传入文本数组
- 打轴需提供段内文案;若无则走生成字幕,或通过
- 精细切分与空窗:
- 片段细分:
subtitle_chunk_seconds - 段内静音空窗:
subtitle_lead_in/subtitle_lead_out
- 片段细分:
代码参考
- MCP 控制器:
api/app/mcp/controller/McpController.php- 工具列表与调用:
generate_subtitle_volc
- 工具列表与调用:
- 服务类:
api/app/service/VolcCaption.php- HTTP 封装与时间戳转换
下一步
- 增加词级时间戳渲染(高亮逐词),可从
utterances[].words[]构建 - 加入 ASR 热词(
boosting_table_id/name)与语种配置,提升识别精度 - 合并进编排流程:生成
subtitle_segments/srt_text后自动回填到时间线并触发合成