FEATURED · 精选文章

OpenCreator 中 KrillinAI TTS 技能实战:从 SRT 字幕生成目标语言配音与配音视频

发布时间 / 2026/9/15 14:25:34
来源 / 创域科博编辑部
栏目 / 资讯中心
OpenCreator 中 KrillinAI TTS 技能实战:从 SRT 字幕生成目标语言配音与配音视频 OpenCreator 中 KrillinAI TTS 技能实战从 SRT 字幕生成目标语言配音与配音视频【免费下载链接】OpenCreatorFormerly KrillinAI. Open-source AI workspace for creators, powered by Codex. Create videos, images, voice, avatars, translations, and edits with Agents in one place.项目地址: https://gitcode.com/GitHub_Trending/kr/OpenCreator导读krillinai-tts是 OpenCreator 项目为创作者 Agent 提供的配音阶段ttsstage专用技能核心能力是读取目标语言 SRT 字幕调用已配置的 TTS 服务生成配音音频tts_final_audio.wav并在提供原视频时进一步产出带配音的视频video_with_tts.mp4。本文以 skills/krillinai-tts/SKILL.md 为骨架结合 KrillinAI 运行时Go 实现的源码与配置完整讲解命令用法、行模式line-mode选择、配音参数调优、产物清单与验收方法帮助读者掌握从字幕到成片配音的完整可复现流程。技能定位与使用前提krillinai-tts是一个面向 Agent 的技能文件其 Frontmatter 声明了触发条件--- name: krillinai-tts description: Use when generating target-language dubbing with KrillinAI CLI from SRT subtitles, including TTS audio creation and optional dubbed video generation. ---它的适用场景非常明确输入是已存在的 SRT 字幕通常为翻译完成的目标语言字幕target_language_srt.srt输出是配音音频与可选的配音视频。在 OpenCreator 的多阶段创作流程中它通常位于字幕翻译subtitlestage之后、渲染render-horizontal/render-vertical之前是翻译字幕 → 合成人声 → 封装成片链路中的承上启下环节。使用该技能前有两个强制前置动作先阅读 CLI 契约SKILL.md 明确要求先读 skills/krillinai-cli/references/cli-contract.md其中规定了二进制位置、执行工作目录、配置文件与 JSON 行为约定。确保 TTS Provider 已配置配音能力依赖config/config.toml中的[tts]段未配置时 CLI 会直接报错退出详见下文配置 TTS Provider。核心命令与参数详解SKILL.md 给出的标准调用命令如下(cd $KRILLINAI_CWD $KRILLINAI_CLI tts \ --workdir $WORKDIR \ --input-srt $WORKDIR/target_language_srt.srt \ --line-mode target-only \ --video $WORKDIR/origin_video.mp4)其中路径变量按 CLI 契约约定设置REPO_ROOT$PWD TARGET$(node -p process.platform - process.arch) SUFFIX$(node -p process.platform win32 ? .exe : ) KRILLINAI_CLI$REPO_ROOT/.runtime/build/krillinai/$TARGET/bin/krillinai-cli$SUFFIX KRILLINAI_CWD$REPO_ROOT/runtime/krillinai WORKDIR$REPO_ROOT/tasks/demo test -f $KRILLINAI_CLI mkdir -p $WORKDIR构建脚本pnpm krillinai:build会编译 cmd/cli 与cmd/server两个入口并把原生二进制与 manifest 写入.runtime/build/krillinai/platform-arch/目录。契约文档特别强调执行工作目录$KRILLINAI_CWD必须是 CLI 加载config/config.toml的基准当改变进程工作目录时必须使用绝对路径传入--workdir、输入、字幕、音频与输出路径。关键 Flag 一览SKILL.md 将tts阶段的可配置 Flag 整理为下表本文补充了类型与行为说明Flag用途补充说明--workdir任务工作目录存放输入与产物必填manfiest 与中间产物如dubbing/目录都写入此处--input-srt待合成的 SRT 字幕必填通常用target_language_srt.srtpipeline/tts.go 显示缺省时会回退到 manifest 中的target_srt路径--line-mode target-only仅使用目标语言行默认值GenerateTTS中req.LineMode 时自动设为target-only--line-mode bilingual-target-top双语模式目标语言在上非 target-only 时会先通过ExtractTargetSRT抽取目标语言行生成tts_input.srt再合成--line-mode bilingual-target-bottom双语模式目标语言在下同上--voiceProvider 特定音色编码例如阿里云/OpenAI/MiniMax 的 voice code可通过voices命令枚举--voice-clone-source音色克隆源音频 URL/路径受 Provider 支持时生效对应源码中的VoiceCloneAudioUrl--video原视频路径可选提供时才产出video_with_tts.mp4见 srt2speech.go 的VideoWithTtsFilePath逻辑--dry-run仅校验命令形态不消耗 Provider 配额tts的 dry-run 会应用默认输出并写入krillinai_manifest.json但不产生媒体行模式line-mode背后的实现当--line-mode为bilingual-target-top或bilingual-target-bottom时CLI 并不会把双语字幕原样交给 TTS而是先执行抽取逻辑pipeline/tts.goif req.LineMode ! LineModeTargetOnly { ttsSource filepath.Join(req.Workdir, ttsInputFileName) if err : ExtractTargetSRT(inputSRT, ttsSource, req.LineMode); err ! nil { return failTTSStage(req, manifest, extract_tts_input_failed, err) } }即从双语 SRT 中按行模式剥离出目标语言文本tts_input.srt再以该文件作为 TTS 的输入。这意味着无论选择哪种行模式最终合成的人声都只对应目标语言内容双语模式的意义在于保留时间轴与画面排版信息供后续渲染阶段使用。音色与克隆voice / voice-clone-source--voice与--voice-clone-source在源码中分别映射为TtsVoiceCode与VoiceCloneAudioUrl见 internal/pipeline/tts.go。最终决策逻辑位于 srt2speech.gofunc resolveDubbingVoiceCode(baseVoice, cloneURL string, clone voiceCloneFunc) (string, error) { if cloneURL { return baseVoice, nil } if clone nil { return , fmt.Errorf(srtFileToSpeech CosyVoiceClone error: voice clone client is nil) } code, err : clone(krillinai, cloneURL) ... }规则可以概括为未提供克隆源直接使用--voice指定的 Provider 音色编码提供克隆源但客户端未初始化返回CosyVoiceClone error错误属于配置不完整需检查 Provider 依赖两者都可用先调用克隆接口获取临时音色编码再以该编码合成。配置 TTS ProviderTTS 是tts阶段唯一的强外部依赖Provider 必须在execution-cwd/config/config.toml中配置。以仓库根目录 runtime/krillinai/config/config-example.toml 为模板[tts]段完整示例[tts] provider aliyun # 可选值openai,aliyun,edge-tts,minimax [tts.openai] base_url api_key model # gpt-4o-mini-tts, tts-1, tts-1-hd [tts.minimax] # MiniMax TTS(T2A v2),provider选minimax时填写 base_url # 留空默认海外版 https://api.minimax.io国内可填 https://api.minimaxi.com api_key # MiniMax API密钥 model # 留空默认 speech-2.8-hd可选 speech-2.8-turbo, speech-2.6-hd, speech-2.6-turbo [tts.aliyun] # 阿里云百炼语音合成仅 API Key 必填 base_url https://dashscope.aliyuncs.com/api/v1 api_key model qwen3-tts-flash要点归纳provider支持openai、aliyun、edge-tts、minimax四类不同 Provider 对应不同的子表字段阿里云百炼方案仅 API Key 必填默认模型为qwen3-tts-flashMiniMax 留空base_url时走海外版https://api.minimax.io国内可填https://api.minimaxi.com默认模型speech-2.8-hd可选speech-2.8-turbo、speech-2.6-hd、speech-2.6-turboOpenAI 兼容方案支持gpt-4o-mini-tts、tts-1、tts-1-hd等模型。从 cmd/cli/main.go 可以看到tts命令的启动检查顺序先config.ValidateTTSConfig()校验 Provider 配置失败为 usage 错误再deps.CheckTTSDependency()校验 ffmpeg 等运行时依赖失败为 dependency 错误。因此配置缺失会在第一时间暴露而不是在合成中途失败。配音dubbing调优参数除 Provider 外[dubbing]段直接控制配音质量与节奏且与 dubbing/types.go 中的DefaultConfig()一一对应配置项默认值含义min_subtitle_duration2.5最短配音字幕时长秒过短的句子会优先合并max_chunk_size5单个配音 chunk 最多合并的字幕条数gap_tolerance1.5可吸收的相邻字幕空隙秒speed_min0.95允许的最慢调速倍率speed_accept1.15推荐的最大自然调速倍率speed_max1.30调速硬上限超过后优先改写文本enable_text_rewritetrue是否允许 LLM 将字幕改写为自然口播rewrite_max_attempts2单条字幕最多改写次数estimatorstatistical时长估时器当前仅支持statistical这些参数在 srt2speech.go 中被注入dubbing.Runner并由 Planner 消费planner.go当字幕的预估朗读时长超过原始时长 gap_tolerance且允许文本改写时LLM 优化器会尝试把字幕改写得更口语化以适配时间轴分句与合并则由max_chunk_size、min_subtitle_duration与gap_tolerance共同决定。产出与产物清单tts阶段的输出路径统一记录在任务工作目录的krillinai_manifest.json中SKILL.md 要求从 manifest 读取路径而不是硬编码猜测。两个核心产物tts_final_audio.wav最终合成配音音频对应 manifest 输出键tts_audiovideo_with_tts.mp4仅当提供了视频输入时产出对应video_with_tts。契约文档给出了 manifest 中与本阶段相关的默认路径映射Output key默认路径tts_audioworkdir/tts_final_audio.wavvideo_with_ttsworkdir/video_with_tts.mp4target_srtworkdir/target_language_srt.srtorigin_videoworkdir/origin_video.mp4内部流水线从 SRT 到 WAV理解产物形态有助于排障。srtFileToSpeech将参数组装为dubbing.Runnerrunner.go后执行以下步骤解析并清洗 SRTcleanCuesForSpeechPlanner 估算每句时长、合并 chunk、必要时改写文本逐 chunk 调用 TTS 生成raw/chunk_N.wav纯静音文本直接写入静音片段见 tts.go单条失败自动重试 3 次retryTTS用统计估时器 测得的真实时长做时间轴拟合FitTimeline通过 ffmpeg 拼接所有 chunk 得到tts_final_audio.wav再与原视频 mux 得到video_with_tts.mp4。中间产物会落在workdir/dubbing/目录dubbing_input.srt清洗后字幕、dubbing_plan.json时间轴计划、dubbing_report.json警告、失败索引、最大倍速、改写次数、dub.srt配音字幕。这些文件对排查某句读快了/读慢了非常有用。验收标准与错误处理SKILL.md 规定tts阶段完成后必须执行以下验收终端 JSON 必须为成功形态解析 stdout 逐行 JSON最后一条对象须满足ok: true音频文件非空确认tts_final_audio.wav存在且大小非零源码中ensureNonEmptyFile正是这个检查的 Go 实现视频流校验若产出video_with_tts.mp4用ffprobe检查时长与音频流ffprobe -v error -show_entries formatduration -of defaultnoprint_wrappers1:nokey1 $WORKDIR/video_with_tts.mp4 ffprobe -v error -select_streams a -show_entries streamcodec_type -of csvp0 $WORKDIR/video_with_tts.mp4JSON/错误契约完整契约见 skills/krillinai-cli/references/cli-contract.md。错误分类与退出码CLI 契约定义如下错误分类tts阶段应据此处置退出码含义对应处理0成功进入产物验收1用法错误usage修正 Flag 或缺失输入2可重试错误retryable延迟后重试或更换 Provider/源3依赖错误dependency安装/暴露ffmpeg、ffprobe、yt-dlp失败 JSON 的典型形态{ ok: false, error: { kind: retryable, code: audio_transcription_failed, message: connection timeout, retryable: true } }需要注意内部错误当前也可能以退出码 1 结束因此分类时应以error.kind为准而不是只看退出码cli-contract.md 中明确提示。tts阶段的失败分支会将 manifest 中的tts阶段标记为失败并保存pipeline/tts.go便于后续审计。进度上报与长任务观察当环境变量OPENCREATOR_KRILLINAI_CLI1时tts会像subtitle一样在终端响应前输出进度帧cmd/cli/main.go{type:progress,phase:generating_voice,percent:42,message:正在生成配音}进度百分比由 dubbing runner 的ReportProgress回调映射到 20%90% 区间srt2speech.go配合preparing_voice、collecting_outputs等 phase 值可以在长任务中实时观测阶段推进而不是干等最终 JSON。与 CLI 其他命令的衔接tts是 KrillinAI CLI 八大命令之一cli-contract.md命令用途subtitle生成源语言/目标语言/双语/短竖屏字幕tts生成 TTS 音频与可选配音视频本文主题speech从文本或 UTF-8 文本文件生成单个音频文件render-horizontal/render-vertical渲染横屏/竖屏字幕或配音视频cover根据完整文本提示生成封面图voices列出aliyun/openai/minimax的音色编码Edge TTS 无 CLI 音色目录pipeline以--dry-run校验输出计划典型链路是subtitle含翻译→tts配音→render-horizontal/render-vertical封装渲染。执行tts前如需确认音色编码可先运行voices --dry-run——它返回本地音色列表而不发起外部调用且subtitle、render-*、speech、pipeline的 dry-run 都不会写任务 manifest可以安全地用于命令形态自检。常见问题速查报config_not_found或usage错误config/config.toml缺失或[tts]未配置。按 config-example.toml 复制并填入对应 Provider 的 API Key注意 CLI 以进程工作目录为基准加载配置。video_with_tts.mp4没有产出确认是否传入--video源码中InputVideo为必填项dubbing runner 的validate()会直接拒绝空视频路径。某句配音时间轴对不上查看workdir/dubbing/dubbing_report.json中的max_speed_factor、rewrite_count、warnings并检查[dubbing]中speed_*、enable_text_rewrite、min_subtitle_duration等参数。退出码 3dependencyffmpeg/ffprobe不可用安装并确保在 PATH 中后再重试。长任务无输出确认设置了OPENCREATOR_KRILLINAI_CLI1否则 CLI 只会在结束时输出最终 JSON。【免费下载链接】OpenCreatorFormerly KrillinAI. Open-source AI workspace for creators, powered by Codex. Create videos, images, voice, avatars, translations, and edits with Agents in one place.项目地址: https://gitcode.com/GitHub_Trending/kr/OpenCreator创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻