OpenMontage 中的 HeyGen Starfish 文转语音(Text-to-Speech)技能实战指南 📅 发布时间:2026/9/11 23:58:05 👁 浏览次数: OpenMontage 中的 HeyGen Starfish 文转语音Text-to-Speech技能实战指南【免费下载链接】OpenMontageWorlds first open-source, agentic video production system. 12 production pipelines, 100 tools, 700 agent skill and production-knowledge files. Turn your AI coding assistant into a full video production studio.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMontage导读本文基于 OpenMontage 开源智能视频生产系统中.agents/skills/text-to-speech/SKILL.md技能文档展开系统讲解如何用 HeyGen 自研的 Starfish TTS 模型把纯文本转成独立语音音频。你将掌握从环境变量认证、语音列表查询、带语速/音调/语言地区控制的合成请求到 SSML 停顿标签与“表情化配音”的完整工作流并了解它在 OpenMontage 100 工具、12 条生产管线的 TTS 生态中的定位与对接方式。1. 技能定位独立音频生成区别于视频创建在 OpenMontage 的 Agent 技能体系中text-to-speech技能对应文件 .agents/skills/text-to-speech/SKILL.md负责从文本生成独立的语音音频文件带音色选择、语速与音调控制地做文本转语音为画外音voiceover、旁白narration、播客等场景制作音频对接 HeyGen 的/v1/audio系列接口按语言或性别列出可用 TTS 音色。关键区分在于这是独立音频生成与视频创建avatar video完全分离。技能元数据中声明allowed-tools: mcp__heygen__*说明该技能面向已接入 HeyGen MCP 工具的 Agent 环境同时技能前置要求环境变量HEYGEN_API_KEYmetadata.openclaw.requires.env。该技能在 OpenMontage 的技能索引skills/INDEX.md中被归入“TTS Audio”能力簇与elevenlabs、fish-audio-tts、speech-to-text等并列说明它是系统多条旁白生成链路中可被 Agent 按需调用的能力之一。2. 认证X-Api-Key 与 HEYGEN_API_KEY所有 HeyGen 请求都通过X-Api-Key请求头完成认证在 OpenMontage 中该密钥统一由环境变量HEYGEN_API_KEY提供curl -X GET https://api.heygen.com/v1/audio/voices \ -H X-Api-Key: $HEYGEN_API_KEY结合 OpenMontage 的 docs/PROVIDERS.md 中关于 HeyGen 的接入说明完整的前置步骤为在 HeyGen 平台注册账号并进入 API 设置页生成密钥为 API 预充值API 为预付费按量计费与网页套餐积分相互独立在项目.env中加入HEYGEN_API_KEYyour-key-here。.env中统一的变量约定见 docs/PROVIDERS.md 第 67 行的环境变量汇总表HEYGEN_API_KEY # HeyGen avatar video gateway。需注意技能文档所述的“Starfish TTS 独立音频接口”走的是/v1/audio路径而仓库中的heygen_video工具tools/video/heygen_video.py走的是视频生成网关路径二者虽共用同一把密钥但业务端点与产物不同。3. 工具选择MCP 优先HTTP 兜底当 HeyGen MCP 工具可用时即mcp__heygen__*前缀的 MCP 工具应优先使用 MCP 工具而非直连 HTTP API。技能给出的映射关系为任务MCP 工具兜底直连 API列出 TTS 音色mcp__heygen__list_audio_voicesGET /v1/audio/voices生成语音音频mcp__heygen__text_to_speechPOST /v1/audio/text_to_speech这一“能力层工具优先、直连 API 兜底”的设计与 OpenMontage 工具注册机制tools/tool_registry.py中的自动发现逻辑一致——Agent 技能通过allowed-tools声明依赖的 MCP 工具集运行时再决定走 MCP 还是原生 HTTP。4. 默认工作流技能定义的默认四步流程用mcp__heygen__list_audio_voices或GET /v1/audio/voices列出音色挑选符合目标语言、性别与特性要求的音色用mcp__heygen__text_to_speech或POST /v1/audio/text_to_speech提交文本与voice_id使用返回的audio_url下载或播放音频。这是一个“先查目录、再下单、后取货”的稳定闭环下面逐一展开每个环节。5. 列出 TTS 音色List TTS Voices5.1 端点说明接口GET /v1/audio/voices重要这与视频音色接口GET /v2/voices是不同端点且并非所有视频音色都支持 Starfish TTS。因此查询 TTS 兼容音色时必须使用/v1/audio/voices。5.2 curlcurl -X GET https://api.heygen.com/v1/audio/voices \ -H X-Api-Key: $HEYGEN_API_KEY5.3 TypeScript技能文档给出了完整类型定义与调用函数interface TTSVoice { voice_id: string; language: string; gender: female | male | unknown; name: string; preview_audio_url: string | null; support_pause: boolean; support_locale: boolean; type: string; } interface TTSVoicesResponse { error: null | string; data: { voices: TTSVoice[]; }; } async function listTTSVoices(): PromiseTTSVoice[] { const response await fetch(https://api.heygen.com/v1/audio/voices, { headers: { X-Api-Key: process.env.HEYGEN_API_KEY! }, }); const json: TTSVoicesResponse await response.json(); if (json.error) { throw new Error(json.error); } return json.data.voices; }5.4 Pythonimport requests import os def list_tts_voices() - list: response requests.get( https://api.heygen.com/v1/audio/voices, headers{X-Api-Key: os.environ[HEYGEN_API_KEY]} ) data response.json() if data.get(error): raise Exception(data[error]) return data[data][voices]5.5 响应格式{ error: null, data: { voices: [ { voice_id: f38a635bee7a4d1f9b0a654a31d050d2, name: Chill Brian, language: English, gender: male, preview_audio_url: https://resource.heygen.ai/text_to_speech/WpSDQvmLGXEqXZVZQiVeg6.mp3, support_pause: true, support_locale: false, type: public } ] } }字段语义voice_id合成请求中唯一标识音色language/gender用于按语言、性别筛选音色preview_audio_url试听地址部分音色可能为nullsupport_pause是否支持break停顿标签support_locale是否支持多语言地区locale切换type音色类型如public。6. 生成语音音频Generate Speech Audio6.1 端点与请求字段端点POST https://api.heygen.com/v1/audio/text_to_speech字段类型必填说明textstring是要转换为语音的文本内容voice_idstring是来自GET /v1/audio/voices的音色 IDspeednumber否语速0.5–1.5默认 1pitchinteger否音调-50 到 50默认 0localestring否多语言音色的口音/地区如en-US、pt-BRelevenlabs_settingsobject否针对 ElevenLabs 音色的高级设置其中speed/pitch的取值区间与 OpenMontage 的 TTS 能力选择器tools/audio/tts_selector.py中定义的通用控制语义保持一致该选择器把speed定义为 0.25–4.0 的别名、pitch定义为 -50–50 的通用范围并注明“HeyGen-style providers may accept wider ranges”说明技能文档中的参数是能力层统一抽象的具象化。6.2 ElevenLabs 高级设置可选字段类型说明modelstring模型选择eleven_v3、eleven_turbo_v2_5等similarity_boostnumber音色相似度0.0–1.0stabilitynumber输出一致性0.0–1.0stylenumber风格强度0.0–1.06.3 curlcurl -X POST https://api.heygen.com/v1/audio/text_to_speech \ -H X-Api-Key: $HEYGEN_API_KEY \ -H Content-Type: application/json \ -d { text: Hello! Welcome to our product demo., voice_id: YOUR_VOICE_ID, speed: 1.0 }6.4 TypeScriptinterface TTSRequest { text: string; voice_id: string; speed?: number; pitch?: number; locale?: string; elevenlabs_settings?: { model?: string; similarity_boost?: number; stability?: number; style?: number; }; } interface WordTimestamp { word: string; start: number; end: number; } interface TTSResponse { error: null | string; data: { audio_url: string; duration: number; request_id: string; word_timestamps: WordTimestamp[]; }; } async function textToSpeech(request: TTSRequest): PromiseTTSResponse[data] { const response await fetch( https://api.heygen.com/v1/audio/text_to_speech, { method: POST, headers: { X-Api-Key: process.env.HEYGEN_API_KEY!, Content-Type: application/json, }, body: JSON.stringify(request), } ); const json: TTSResponse await response.json(); if (json.error) { throw new Error(json.error); } return json.data; }6.5 Pythonimport requests import os def text_to_speech( text: str, voice_id: str, speed: float 1.0, pitch: int 0, locale: str | None None, ) - dict: payload { text: text, voice_id: voice_id, speed: speed, pitch: pitch, } if locale: payload[locale] locale response requests.post( https://api.heygen.com/v1/audio/text_to_speech, headers{ X-Api-Key: os.environ[HEYGEN_API_KEY], Content-Type: application/json, }, jsonpayload, ) data response.json() if data.get(error): raise Exception(data[error]) return data[data]6.6 响应格式{ error: null, data: { audio_url: https://resource2.heygen.ai/text_to_speech/.../id365d46bb.wav, duration: 5.526, request_id: p38QJ52hfgNlsYKZZmd9, word_timestamps: [ { word: start, start: 0.0, end: 0.0 }, { word: Hey, start: 0.079, end: 0.219 }, { word: there,, start: 0.239, end: 0.459 }, { word: end, start: 5.526, end: 5.526 } ] } }响应中值得重点利用的字段audio_url合成音频的下载地址duration音频总时长秒可用于估算成片时长与剪辑排布request_id请求追踪 ID便于问题排查word_timestamps词级时间戳每个词对应start/end秒是后续生成字幕、做时间轴对齐的关键数据。OpenMontage 的 skills/core/subtitle-sync.md 明确指出subtitle_gen工具可从词级时间戳生成 SRT、VTT 或字幕 JSON因此该响应字段与系统的字幕链路直接打通。7. 使用示例7.1 基础 TTSconst result await textToSpeech({ text: Welcome to our quarterly earnings call., voice_id: YOUR_VOICE_ID, }); console.log(Audio URL: ${result.audio_url}); console.log(Duration: ${result.duration}s);7.2 语速调整const result await textToSpeech({ text: Were thrilled to announce our newest feature!, voice_id: YOUR_VOICE_ID, speed: 1.1, });7.3 多语言音色搭配 localeconst result await textToSpeech({ text: Bem-vindo ao nosso produto., voice_id: MULTILINGUAL_VOICE_ID, locale: pt-BR, });7.4 查找音色并生成音频组合示例async function generateSpeech(text: string, language: string): Promisestring { const voices await listTTSVoices(); const voice voices.find( (v) v.language.toLowerCase().includes(language.toLowerCase()) ); if (!voice) { throw new Error(No TTS voice found for language: ${language}); } const result await textToSpeech({ text, voice_id: voice.voice_id, }); return result.audio_url; } const audioUrl await generateSpeech(Hello and welcome!, english);这个组合示例演示了完整闭环先按语言从音色库中自动匹配voice_id再提交合成并返回audio_url。8. 用 Break 标签控制停顿Starfish TTS 支持在文本中嵌入 SSML 风格的停顿标签word break time1s/ word使用规则时间必须带s后缀例如break time1.5s/标签前后必须有空格必须使用自闭合标签格式。是否可用由音色的support_pause字段决定。停顿标签的价值在于不必重录整段音频就能精确控制节奏这也是 OpenMontage 表情化配音voice performance体系落地的载体之一。9. 表情化配音方向Expressive Voice Direction技能强调为旁白生成音频前应先制定简短的语音表演方案明确叙述者人设与情绪意图narrator persona and emotional intent节奏画像pacing profile贯穿脚本的能量曲线energy curve停顿应落在哪里哪些词句需要强调。关键原则是用具体提示词不用空泛指令。“Warm but decisive; pause before the contrast; slow down on the final sentence” 是有用的“Sound natural” 不是。当所选音色支持停顿support_pause: true时应把最重要的停顿直接以break标签写进文本。并且先从表演负担最重的段落生成一个样音如果样音听上去平淡、仓促或忽略预期停顿就不要批量生成剩余部分。这与 OpenMontage 的 skills/meta/voice-performance-director.md 所要求的“脚本顶层携带voice_performance对象、段落级携带delivery_cues并把提示词从脚本一路带到资产生成、再用样音验证”的约定完全同构——该 meta 技能甚至直接给出了带break time0.6s/的provider_text示例与本技能的停顿标签用法互相印证。10. 最佳实践清单技能最后给出六条可直接照做的实践准则用GET /v1/audio/voices找兼容音色——并非GET /v2/voices返回的所有音色都支持 Starfish TTS设置locale前先检查support_locale——只有多语言音色支持地区切换语速保持在 0.8–1.2——听感更自然生成前先用preview_audio_url试听——部分音色该字段可能为null利用响应中的word_timestamps——用于字幕同步或时间轴文本叠加对应 skills/core/subtitle-sync.md 的字幕生成链路用 SSML 停顿标签控制节奏——word break time1s/ word。11. 在 OpenMontage 中的生态位置从仓库证据看本技能处于 OpenMontage TTS 能力矩阵的“HeyGen Starfish 独立音频”一格密钥体系与视频网关共用HEYGEN_API_KEY见 docs/PROVIDERS.md 环境变量汇总与 HeyGen 章节能力层由 tools/audio/tts_selector.py 统一抽象——该选择器会自动发现注册表中所有capabilitytts的工具并支持speed、pitch、locale、timestamps、input_typetext/ssml等通用参数透传本文技能中的speed/pitch/locale/break标签均可映射到该选择器的通用语义上与旁白表演体系衔接技能中的“表情化配音方向”与 skills/meta/voice-performance-director.md 的voice_performance/delivery_cues契约互相印证与字幕链路衔接响应中的词级word_timestamps可直接对接 skills/core/subtitle-sync.md 描述的subtitle_gen词级时间戳→SRT/VTT/字幕 JSON 流程。需要说明的是仓库中目前没有发现对 HeyGen/v1/audioStarfish TTS端点的工具级封装heygen_video工具tools/video/heygen_video.py走的是多模型视频网关路径。因此本文技能主要面向“已接入mcp__heygen__*MCP 工具的 Agent 环境”直接调用 MCP 工具或按本文 curl/TS/Python 示例直连 HTTP API 使用。结语通过本文你可以完整掌握 OpenMontagetext-to-speech技能的全部实操细节用/v1/audio/voices精准筛选 Starfish TTS 兼容音色用/v1/audio/text_to_speech以speed、pitch、locale和 ElevenLabs 高级参数合成自然语音用break标签精确控制停顿用词级时间戳打通字幕链路并按“先出样音、再批量生成”的配音表演流程产出有导演感的旁白音频。这套方法可直接应用于画外音、播客与任何需要独立语音资产的视频生产流程。【免费下载链接】OpenMontageWorlds first open-source, agentic video production system. 12 production pipelines, 100 tools, 700 agent skill and production-knowledge files. Turn your AI coding assistant into a full video production studio.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMontage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考