在Jenkins任务中使用Coqui-ai TTS遇FileNotFoundError问题求助
解决Jenkins中运行Coqui-AI TTS脚本的FileNotFoundError问题
错误详情
在Jenkins任务中执行TTS脚本时出现以下错误:
C:\ProgramData\Jenkins\.jenkins\workspace\Dziennik\scripts>python tts.py --input_text_file_path DU/2025/658 Traceback (most recent call last): File "C:\ProgramData\Jenkins\.jenkins\workspace\Dziennik\scripts\tts.py", line 34, in <module> api = TTS(model_name="tts_models/pl/mai_female/vits") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Ja\AppData\Local\Programs\Python\Python311\Lib\site-packages\TTS\api.py", line 64, in __init__ self.manager = ModelManager(models_file=self.get_models_file_path(), progress_bar=progress_bar, verbose=False) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Ja\AppData\Local\Programs\Python\Python311\Lib\site-packages\TTS\utils\manage.py", line 51, in __init__ self.output_prefix = get_user_data_dir("tts") ^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Ja\AppData\Local\Programs\Python\Python311\Lib\site-packages\TTS\utils\generic_utils.py", line 139, in get_user_data_dir key = winreg.OpenKey( ^^^^^^^^^^^^^^^ FileNotFoundError: [WinError 2] Nie mo�na odnale�� okre�lonego pliku
问题原因
脚本在本地CMD正常运行,但Jenkins中失败,核心原因是Jenkins运行的系统账户与本地用户权限/环境不一致:
Coqui TTS的get_user_data_dir函数会通过Windows注册表读取当前用户的AppData目录,而Jenkins默认使用Local System账户运行,该账户没有常规用户的注册表项和用户目录访问权限,导致无法找到对应文件。
解决方案
1. 修改Jenkins服务的运行账户
将Jenkins服务的运行账户改为你本地运行脚本的用户(比如Ja):
- 打开Windows服务管理器,找到
Jenkins服务 - 右键选择「属性」,切换到「登录」选项卡
- 选择「此账户」,输入你的用户名和密码,点击「应用」
- 重启Jenkins服务,重新执行任务
2. 手动指定TTS数据目录
通过环境变量或代码强制指定Coqui TTS的存储目录,避免读取注册表:
方法A:在Jenkins任务中设置环境变量
- 进入Jenkins任务的「配置」页面,找到「构建环境」
- 勾选「设置环境变量」,添加变量
TTS_HOME,值设为Jenkins有权限读写的路径(比如C:\ProgramData\Jenkins\.jenkins\tts_data) - 保存配置后重新执行任务
方法B:在脚本中直接设置环境变量
在初始化TTS对象之前添加以下代码:
import os # 替换为实际可读写的路径 os.environ['TTS_HOME'] = 'C:\ProgramData\Jenkins\.jenkins\tts_data'
3. 检查Jenkins工作空间权限
确保Jenkins工作空间目录(C:\ProgramData\Jenkins\.jenkins\workspace\Dziennik)对运行Jenkins的用户有读写权限:
- 右键工作空间目录,选择「属性」-「安全」
- 添加Jenkins运行账户,勾选「读取」「写入」等必要权限
- 点击「应用」保存设置
关联脚本
用户使用的TTS脚本:
from TTS.api import TTS import torch import io import argparse # arg parser parser = argparse.ArgumentParser() parser.add_argument('--input_text_file_path', dest='input_text_file_path', type=str, help='Add input_text_file_path') args = parser.parse_args() # Save the original torch.load function _original_torch_load = torch.load # Define a new function that forces weights_only=False def custom_torch_load(*args, **kwargs): if "weights_only" not in kwargs: kwargs["weights_only"] = False return _original_torch_load(*args, **kwargs) # Override torch.load globally torch.load = custom_torch_load def import_text_file(file_name): with io.open(f"{file_name}.txt", 'r', encoding="utf-8") as file: return file.read().replace('\n', '') # TTS with on the fly voice conversion api = TTS(model_name="tts_models/pl/mai_female/vits") api.tts_to_file( text=import_text_file(args.input_text_file_path.replace('/', '_')), speaker_wav="target/speaker.wav", file_path=f"{args.input_text_file_path.replace('/', '_')}.wav" )
内容的提问来源于stack exchange,提问作者Szelek
相关产品推荐
相关产品推荐

