莫名其妙的就报错了,不过通过GPT还是找到了解决方法:
找到那个报错的文件,可能是
C:\Users\用户名\AppData\Local\Programs\Python\Python37\Lib\site-packages\speech_recognition\__init__.py
找到里面报错的那个函数get_model_path:
def get_model_path(subpath=None):
"""Return path to the model directory, or optionally, a specific file
or directory within it.
If the POCKETSPHINX_PATH environment variable is set, it will be
returned here, otherwise the default is determined by your
PocketSphinx installation, and may or may not be writable by you.
Args:
subpath: An optional path to add to the model directory.
Returns:
The requested path within the model directory.
"""
model_path = pocketsphinx._ps_default_modeldir()
if model_path is None:
# Use importlib to find things (so editable installs work)
model_path = importlib.util.find_spec(
"pocketsphinx.model"
).submodule_search_locations[0] # ←就是这里报错
if subpath is not None:
return os.path.join(model_path, subpath)
else:
return model_path
将该函数修改一下(虽然不太妥,但是可以):
def get_model_path(subpath=None):
"""Return path to the model directory, or optionally, a specific file
or directory within it.
If the POCKETSPHINX_PATH environment variable is set, it will be
returned here, otherwise the default is determined by your
PocketSphinx installation, and may or may not be writable by you.
Args:
subpath: An optional path to add to the model directory.
Returns:
The requested path within the model directory.
"""
model_path = pocketsphinx._ps_default_modeldir()
if model_path is None:
# Use importlib to find things (so editable installs work)
model_spec = importlib.util.find_spec("pocketsphinx.model")
if model_spec is not None:
model_path = next(iter(model_spec.submodule_search_locations), None)
if subpath is not None:
return os.path.join(model_path, subpath)
else:
return model_path
GPT留言:
根据你提供的代码和错误信息,看起来问题可能出在 importlib.util.find_spec(“pocketsphinx.model”).submodule_search_locations[0] 这一行。这行代码的目的是查找 pocketsphinx 模块的位置,然后返回其路径。
然而,错误信息 TypeError: ‘_NamespacePath’ object does not support indexing
表明 _NamespacePath 对象不支持索引操作,这意味着它被当做一个列表或元组来使用,但它不支持这种操作。
在 Python 中,find_spec() 返回的对象是 ModuleSpec 类型,而
submodule_search_locations 是一个 _NamespacePath
对象。通常情况下,submodule_search_locations
会包含模块的路径,但它并不是一个标准的列表或元组,因此无法通过索引来访问。
为了解决这个问题,可以尝试修改代码,以适应 submodule_search_locations 的返回类型。一种可能的解决方法是使用
next() 函数来获取第一个路径。
就没事了。