如何用Node.js向Replicate API上传文件调用SadTalker模型
解决SadTalker API调用的"Unprocessable Entity"错误
你的代码存在两个核心问题,导致API返回"Unprocessable Entity"错误:
1. 未正确传递文件参数
原代码中,在fs.readFile的回调里调用getVideo()时,没有把读取到的inputImage和inputAudio传递给函数,导致函数内这两个变量为undefined,API无法解析无效的输入。
2. 嵌套回调的写法缺陷
嵌套的fs.readFile回调不仅容易造成回调地狱,还缺失了错误处理逻辑,无法排查文件读取失败的情况。
修正方案(推荐写法)
直接使用本地文件路径传递给Replicate API,SDK会自动处理文件读取,代码更简洁:
import Replicate from "replicate"; import dotenv from "dotenv"; dotenv.config(); async function getVideo() { const replicate = new Replicate({ auth: process.env.REPLICATE_API_TOKEN, }); try { const output = await replicate.run( "cjwbw/sadtalker:3aa3dac9353cc4d6bd62a8f95957bd844003b401ca4e4a9b33baa574c549d376", { input: { source_image: "./deepfakeImage.jpg", driven_audio: "./deepfakeAudio.mp3" } } ); console.log("生成的视频URL:", output); } catch (err) { console.error("API调用失败:", err); } } getVideo();
备选方案(手动读取Buffer)
如果需要手动读取文件为Buffer传递,使用fs.promises的异步写法避免回调地狱:
import Replicate from "replicate"; import dotenv from "dotenv"; import fs from "fs/promises"; dotenv.config(); async function getVideo() { const replicate = new Replicate({ auth: process.env.REPLICATE_API_TOKEN, }); try { // 异步读取文件为Buffer const inputImage = await fs.readFile("./deepfakeImage.jpg"); const inputAudio = await fs.readFile("./deepfakeAudio.mp3"); const output = await replicate.run( "cjwbw/sadtalker:3aa3dac9353cc4d6bd62a8f95957bd844003b401ca4e4a9b33baa574c549d376", { input: { source_image: inputImage, driven_audio: inputAudio } } ); console.log("生成的视频URL:", output); } catch (err) { console.error("操作失败:", err); } } getVideo();
额外检查项
- 确认
.env文件中的REPLICATE_API_TOKEN配置正确,且该密钥有权限访问SadTalker模型。 - 确保图片和音频文件路径正确,相对于代码执行的当前工作目录。
- 验证文件格式:图片需为清晰的人像照片(JPG/PNG),音频为标准MP3格式,时长建议控制在5分钟以内。
内容的提问来源于stack exchange,提问作者Leotheperegrine
相关产品推荐
相关产品推荐

