MediaPipe Tasks Vision 加载 vision_wasm_internal.wasm 失败?三步定位并修复
【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe
你在 MediaPipe Tasks Vision(npm 包@mediapipe/tasks-vision)里调用FilesetResolver.forVisionTasks时,控制台直接红字抛出vision_wasm_internal.wasm404,npm install却显示一切正常。重装依赖后问题依旧,模型一行代码都没跑起来。
读完你会拿到:
- 学会用一条命令确认 wasm 目录里缺了哪些文件
- 掌握不改代码就能把文件加载路径切到 CDN 的一行改法
- 学会把 4 个 wasm 文件手动补齐到
node_modules的标准位置 - 知道从源码重新构建 npm 包的入口,兜底所有疑难杂症
快速自检
命中任意一条就继续往下看:
- 控制台出现
vision_wasm_internal.wasm或vision_wasm_nosimd_internal.wasm的 404 / Failed to fetch node_modules/@mediapipe/tasks-vision/下根本没有wasm/目录,或目录里文件不全
底层机制
FilesetResolver.forVisionTasks(basePath)会先在浏览器里探测 SIMD 指令集支持(见mediapipe/tasks/web/core/fileset_resolver.ts.template),然后按固定命名拼路径:支持 SIMD 就取${basePath}/vision_wasm_internal.js和.wasm,不支持就取vision_wasm_nosimd_internal.*。
这 4 个文件(加 module 变体共 6 个)在构建发布时就打进 npm 包的wasm/目录(见mediapipe/tasks/web/vision/BUILD),并不是 postinstall 阶段现拉下来的。所以一旦本地包不完整,浏览器一请求就 404。
修复路径
方案 1|把 basePath 指到 CDN,一行改完(适合想最快恢复运行的人)⭐ 改动只有一行,不用碰本地安装,优先试它
适用条件:你的网络能访问cdn.jsdelivr.net,只是本地安装缺文件。
// 把 forVisionTasks 的 basePath 指向 npm 包在 CDN 上的 wasm 目录 const vision = await FilesetResolver.forVisionTasks( "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/wasm" );// 确认浏览器最终去取哪个文件,打开 Network 面板核对 console.log(vision.wasmLoaderPath, vision.wasmBinaryPath);预期看到:控制台打印出以cdn.jsdelivr.net/...开头的两个路径,Network 面板里对应请求 200,不再 404。
方案 2|手动下载 4 个文件补齐本地安装(适合需要完全离线运行的人)
适用条件:CDN 也不通,但机器能直连 Google Storage。
# 先确认本地到底缺哪些文件 ls node_modules/@mediapipe/tasks-vision/wasm/# 创建 wasm 目录并从官方 storage 下载 4 个文件 mkdir -p node_modules/@mediapipe/tasks-vision/wasm cd node_modules/@mediapipe/tasks-vision/wasm curl -O https://storage.googleapis.com/mediapipe-assets/wasm/tasks/web/vision/wasm/vision_wasm_internal.js curl -O https://storage.googleapis.com/mediapipe-assets/wasm/tasks/web/vision/wasm/vision_wasm_internal.wasm curl -O https://storage.googleapis.com/mediapipe-assets/wasm/tasks/web/vision/wasm/vision_wasm_nosimd_internal.js curl -O https://storage.googleapis.com/mediapipe-assets/wasm/tasks/web/vision/wasm/vision_wasm_nosimd_internal.wasm注意:URL 是仓库third_party/wasm_files.bzl里登记的源地址,文件名必须与下载到的完全一致,FilesetResolver不做任何重命名。
预期看到:ls能列出上面 4 个文件,且体积不为 0(wasm 文件应为 MB 级)。
方案 3|从源码重新构建 npm 包(适合要兜底或二次打包的人)
适用条件:前两种都不通,你要完全掌控产物。
# 拉取源码仓库 git clone https://gitcode.com/GitHub_Trending/med/mediapipe cd mediapipe# 按仓库构建规则重新打包 vision npm 包(需先装好 Bazel) bazel build //mediapipe/tasks/web/vision:vision_pkg构建规则在mediapipe/tasks/web/vision/BUILD,它声明了 6 个 wasm 文件和 bundle 的打包内容。把产物里的wasm/目录整体拷进node_modules/@mediapipe/tasks-vision/即可。
预期看到:包目录下的wasm/文件齐全,与wasm_files.bzl中登记的 6 个文件一一对应。
验证与收尾
// 最小验证脚本:在浏览器 Console 或本地页面里跑 import { FilesetResolver } from "@mediapipe/tasks-vision"; try { const f = await FilesetResolver.forVisionTasks("https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/wasm"); console.log("ok", f.wasmLoaderPath); } catch (e) { console.error("still broken:", e.message); }成功标志:控制台输出ok加一个完整的 jsdelivr 路径;如果还是still broken,多半是网络策略拦了 CDN,回方案 2 走本地文件。
升级依赖后避免复发:
package.json里写死精确版本号,不用^/~- 把修好的
wasm/目录拷进项目public/并提交,构建时统一引用,不再依赖node_modules完整性
搞定了就继续撸吧。
【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考