Skip to content

字幕能力接入方案(火山引擎)

目标与策略

  • 统一为分镜/音频生成精准字幕时间轴,服务前端合成与展示
  • 优先策略:
    • 自动字幕打轴(VC ATA):当段内存在文案(subtitleText/text/line)时,按文案精准对齐到音频
    • 音视频字幕生成(VC):当段内不存在文案时,直接识别音频获得文本与时间轴
  • 输出格式:
    • subtitle_segments: 数组片段 { text, start, duration }
    • srt_text: 整片 SRT 文本

接入概览

  • 环境变量(已配)
    • VOLC_TTS_APPID
    • VOLC_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.php
    • generateFromAudioUrl(url, params): 提交音频地址 → 阻塞查询 → 返回 utterances
    • alignTextToAudioUrl(url, text, params): 提交音频地址与文案 → 阻塞查询 → 返回 utterances
    • utterancesToSegmentsAndSrt(utterances, offset): 转 { text,start,duration } 与整片 SRT(毫秒转 SRT 时间戳)
  • MCP 工具:generate_subtitle_volc
    • 入口:POST /api/mcp/tools/calltool=generate_subtitle_volc
    • 输入:timeline_json(含 segments[]audioUrl,subtitleText/text/line 可选)
    • 逻辑:
      1. 遍历 segments[]
      2. 若段内文本存在 → 用打轴接口;否则 → 用生成字幕接口
      3. 将每段 utterances 累加为整片 subtitle_segmentssrt_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
  • 文案为空:
    • 打轴需提供段内文案;若无则走生成字幕,或通过 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 后自动回填到时间线并触发合成