Python语音助手模块路径问题:model.pt文件找不到
问题描述
使用Python 3.11.6开发语音助手,项目结构包含:
Synthesizer包:内部有main.py和model.pt文件,main.py中Synthesizer类的download_model方法通过self.local_file="model.pt"指定模型文件路径Core包:通过from Synthesizer.main import Synthesizer导入类,但运行Core时无法找到model.pt,将model.pt放入Core目录可正常运行,希望将所有资源归类到对应包内,同时需处理语音识别模型等其他外部文件的归类问题。
解决方案
核心是修改资源文件的路径引用方式,让程序始终从对应包的目录中查找资源,而非依赖运行时的工作目录:
1. 修改Synthesizer包内的路径逻辑
在Synthesizer/main.py中,替换硬编码的相对路径,改为基于当前脚本目录的绝对路径:
方法1:使用os.path模块
import os import torch class Synthesizer: def __init__(self): # 获取当前main.py所在目录,拼接model.pt路径 self.local_file = os.path.join(os.path.dirname(__file__), "model.pt") def download_model(self, url="https://models.silero.ai/models/tts/ru/v4_ru.pt"): """ Function for downloading voice model :param url: address for downloading voice model """ if not os.path.isfile(self.local_file): torch.hub.download_url_to_file(url, self.local_file)
方法2:使用pathlib模块(Python 3.4+推荐)
from pathlib import Path import torch class Synthesizer: def __init__(self): # 获取当前main.py所在目录,拼接model.pt路径 self.local_file = str(Path(__file__).parent / "model.pt") def download_model(self, url="https://models.silero.ai/models/tts/ru/v4_ru.pt"): """ Function for downloading voice model :param url: address for downloading voice model """ if not Path(self.local_file).exists(): torch.hub.download_url_to_file(url, self.local_file)
2. 其他资源文件的统一处理逻辑
对于语音识别模型等其他包内资源,采用完全相同的方式:
- 将资源文件放在对应功能的包目录下(比如语音识别模型放入
ASR包内) - 在包内的代码中,通过
__file__属性获取当前脚本所在目录,再拼接资源文件名,确保路径指向包内的资源文件
3. 优化包结构(可选)
为每个包添加__init__.py文件(即使Python 3.3+支持无文件包),明确包的结构,同时可以在__init__.py中导出核心类,简化导入语句:
比如在Synthesizer/__init__.py中添加:
from .main import Synthesizer
这样Core包中可以直接用from Synthesizer import Synthesizer导入,更简洁。
内容的提问来源于stack exchange,提问作者Илья Мирошниченко
相关产品推荐
相关产品推荐

