ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

东南亚跨境电商多语言主图AI生成实战:文案本地化与排版合成

东南亚跨境电商多语言主图AI生成实战:文案本地化与排版合成 1. 东南亚多语言主图生成的项目背景与核心痛点做跨境电商的同行应该都有体会东南亚市场这两年的热度一直在往上走。Shopee、Lazada、TikTok Shop 在印尼、泰国、越南、菲律宾、马来西亚这几个站点流量红利还没完全吃完但竞争已经从“铺货就能出单”变成了“精细化才有利润”。我身边不少做家居、3C配件、美妆工具的朋友都在往东南亚铺品但几乎所有人都会卡在同一个环节上主图本地化。什么叫主图本地化简单说你一个产品要上到六个国家每个国家的主图都得有当地语言的卖点文案。印尼站要印尼语泰国站要泰语越南站要越南语菲律宾站虽然英语通用但本地化标签也得跟上。以前的做法是运营把中文卖点写出来丢给翻译翻译返回文本美工再一张张往图上贴。一个SKU六张主图六个国家就是三十六张图光是改文字就能耗掉一整天。更麻烦的是翻译返回的文案长度不可控泰语和越南语有时候比中文长出一大截贴上去要么溢出画面要么字号被迫缩到看不清。这个项目的核心目标就是用 AI 把“翻译 排版 出图”这三个动作压缩成一步。输入一张带中文卖点的原始主图或者干脆只输入产品图和卖点列表系统自动完成多语言文案生成、字体适配、排版合成最后批量输出符合各站点要求的主图。听起来像是美工工具的升级版但真正做过的人知道难点根本不在“生成图片”这个动作上而在于多语言场景下的文案适配和视觉一致性。我实测下来整个流程里最容易被低估的环节是文案的“本地化改写”。直接机翻出来的印尼语语法可能没错但当地消费者读起来就是别扭。比如中文的“买一送一”直译成印尼语是“beli satu dapat satu”但当地电商更常用的表达是“Beli 1 Gratis 1”后者在视觉上更短、更有冲击力。这种细节纯翻译工具给不了你得靠针对电商场景微调过的 AI 模型或者自己积累一套各站点的常用营销词库。这个指南适合两类人看一类是中小跨境卖家团队里没有专职多语言运营想用工具把主图制作的效率提上来另一类是电商视觉设计师想了解 AI 工具怎么嵌入现有的工作流而不是被它替代。我会把整个方案的选型逻辑、实操步骤、参数配置和踩过的坑都摊开讲你照着抄作业就能跑通。2. 整体方案设计与工具选型思路2.1 为什么选择“AI 文案 模板合成”而不是“端到端生成”市面上有不少 AI 图片生成工具输入一段描述就能出图。但我一开始就排除了纯端到端生成的路线原因有三个。第一电商主图对产品本身的还原度要求极高AI 生成的产品图经常出现细节变形比如耳机变成六个喇叭、水杯把手长在奇怪的位置这种图放上去转化率直接崩。第二主图上的文字信息必须精确可控促销价、折扣力度、赠品信息不能有任何歧义生成式模型在这块不可靠。第三东南亚各站点的主图尺寸和风格有差异Shopee 主图是 1:1TikTok Shop 部分场景用 9:16端到端生成很难保证批量输出时的一致性。所以我采用的方案是产品图保持原样只对文案层和排版层做 AI 处理。具体来说把主图拆成“底图”和“文字层”两个部分。底图就是产品照片或者已经抠好图的素材文字层包含卖点、促销标签、价格信息。AI 负责把中文文案转成目标语言并做本地化改写然后根据文案长度自动计算字号和行距最后用模板引擎合成输出。这样做的好处是产品图零损失文字完全可控批量处理的稳定性也高得多。2.2 多语言文案生成的技术选型对比文案生成这块我前后试过三种方案各有优劣最后是组合使用的。方案实现方式优势劣势适用场景通用翻译 API调用翻译接口直译接入快、成本低电商术语不准、长度不可控应急、少量SKU大模型提示词工程用大模型做翻译改写本地化效果好、可控制长度需要调提示词、有调用成本主力方案自建词库规则维护各语言营销词对照表完全可控、零调用成本覆盖有限、维护工作量大高频固定卖点我现在的做法是大模型提示词工程为主自建词库为辅。大模型负责处理长尾的、灵活多变的卖点描述自建词库负责那些高频出现的固定表达比如“限时抢购”“包邮”“买二送一”这类。词库的好处是零延迟、零成本而且可以人工审核确保准确。大模型的好处是灵活遇到新的卖点描述不用等词库更新。提示词的设计是关键。我试过直接让模型“把下面这段话翻译成印尼语”出来的结果经常太长。后来改成“你是一个东南亚电商运营专家请把以下中文卖点改写成印尼语要求不超过15个字符、使用当地电商常用表达、保留促销紧迫感”效果就好很多。这里面的门道后面会详细展开。2.3 排版合成引擎的选择排版合成我用的是基于 Canvas 的 Node.js 方案核心库是node-canvas和sharp。选这个组合的原因很简单可控性最强。每一个文字块的位置、字号、颜色、描边都能用代码精确控制批量处理时不会出现“这次生成的位置偏了、下次又好了”的情况。有人会问为什么不用 Photoshop 的批处理动作或者稿定设计这类工具的批量功能。我试过PS 动作处理多语言时有个致命问题不同语言的字符宽度差异太大PS 的文本图层不会自动缩放泰语和越南语经常溢出。稿定这类在线工具批量能力有限而且多语言支持不够灵活。自己写合成脚本虽然前期投入大一点但跑通之后想怎么改就怎么改后期维护成本反而低。整个方案的架构可以这样理解输入层接收产品图和中文卖点列表处理层调用 AI 生成多语言文案并计算排版参数输出层用 Canvas 合成图片并批量导出。中间还有一个配置层存放各站点的尺寸规范、字体文件、模板布局。这套架构跑在本地或者一台轻量服务器上都行不需要复杂的部署。3. 多语言文案生成的核心细节与实操要点3.1 提示词工程让 AI 输出“能直接上图”的文案大模型默认的输出风格是“完整、礼貌、解释性”但主图文案需要的是“短、狠、准”。这两个目标天然冲突所以提示词必须把模型往电商场景上拽。我经过几十次调整总结出一个比较稳定的提示词框架分四个部分角色设定、任务描述、约束条件、输出格式。角色设定部分我会写“你是一个有五年经验的东南亚电商运营熟悉 Shopee 和 Lazada 各站点的主图规范”。这句话的作用是让模型调用它训练数据里关于电商场景的知识而不是通用翻译知识。实测下来加了这句之后模型输出的文案明显更“像电商人写的”。任务描述部分要具体。不要写“翻译以下文案”而是写“将以下中文卖点改写成目标语言的主图文案用于电商产品主图展示”。关键词是“主图文案”这会让模型倾向于输出短句而不是长段落。约束条件是重中之重。我通常会加这几条字符数上限根据目标语言设定印尼语和马来语一般 20 个字符以内泰语 18 个字符以内越南语 22 个字符以内必须使用当地电商高频词保留数字和促销符号不添加解释性文字。字符数上限的设定依据是主图文字区域的物理宽度这个后面会讲怎么算。输出格式我要求模型返回 JSON包含text和char_count两个字段。这样做的好处是后续程序可以直接解析不用再做文本清洗。下面是一个实际的提示词示例你是一个有五年经验的东南亚电商运营熟悉 Shopee 和 Lazada 各站点的主图规范。 任务将以下中文卖点改写成印尼语主图文案。 约束 1. 字符数不超过 20 个 2. 使用印尼电商高频表达 3. 保留促销紧迫感 4. 不添加任何解释 中文卖点限时抢购买二送一 输出格式{text: 文案, char_count: 数字}实测下来这个提示词在 GPT-4 和 Claude 上都能稳定输出可用结果。但要注意不同模型对字符数的遵守程度不一样。GPT-4 偶尔会超出一两个字符Claude 相对更严格。我的做法是在程序里加一道校验如果超长就自动触发一次重试重试时把上限调低两个字符。3.2 各语言字符宽度差异与字号计算这是整个项目里最技术性的部分也是最多人踩坑的地方。同样字号的文字中文、英文、泰语、越南语的实际显示宽度完全不同。中文字符基本是等宽的一个字符占一个“字宽”。英文字符宽度不一i和W能差三倍。泰语有上下标元音垂直方向占用的空间比中文大。越南语虽然用拉丁字母但叠加了声调符号高度也会增加。如果统一用固定字号结果就是中文文案刚好泰语溢出英文显得太小。我的解决方案是按字符类型加权计算文本宽度然后反推字号。具体来说给每个字符分配一个宽度权重中文字符权重 1.0英文大写字母 0.6英文小写字母 0.5数字 0.5泰语字符 0.7越南语字符 0.55。把文案里所有字符的权重加起来得到“加权字符数”再用文字区域的像素宽度除以加权字符数就得到每个权重单位对应的像素宽度最后乘以基准字号系数得到实际字号。这个计算听起来复杂但代码实现很简单。我写了一个函数输入文案和目标语言返回建议字号。实测下来这套加权算法能把不同语言的文字块宽度控制在正负 5% 的误差范围内视觉上基本看不出差异。还有一个细节泰语的上下标元音会导致行高比中文大。如果按中文的行高设置泰语文字会跟上一行重叠。我的做法是给泰语单独设置 1.4 倍行高其他语言用 1.2 倍。这个参数是试出来的你可以根据实际字体微调。3.3 本地化改写的“度”怎么把握AI 改写文案时有一个微妙的平衡改得太少读起来像机翻改得太多可能偏离原意。我给自己定了一条线促销力度和产品核心卖点不能变表达方式可以变。比如“买二送一”改成印尼语的“Beli 2 Gratis 1”促销力度没变但表达更本地化。但如果 AI 把“买二送一”改成“Diskon Besar”大折扣那就偏离原意了必须拦截。为了控制这个“度”我在提示词里加了一条“不得改变促销力度、赠品数量、折扣比例等关键信息”。同时在程序里加了一个校验规则如果原文包含数字输出也必须包含对应的数字。比如原文有“2”输出里必须有“2”或者当地语言对应的数字词。这条规则拦住过好几次 AI 的“自由发挥”。另一个经验是小语种不要追求“信达雅”追求“看得懂、有冲击力”就行。泰语和越南语的语法结构跟中文差异很大强行追求优雅表达反而会让文案变长。主图文案的本质是广告短平快比语法正确更重要。我甚至会让 AI 故意用一些“不完整但有力”的短句比如印尼语的“Gratis Ongkir”包邮这在语法上不是完整句子但电商场景里完全没问题。4. 实操流程与批量生成实现4.1 环境准备与依赖安装整套流程跑在 Node.js 环境里版本建议 18 以上。核心依赖就三个node-canvas负责绘图sharp负责图片格式转换和压缩axios负责调用 AI 接口。安装命令如下npm init -y npm install canvas sharp axiosnode-canvas在 Windows 上安装偶尔会报错需要先装 GTK 或者用预编译版本。Mac 和 Linux 一般直接过。如果实在装不上可以用napi-rs/canvas替代API 基本兼容安装更省心。字体文件是另一个关键。东南亚各站点的主图字体我推荐这几套印尼语和马来语用 Montserrat 或 Poppins泰语用 Noto Sans Thai越南语用 Noto Sans 或者 Roboto。这些字体在 Google Fonts 上都能免费下载。把字体文件放在项目的fonts目录下用registerFont注册。const { registerFont } require(canvas); registerFont(./fonts/NotoSansThai-Regular.ttf, { family: NotoSansThai }); registerFont(./fonts/Montserrat-Bold.ttf, { family: Montserrat, weight: bold });注意泰语字体一定要选支持上下标元音的版本有些精简版字体缺字形渲染出来是方框。4.2 主图模板的配置化设计模板我用 JSON 来定义每个站点一个配置文件。配置里包含画布尺寸、文字区域坐标、字体、颜色、描边参数。这样做的好处是加新站点或者改版式时不用动代码改配置就行。{ site: shopee_id, canvas: { width: 1000, height: 1000 }, textBlocks: [ { id: headline, x: 500, y: 120, maxWidth: 900, fontFamily: Montserrat, fontWeight: bold, baseFontSize: 72, color: #FFFFFF, strokeColor: #FF0000, strokeWidth: 4, align: center }, { id: subline, x: 500, y: 220, maxWidth: 900, fontFamily: Montserrat, fontWeight: normal, baseFontSize: 48, color: #FFFF00, align: center } ] }maxWidth是文字区域的最大像素宽度字号计算函数会用它来反推。baseFontSize是基准字号实际字号会根据文案长度在这个基础上缩放。描边参数是为了让文字在复杂底图上也能看清东南亚主图风格偏热闹描边和阴影用得多。4.3 完整生成流程的代码实现整个流程分五步读取产品图、调用 AI 生成多语言文案、计算排版参数、Canvas 合成、批量导出。下面是一个简化但可运行的版本。const { createCanvas, loadImage, registerFont } require(canvas); const fs require(fs); const axios require(axios); // 字符宽度权重表 const CHAR_WEIGHTS { zh: 1.0, en_upper: 0.6, en_lower: 0.5, digit: 0.5, thai: 0.7, vi: 0.55 }; function calcWeightedLength(text, lang) { let total 0; for (const ch of text) { if (/[\u4e00-\u9fa5]/.test(ch)) total CHAR_WEIGHTS.zh; else if (/[A-Z]/.test(ch)) total CHAR_WEIGHTS.en_upper; else if (/[a-z]/.test(ch)) total CHAR_WEIGHTS.en_lower; else if (/[0-9]/.test(ch)) total CHAR_WEIGHTS.digit; else if (/[\u0e00-\u0e7f]/.test(ch)) total CHAR_WEIGHTS.thai; else total CHAR_WEIGHTS.vi; } return total; } function calcFontSize(text, lang, maxWidth, baseFontSize) { const weighted calcWeightedLength(text, lang); const unitWidth maxWidth / weighted; const size Math.min(baseFontSize, unitWidth * 1.8); return Math.max(size, 24); // 最小字号保护 } async function generateMainImage(productImagePath, texts, template, outputPath) { const img await loadImage(productImagePath); const canvas createCanvas(template.canvas.width, template.canvas.height); const ctx canvas.getContext(2d); ctx.drawImage(img, 0, 0, template.canvas.width, template.canvas.height); for (const block of template.textBlocks) { const text texts[block.id]; if (!text) continue; const fontSize calcFontSize(text, template.site, block.maxWidth, block.baseFontSize); ctx.font ${block.fontWeight} ${fontSize}px ${block.fontFamily}; ctx.textAlign block.align; ctx.textBaseline middle; if (block.strokeColor) { ctx.strokeStyle block.strokeColor; ctx.lineWidth block.strokeWidth; ctx.strokeText(text, block.x, block.y); } ctx.fillStyle block.color; ctx.fillText(text, block.x, block.y); } const buffer canvas.toBuffer(image/png); fs.writeFileSync(outputPath, buffer); }调用 AI 接口的部分我封装成了一个函数输入中文卖点和目标语言返回改写后的文案。这里用 axios 发请求提示词就是前面 3.1 节讲的那套。async function translateCopy(chineseText, targetLang) { const prompt 你是一个有五年经验的东南亚电商运营。 任务将以下中文卖点改写成${targetLang}主图文案。 约束字符数不超过20使用当地电商高频表达保留促销紧迫感不添加解释。 中文卖点${chineseText} 输出格式{text: 文案, char_count: 数字}; const response await axios.post(你的AI接口地址, { model: 你的模型名, messages: [{ role: user, content: prompt }], temperature: 0.3 }); const content response.data.choices[0].message.content; return JSON.parse(content).text; }temperature设成 0.3 是为了让输出稳定太高了每次改写结果差异大不利于批量处理时保持风格一致。4.4 批量处理与文件命名规范批量处理时我建议按“站点_产品ID_序号”的格式命名输出文件比如id_sku001_01.png、th_sku001_01.png。这样后续上传到各站点后台时不容易搞混。目录结构按站点分文件夹每个文件夹里放该站点的所有主图。处理速度方面单张图的 Canvas 合成大概 200 到 500 毫秒AI 调用取决于接口响应一般 1 到 3 秒。一个 SKU 六个站点六张图总耗时大概 20 到 30 秒。如果 SKU 数量多建议加一个并发控制同时处理 3 到 5 个不要一次性全发出去容易触发接口限流。实操心得AI 调用失败是常态网络抖动、接口限流、返回格式异常都可能发生。一定要加重试机制我一般设 3 次重试每次间隔 2 秒。重试时把 temperature 稍微调高一点有时候能绕过模型“卡壳”的情况。5. 常见问题与排查技巧实录5.1 文案溢出或过短的排查思路这是最高频的问题。表现是文字超出图片边界或者字号小到看不清。排查顺序是这样的先检查maxWidth配置是否跟实际文字区域匹配有时候模板改了但配置没同步。再检查字符宽度权重表是否覆盖了目标语言的所有字符类型比如印尼语里偶尔出现的阿拉伯语借词如果没覆盖会按默认权重算导致偏差。最后检查 AI 返回的文案是否超长如果超长是提示词约束没生效还是模型没遵守。我的经验是在提示词里把字符数上限设得比实际需要再低 10%。比如实际能放 20 个字符提示词里写 18。这样即使模型偶尔超一点也不会溢出。另外程序里一定要加一道“超长拦截”超过上限的文案直接打回重写不要硬塞。5.2 字体渲染异常的常见原因泰语和越南语最容易出字体问题。泰语如果字体不支持上下标元音渲染出来是方框或者错位。越南语如果字体缺少声调符号的字形声调会丢失或者叠在一起。解决办法只有一个用完整的 Noto Sans 系列字体不要用精简版。另外node-canvas在 Linux 上如果系统没装字体registerFont可能不生效需要把字体文件复制到系统字体目录或者用绝对路径注册。还有一个隐蔽的问题某些字体在 Canvas 里渲染时字重font-weight不生效。比如你设了 bold但渲染出来还是 regular。这是因为字体文件本身没有 bold 版本Canvas 不会自动合成。解决办法是单独注册 bold 字体文件或者在配置里指定具体的字体文件路径。5.3 AI 改写偏离原意的拦截策略前面提到过数字校验这是最有效的一道防线。除此之外我还加了一个“关键词保留”规则原文里的核心卖点词比如“包邮”“赠品”“保修”在输出里必须有对应表达。这个用简单的关键词映射表就能实现比如“包邮”对应印尼语的“Gratis Ongkir”、泰语的“ส่งฟรี”。如果输出里没有这些词就打回重写。另一个策略是限制改写幅度。我让 AI 在输出 JSON 里额外返回一个change_level字段取值 1 到 31 表示只翻译不改写3 表示大幅本地化改写。如果change_level是 3 但原文包含关键促销信息就人工复核一遍。这个字段是我在提示词里让模型自评的准确率大概八成但能拦住大部分离谱的改写。5.4 常见问题速查表问题现象可能原因排查方法解决方案文字溢出图片字号计算偏大或文案超长打印加权字符数和计算字号调低字符上限、检查权重表泰语文字重叠行高不足检查行高配置泰语行高设为 1.4 倍字体显示方框字体缺字形换字体测试使用完整 Noto Sans 系列AI 返回格式错误模型未遵守 JSON 格式打印原始返回内容提示词强调格式、加解析容错批量处理中断接口限流或网络抖动查看错误日志加并发控制和重试机制不同语言字号差异大权重表不准确对比实际渲染宽度微调权重值、按字体实测校准5.5 几个我踩过的坑第一个坑是忽略了图片压缩。Canvas 导出的 PNG 动辄两三兆批量上传时很慢。后来加了sharp做压缩转成 JPEG 质量 85体积降到 300K 左右肉眼看不出差异。但要注意如果主图有透明背景需求还是得用 PNG压缩时用pngquant这类工具。第二个坑是AI 接口的并发限制。我一开始图省事用Promise.all把所有请求一次性发出去结果接口直接返回 429。后来改成用p-limit控制并发数为 3稳定多了。这个库很小装一下就行。第三个坑是模板坐标写死。不同产品的底图构图不一样文字区域有时候会被产品挡住。后来我把文字区域做成可配置的每个产品可以微调坐标。再后来干脆加了一个简单的可视化工具在图上拖拽文字框自动生成配置 JSON。这个工具花了我半天时间写但后面省了无数调整坐标的时间。6. 效果验证与迭代方向6.1 怎么判断生成的主图“能用”生成出来的图我一般从三个维度检查。第一是信息完整性促销信息、产品卖点、价格有没有遗漏或错误。第二是视觉清晰度文字在手机屏幕上缩小到 200 像素宽时还能不能看清。第三是本地化自然度找当地的朋友或者用当地电商平台搜同类产品对比一下表达方式是否一致。我自己的标准是如果一张图需要人工修改超过两处那这张图就不合格得回头检查是提示词问题还是模板问题。批量跑一百张合格率能到 85% 以上这套流程就算跑通了。剩下的 15% 人工兜底总耗时也比纯手工做快五倍以上。6.2 后续可以扩展的方向这套流程跑通之后我陆续加了一些扩展功能。一个是A/B 文案测试同一个卖点生成两个版本上传后看哪个点击率高数据回流到词库里。另一个是自动适配平台规范比如 Shopee 要求主图不能有边框TikTok Shop 要求特定尺寸这些规则写进配置里生成时自动应用。再往远一点看可以把主图生成和商品上架流程打通。生成完图片直接调用平台的上架接口连手动上传都省了。不过这块涉及各平台的接口权限和审核规则得一个个对接工作量不小。我目前是把生成结果输出到一个待上传文件夹运营手动上传也算半自动化了。最后分享一个小技巧把各站点的优质竞品主图收集起来作为 AI 改写的参考样本。在提示词里加一句“参考以下风格”附上两三条当地竞品的文案AI 输出的本地化程度会明显提升。这个方法的成本几乎为零但效果立竿见影。我现在的词库里就存了几百条各站点的优质文案按品类和场景分类调用时随机抽几条作为参考生成结果的多样性也上来了。
返回列表