You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu Docker环境下Python脚本依赖冲突解决:Coqui与NeMo兼容问题

解决同一脚本内的transformers版本冲突问题

针对你遇到的Coqui XTTS(需transformers==4.35.2)和NeMo(需transformers>=4.41.0)的依赖冲突,除了微服务架构,还有以下几个简单可行的方案:

方案一:用子进程+独立虚拟环境隔离依赖

这是最稳妥的方式,把两个依赖冲突的模块分别放在独立的虚拟环境中,主脚本通过异步子进程调用各自环境下的处理脚本:

  1. 创建两个隔离的虚拟环境
    在Docker镜像中执行以下命令:
# 创建Coqui专属环境
python -m venv /opt/coqui_env
/opt/coqui_env/bin/pip install TTS==0.22.0 transformers==4.35.2

# 创建NeMo专属环境
python -m venv /opt/nemo_env
/opt/nemo_env/bin/pip install nemo_toolkit[asr] transformers>=4.41.0
  1. 拆分功能脚本
  • 编写coqui_tts.py:负责处理文本转语音逻辑,从标准输入读取文本,将音频数据输出到标准输出
    import sys
    import soundfile as sf
    from TTS.api import TTS
    
    tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2", gpu=True)
    text = sys.stdin.read().strip()
    audio = tts.tts(text)
    sf.write(sys.stdout.buffer, audio, samplerate=24000, format='WAV')
    
  • 编写nemo_asr.py:负责处理语音转文本逻辑,从标准输入读取音频数据,输出识别结果
    import sys
    import soundfile as sf
    from nemo.collections.asr.models import ASRModel
    
    model = ASRModel.from_pretrained("nvidia/stt_en_fastconformer_hybrid_large")
    audio_data, samplerate = sf.read(sys.stdin.buffer)
    text = model.transcribe([audio_data])[0]
    print(text)
    
  1. 主WebSocket脚本异步调用子进程
    在你的asyncio循环中,用asyncio.create_subprocess_exec异步调用两个环境的脚本,通过标准输入输出传递数据:
import asyncio
import websockets
import subprocess

async def handle_websocket(websocket):
    async for message in websocket:
        # 调用NeMo做语音转文本
        nemo_proc = await asyncio.create_subprocess_exec(
            "/opt/nemo_env/bin/python", "/opt/scripts/nemo_asr.py",
            stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE
        )
        stdout, _ = await nemo_proc.communicate(input=message)
        asr_text = stdout.decode().strip()

        # 调用Coqui做文本转语音
        coqui_proc = await asyncio.create_subprocess_exec(
            "/opt/coqui_env/bin/python", "/opt/scripts/coqui_tts.py",
            stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE
        )
        tts_audio, _ = await coqui_proc.communicate(input=asr_text.encode())

        await websocket.send(tts_audio)

async def main():
    async with websockets.serve(handle_websocket, "0.0.0.0", 8765):
        await asyncio.Future()  # 保持服务运行

if __name__ == "__main__":
    asyncio.run(main())

方案二:寻找兼容的中间版本

尝试查找同时满足两个库要求的transformers版本,或者调整库的版本:

  • 检查Coqui XTTS的新版本:比如TTS 0.23.0及以上是否支持transformers>=4.41.0,若支持则直接升级Coqui,统一用高版本transformers
  • 检查NeMo的旧版本:比如nemo_toolkit 1.20.0对transformers的要求是>=4.33.0,这个版本可以兼容4.35.2,若你的ASR功能不需要NeMo的最新特性,可以降级NeMo到该版本,统一用transformers==4.35.2

这种方式不需要额外的进程隔离,配置更简单,但需要验证版本兼容性,避免功能缺失。

方案三:动态加载不同版本库(不推荐)

通过importlib手动指定库的路径来加载不同版本的transformers,但这种方式容易引发全局状态冲突,比如其他依赖库可能会共享transformers的全局变量,导致不可预料的错误,仅作为最后的备选方案。

内容的提问来源于stack exchange,提问作者Nathanael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:03:23