CosyVoice环境安装报错:安装openai-whisper时出现ModuleNotFoundError: No module named ‘pkg_resources‘的原因

先说如何解决,我个人采用源码安装,安装时禁用构建隔离:
git clone https://github.com/openai/whisper.git
cd whisper
git checkout v20231117
pip install -e . --no-build-isolation

再说该问题产生的原因,下面是大D老师的回答,自行参考。

太棒了!你找到了正确的解决方案。让我详细解释为什么会出现这个问题,以及为什么 --no-build-isolation 能解决它。

🔍 问题根源分析

问题的关键在于 PEP 517/518 构建隔离机制和你的 setup.py 实现方式。

1. 构建隔离机制 (Build Isolation) 的工作原理

当你执行 pip install -e .(不带 --no-build-isolation)时,pip 会:

1. 创建一个临时的、干净的虚拟环境(在 /tmp/pip-build-env-xxx/) 2. 在这个隔离环境中只安装 pyproject.toml 中 [build-system] 要求的包 3. 在隔离环境中执行构建(运行 setup.py) 4. 将构建产物安装到你的目标环境 

2. 为什么你的构建会失败

看你的 setup.py 第5行:

import pkg_resources # 这行在构建的早期阶段就需要

问题出在第30行附近:

install_requires=requirements +[str(r)for r in pkg_resources.parse_requirements(open(os.path.join(os.path.dirname(__file__),"requirements.txt")))],

关键问题pkg_resources.parse_requirements()模块导入级别就被执行了!

这意味着:

  • Python 在解析 setup.py 时,立即执行了 import pkg_resources
  • 但在隔离的构建环境中,默认没有安装 setuptools
  • 因此 pkg_resources 不存在,导致 ModuleNotFoundError

3. 构建环境 vs 目标环境的区别

┌─────────────────────┐ ┌─────────────────────┐ │ 目标虚拟环境 │ │ 隔离构建环境 │ │ (cosyvoice) │ │ (临时) │ ├─────────────────────┤ ├─────────────────────┤ │ ✓ setuptools 81.0.0 │ │ ✗ setuptools 未安装 │ │ ✓ pkg_resources │ │ ✗ pkg_resources │ │ ✓ 所有项目依赖 │ │ 只有构建基础包 │ └─────────────────────┘ └─────────────────────┘ ↑ ↑ └────── pip install -e . ──────┘ 需要同时满足两者 

💡 为什么 --no-build-isolation 能解决

pip install-e. --no-build-isolation 

这个命令告诉 pip:“不要创建隔离的构建环境,直接在当前激活的虚拟环境中构建

于是流程变成:

┌─────────────────────┐ │ 目标虚拟环境 │ │ (cosyvoice) │ ├─────────────────────┤ │ ✓ setuptools 81.0.0 │ ←── 直接在同一个环境中执行构建 │ ✓ pkg_resources │ 和安装 │ ✓ 所有项目依赖 │ └─────────────────────┘ ↓ pip install -e . (无隔离环境) 

因为你的虚拟环境中已经有 setuptools,所以 import pkg_resources 可以成功执行。

📝 更好的修复方式

虽然 --no-build-isolation 解决了问题,但更好的做法是修改 setup.py,使其在隔离环境中也能工作:

import os import platform import sys from setuptools import find_packages, setup # 延迟导入 pkg_resources,或使用 try/exceptdefget_install_requires():"""延迟解析 requirements.txt,避免构建时依赖""" requirements =[]if sys.platform.startswith("linux")and platform.machine()=="x86_64": requirements.append("triton>=2.0.0,<3")# 只在需要时导入 pkg_resourcestry:import pkg_resources req_file = os.path.join(os.path.dirname(__file__),"requirements.txt")withopen(req_file, encoding="utf-8")as f: requirements.extend([str(r)for r in pkg_resources.parse_requirements(f)])except ImportError:# 降级方案:简单读取 requirements.txt req_file = os.path.join(os.path.dirname(__file__),"requirements.txt")withopen(req_file, encoding="utf-8")as f: requirements.extend([ line.strip()for line in f if line.strip()andnot line.startswith("#")])return requirements defread_version(fname="whisper/version.py"):exec(compile(open(fname, encoding="utf-8").read(), fname,"exec"))returnlocals()["__version__"] setup( name="openai-whisper", py_modules=["whisper"], version=read_version(), description="Robust Speech Recognition via Large-Scale Weak Supervision", long_description=open("README.md", encoding="utf-8").read(), long_description_content_type="text/markdown", readme="README.md", python_requires=">=3.8", author="OpenAI", url="https://github.com/openai/whisper", license="MIT", packages=find_packages(exclude=["tests*"]), install_requires=get_install_requires(),# 使用函数延迟解析 entry_points={"console_scripts":["whisper=whisper.transcribe:cli"],}, include_package_data=True, extras_require={"dev":["pytest","scipy","black","flake8","isort"]},)

🎯 总结

问题原因解决方案
ModuleNotFoundError: No module named 'pkg_resources'构建隔离环境中没有 setuptools,但 setup.py 在模块级别导入 pkg_resources1. ✅ --no-build-isolation 跳过隔离环境
2. 修改 setup.py 延迟导入 pkg_resources

你使用的 --no-build-isolation 是完全正确的临时解决方案。对于长期使用,可以考虑向项目提交 PR 修改 setup.py,使其构建时不需要预先存在的 setuptools。

Read more

亲测BGE-M3 WebUI:多语言语义匹配效果超预期

亲测BGE-M3 WebUI:多语言语义匹配效果超预期 你有没有遇到过这样的问题: 用户搜索“手机充电慢”,知识库却只返回“电池续航差”的文档; 客服系统把“退款申请”和“换货流程”当成完全无关的请求; 跨语言产品文档中,英文FAQ和中文帮助页无法自动关联…… 这些不是模型不够聪明,而是传统关键词匹配早已力不从心。直到我点开这个镜像——🧠 BAAI/bge-m3 语义相似度分析引擎,输入两段看似无关的文字,按下“分析”键,屏幕上跳出一个数字:87.3%。那一刻我才真正意识到:AI终于开始“理解”文字背后的意思了。 这不是理论推演,也不是参数堆砌,而是一个开箱即用、无需代码、连CPU都能跑得飞快的Web界面。今天这篇实测笔记,不讲原理、不列公式,只说三件事:它到底能做什么、在哪些场景下真的好用、以及你第一次打开时最该注意什么。 1. 为什么说这是目前最实用的语义匹配工具? 1.1 不是“

Git-RSCLIP智能相册开发:Vue前端+Node.js后端全栈实现

Git-RSCLIP智能相册开发:Vue前端+Node.js后端全栈实现 你是不是也有过这样的经历?手机里存了几千张照片,想找一张“去年夏天在海边拍的、有红色遮阳伞和狗狗”的照片,结果翻了半小时也没找到。传统的相册应用只能按时间、地点或手动添加的标签来搜索,一旦标签没打好,照片就像石沉大海。 现在,情况不一样了。想象一下,你只需要在搜索框里输入“红色汽车的照片”,或者“有彩虹的风景照”,系统就能瞬间从成千上万张照片中精准地找到它们。这听起来像是科幻电影里的场景,但今天,我们就要用Git-RSCLIP模型,结合Vue3和Node.js,亲手把它变成现实。 这篇文章,我就带你一步步搭建一个基于自然语言搜索的智能相册系统。我们不用去理解复杂的深度学习算法,而是聚焦于如何将前沿的AI能力,通过一套清晰、可落地的全栈技术方案,变成一个真正能用的产品。无论你是前端开发者想了解如何接入AI能力,还是后端工程师想学习向量数据库的应用,都能在这里找到答案。 1. 为什么我们需要智能相册? 在开始敲代码之前,我们先聊聊为什么传统的相册管理方式已经不够用了。 我自己的手机里大概有8000多张照

Qwen3Guard-Gen-WEB部署教程:开源安全审核模型一键部署实战

Qwen3Guard-Gen-WEB部署教程:开源安全审核模型一键部署实战 1. 引言 1.1 业务场景描述 随着大语言模型在内容生成、智能客服、社交平台等领域的广泛应用,用户生成内容(UGC)的安全性问题日益突出。不当言论、敏感信息、恶意诱导等内容可能对平台声誉和合规运营带来巨大风险。因此,构建高效、精准的内容安全审核机制成为AI应用落地的关键环节。 阿里云推出的 Qwen3Guard-Gen 是一款专为大模型输出内容设计的开源安全审核模型,能够自动识别并分级处理潜在风险内容,适用于多语言、高并发的生产环境。本文将详细介绍如何通过镜像方式快速部署 Qwen3Guard-Gen-WEB 版本,实现可视化网页端的安全内容检测功能。 1.2 痛点分析 传统内容审核方案存在以下典型问题: * 规则引擎覆盖有限:依赖关键词匹配,难以应对语义变体和上下文隐含风险。 * 第三方服务成本高:商用API调用费用随流量增长而上升,长期使用负担重。 * 响应延迟高:远程调用存在网络开销,影响实时交互体验。 * 不支持私有化部署:数据需上传至外部服务器,存在隐私泄露风险。 基于以上