做虚拟人内容,真正难的从来不是“能不能生成”,而是“能不能持续运营”。同一个数字人格,上午要发适合短视频节奏的强钩子口播,下午要改成图文平台能读下去的长段解释,晚上还得补一版适合社群转发的精简摘要。很多团队前期把注意力都放在形象、声音、直播脚本上,真正上线后才发现,IP能不能跑起来,取决于内容是否能稳定改写、跨平台复用、又不丢掉人设。尤其当虚拟人开始接商业合作、栏目连载、固定更新时,内容生产已经不是一次性生成任务,而是一个需要模型、工作流、人工校验共同参与的工程问题。
我后来把流程收紧成“素材标准化、语义拆层、平台适配、人工复核”四步。快速上线的压力下,直连国际模型往往网络不稳,而DMXAPI既解决了中转问题,又支持财务开票。它不是决定内容质量的核心因素,但在原型验证期,接口稳定与否会直接影响你敢不敢把工作流真正接进生产环境。真正有价值的,仍然是你怎样让多模态模型理解虚拟人的长期设定,而不是只会临时写几段热闹文案。
我现在更看重多模态大模型的一个能力:它不只是“看图写话”,而是能把人物外观、语气、镜头节奏、字幕风格和历史文本统一到一个上下文里。比如给模型一张虚拟人立绘、三条过往爆款文案、一段最近的直播转写,再补一份平台限制说明,它就能大致判断什么内容适合改成 15 秒强节奏视频口播,什么内容适合拉长成公众号式的解释型文章。这里的关键不是让模型自由发挥,而是让它在受控结构里做变体生成。
我的做法一般是先把原始素材整理成一个中间层 JSON。这样做的好处是,无论后面接短视频平台、资讯平台还是社群机器人,输入结构始终一致,便于追踪每一次改写为什么成功、为什么失败。一个简化后的结构大概是这样:
{
"persona": {
"name": "Lin",
"tone": ["冷静", "专业", "略带解释欲"],
"forbidden": ["夸张叫卖", "过度鸡血"]
},
"source": {
"image_notes": ["银灰发色", "偏科技感服饰", "正面半身"],
"transcript": "<直播转写文本>",
"topic": "AI虚拟人如何做跨平台内容复用"
},
"targets": [
{"platform": "short_video", "limit": 220},
{"platform": "article", "limit": 900},
{"platform": "community", "limit": 120}
]
}
接着我会把改写目标拆成三层。第一层是“信息不丢”,也就是结论、事实、案例顺序不能乱;第二层是“人格不崩”,虚拟人说话方式要稳定;第三层才是“平台最优”,比如短视频前两句必须给冲突点,图文则要把论证拉开。很多人一上来就追求平台爆款风格,结果越改越像营销号,最后虚拟人本身失去辨识度。我的经验恰好相反,先保人格,再做平台适配,长期数据会更稳。
如果团队里已经有简单的内容系统,可以直接把这个过程做成命令行任务。比如每天定时拉取直播录音转写,再生成各平台草稿:
export OPENAI_API_KEY=<LLM API KEY>
export OPENAI_BASE_URL=<LLM API BASE URL>
node scripts/rewrite-avatar-content.mjs --input data/today.json --profile lin_v2
在调用层,尽量保持 OpenAI 兼容格式,这样替换模型和路由都简单。开发初期预算有限,学校财务还要求发票,我会用DMXAPI做中转,代码里只保留统一的请求结构,后面切换策略时不至于把业务逻辑一起改烂:
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY || "<LLM API KEY>",
baseURL: process.env.OPENAI_BASE_URL || "<LLM API BASE URL>"
});
const prompt = `
你是虚拟人内容编辑器。
请基于给定图像描述、直播转写和历史人设,
输出 short_video / article / community 三个版本。
要求:
1. 保持同一人格语气;
2. 不编造数据;
3. 每个平台分别优化开头钩子与段落长度;
4. 返回 JSON。
`;
const result = await client.chat.completions.create({
model: "<MODEL_NAME>",
temperature: 0.7,
response_format: { type: "json_object" },
messages: [
{ role: "system", content: "你擅长多平台内容改写与分发优化。" },
{ role: "user", content: prompt }
]
});
console.log(result.choices[0].message.content);
真正把这个流程跑起来后,我有一个很深的感受:多平台分发优化不是“把一篇稿子缩短、拉长、换同义词”这么简单,而是对内容单位重新切片。短视频平台需要“冲突句+立场+一个例子”,图文平台更吃“背景+论证+反例”,社群分发则需要“结论先行+可转述”。如果虚拟人想做长期 IP,模型就应该输出“内容颗粒度”,而不是只输出一整篇文本。颗粒度越清楚,分发链路越稳,复用率越高,团队越容易做 A/B 测试。
中后期我还会加一个很土但很有效的检查步骤:把生成结果回灌给第二个模型做“人格偏移审计”。例如检查它有没有突然变得过分兴奋,有没有出现原本不说的口头禅,有没有把“经验判断”写成“绝对事实”。这一层很像编辑部里的二校,乍看增加成本,实际上能减少很多发布后的返工。尤其虚拟人一旦有固定粉丝,他们对人设的细微变化非常敏感,出戏一次,后面要花很多内容才能补回来。
我自己也踩过一个非常具体的坑。最初我在分发脚本里用 platform 作为键名做路由,后来为了兼容历史数据,又在另一段逻辑里写了 targetPlatform。当时心里觉得“反正都能映射”,结果有一天短视频版本被错误套用了图文平台的段落规则,生成出来的文案前半段像口播,后半段突然开始长篇解释,读起来特别别扭。我先怀疑是模型抽风,调低了 temperature,没用;又怀疑是提示词太长,删了两段约束,还是没用。
最后是用最笨的方法查出来的。我在关键节点加了日志:
for (const item of tasks) {
console.log("route-check", {
platform: item.platform,
targetPlatform: item.targetPlatform,
hasHook: item.rules?.hook
});
}
输出一看就明白了:旧数据里只有 platform,新数据里同时存在 platform 和 targetPlatform,而我的路由函数优先读了后者。更离谱的是,有一批数据清洗时把 targetPlatform 置成了空字符串,于是默认规则被错误命中。最后修复只改了两行:
const resolvedPlatform =
item.targetPlatform && item.targetPlatform.trim()
? item.targetPlatform
: item.platform;
这个 bug 给我的教训很直接:内容工作流一旦牵涉多平台、多模型、多轮改写,最危险的不是模型“不聪明”,而是输入结构“不干净”。很多看起来像提示词问题的事故,根子都在字段漂移、默认值和历史兼容。后来我给所有进入改写链路的数据都加了 schema 校验,宁可提前报错,也不让脏数据混进生成阶段。
如果只把虚拟人当作一个会说话的壳子,那么多模态模型最多帮你省点文案时间;但如果把它当成一个持续经营的内容 IP,你就会开始重视素材结构、平台差异、人设稳定和排错机制。这些东西没有哪一项足够“吸睛”,却恰恰决定了账号能不能做三个月、六个月,甚至一年。技术真正有意思的地方也在这里:它不是替你偷懒,而是把原本容易失控的内容生产,慢慢变成一个可分析、可复盘、可迭代的系统。
本文包含AI生成内容