为何speech_recognition在命令行正常却在PostgreSQL plpython3u中报错
错误原因
该报错的根本原因是谷歌speech_recognition库在调用语音识别接口前,需要先将音频文件转换为FLAC格式,该过程依赖系统安装的flac命令行工具。PostgreSQL的plpython3u运行环境使用的是postgres用户的环境变量,其PATH路径中没有包含flac工具的安装位置,导致库中查找工具的shutil.which()方法返回None,后续代码尝试对None调用split方法就触发了该空属性异常。
你在命令行运行正常是因为登录用户的PATH环境变量已经包含了flac的安装路径,和postgres用户的环境配置不一致。
解决步骤
- 首先登录服务器命令行,执行以下命令确认
flac工具的实际安装路径:which flac
执行后会返回路径,常见值为/usr/bin/flac或/usr/local/bin/flac,记下来备用。 - 选择以下任意一种方案修复即可:
方案1:修改函数代码手动指定工具路径(推荐,无需改动数据库全局配置)
直接在你的plpython3u函数中添加一行代码,手动指定speech_recognition库使用的flac路径,修改后的函数代码如下:
CREATE OR REPLACE FUNCTION ivr.boot_action1_pyhon(name_file character varying) RETURNS character varying LANGUAGE plpython3u AS $function$ import speech_recognition as sr # 替换为你刚才查到的flac实际路径 sr.AudioFile.converter = "/usr/bin/flac" r = sr.Recognizer() with sr.AudioFile('/var/boot/pcm.wav') as source: a=r.record(source) tt=r.recognize_google(a) return tt $function$;
方案2:修改PostgreSQL服务的PATH环境变量
如果你有多个函数需要用到该工具,可以修改PostgreSQL的运行环境配置,将flac所在路径加到postgres用户的PATH中:
- 对于systemd管理的PostgreSQL服务,新建配置文件
/etc/systemd/system/postgresql@15-main.service.d/override.conf(路径中15要替换为你实际使用的PostgreSQL大版本号),写入以下内容:
[Service] Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
- 执行
systemctl daemon-reload重载配置,再执行systemctl restart postgresql重启数据库服务即可生效。
- 额外检查:确认postgres用户对
/var/boot/pcm.wav文件有读取权限,避免后续出现权限类报错。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

