ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Duix.Avatar 添加数字人模型报 “SQLite3 can only bind“ 错误?3步快速定位 false 的来源

2026/9/11 16:49:31 拓冰建站 浏览量
Duix.Avatar 添加数字人模型报 “SQLite3 can only bind“ 错误?3步快速定位 false 的来源 Duix.Avatar 添加数字人模型报 SQLite3 can only bind 错误3步快速定位 false 的来源【免费下载链接】Duix-Avatar Truly open-source AI avatar(digital human) toolkit for offline video generation and digital human cloning.项目地址: https://gitcode.com/GitHub_Trending/he/Duix-Avatar你在 Duix.Avatar 里新建数字人模特上传视频点下提交界面右上角突然弹出一串红字Error invoking remote method model/addModel: TypeError: SQLite3 can only bind numbers, strings, bigints, buffers, and null看着像数据库坏了其实只是一个布尔值 false 被塞进了 SQLite 的整数列。下面带你走一遍完整的排查路径。这句报错在说什么先把报错逐词翻译成人话。Error invoking remote method model/addModel 的意思是渲染进程通过 Electron 的 IPC 通道喊了一声model/addModel主进程接住之后干活时摔了。TypeError: SQLite3 can only bind numbers, strings, bigints, buffers, and null 才是摔的原因——主进程往本地 SQLite 写数据时五个参数里有一个不在数字、字符串、大整数、缓冲区、null这五件套白名单里。为什么传个 false 会炸SQLite 就像一个只收五类快递的仓库布尔值 false 是第六种包裹仓库保安看了一眼直接罢工而且它不帮你把包裹换成认识的格式。SQLite 本身就没有布尔类型业界惯例是用整数 0 和 1 表示假和真绑定层也不会替你自动转换。再把当时执行的 SQL 参数摊开看(aaa, 20250405012435008.mp4, origin_audio/...wav, false, 1743787484937)第四个参数 voice_id 是 false。这个字段本该是 voice 表里一条语音克隆记录的 ID怎么会是个布尔值这就是排查的起点。这行 false 是怎么混进来的先别改代码翻日志。客户端日志的取法右上角设置 → 打开日志目录找到 main.log在 main.log 里搜索train ~ res你会在红色报错的上一行看到一条更早的信号~ train ~ res: { code: -1, msg: NoneType object has no attribute send }注意SQLite 绑定报错之前语音训练就已经失败了code -1只是代码带伤前行没把错误抛出来。顺着这个线索 grep 源码。先看 src/main/service/voice.js 里的 train 函数关键就这两行if (res.code ! 0) { return false // 训练失败静默返回布尔值 false }这就是 false 的产地训练失败时不抛错而是把布尔值 false 当返回值传出去了。再看调用方 src/main/service/model.js 的 addModel它把 train 的返回不加任何判断地接住return trainVoice(relativeAudioPath, zh).then((voiceId) { const id insert({ modelName, videoPath, audioPath, voiceId }) })最后落到 src/main/dao/f2f-model.js 的stmt.run(modelName, videoPath, audioPath, voiceId, Date.now())false 被绑定到 f2f_model 表的 voice_id 列上SQLite 当场罢工。到这里链条通了但别急着收工——训练为什么失败去服务端看 Duix.Avatar-tts 容器的日志里面有一模一样的NoneType object has no attribute send这是 tts 服务调用 asr 服务的 websocket 没连上asr 服务还没就绪。官方 FAQ 里也写过这个坑asr 启动比较慢服务全部 Running 后等几分钟再操作内存偏小的机器可能根本起不来。完整因果链是asr 没就绪 → preprocess_and_tran 返回 code:-1 → train 返回 false → false 被插入整数列 → SQLite 报了一个最不像病根的错。最小修复动作只推荐一种改法改 src/main/service/voice.js train 函数里的那一行约第 26 行把静默的return false改成抛错if (res.code ! 0) { throw new Error(语音训练失败: res.msg) }只动一个文件一行代码不碰数据库 schema。为什么不推荐把 false 转成 0 再插入那样虽然能过 SQLite 这一关但 voice_id0 指向一条不存在的语音记录模特会创建成功可下次用它生成视频时 selectByID(0) 查不到东西你又会在更下游遇到一个更费解的报错——病没治只是转移了症状。改成抛错后界面会直接提示语音训练失败: NoneType object has no attribute send一眼就能定位到服务端。而你这次故障的根治操作不改代码重启三个 docker 服务等全部 Running 后等几分钟再点创建。低内存环境的具体排查可以看仓库里的 doc/常见问题.md。防坑一句话下次遇到 SQLite can only bind 类报错先盯着参数列表找那个格格不入的值九成是布尔值没转整数、或者上游把失败标记 false 当成了正常返回值。上游函数失败时return false而不是抛错下游数据库就会替它背锅。排查时从日志里第一条code ! 0开始看别从最后那条报错开始看。【免费下载链接】Duix-Avatar Truly open-source AI avatar(digital human) toolkit for offline video generation and digital human cloning.项目地址: https://gitcode.com/GitHub_Trending/he/Duix-Avatar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考