Ubuntu Docker环境下Python脚本依赖冲突解决:Coqui与NeMo兼容问题
解决同一脚本内的transformers版本冲突问题
针对你遇到的Coqui XTTS(需transformers==4.35.2)和NeMo(需transformers>=4.41.0)的依赖冲突,除了微服务架构,还有以下几个简单可行的方案:
方案一:用子进程+独立虚拟环境隔离依赖
这是最稳妥的方式,把两个依赖冲突的模块分别放在独立的虚拟环境中,主脚本通过异步子进程调用各自环境下的处理脚本:
- 创建两个隔离的虚拟环境
在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
- 拆分功能脚本
- 编写
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)
- 主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
相关产品推荐
相关产品推荐

