Windows10下通过PHP调用vosk-cli.exe执行无响应问题求助
解决Windows 10下PHP调用vosk-cli.exe无响应的问题
以下是针对性的排查和解决方法:
检查PHP运行权限
PHP通常以IIS_IUSRS(IIS环境)或www-data(Apache环境)用户身份运行,这些系统用户可能没有vosk-cli.exe所在目录、输入文件file.wav的访问权限。给C:/Users/joe/AppData/Local/Programs/Python/Python311/Scripts/目录及file.wav所在目录,添加对应运行用户的读取/执行权限。补全绝对路径
PHP的工作目录大概率和你手动运行CMD时的目录不同,必须给输入、输出文件指定绝对路径,路径含空格时用双引号包裹:$inputPath = realpath(__DIR__ . '/file.wav'); $outputPath = __DIR__ . '/file.ddt'; $com = "C:/Users/joe/AppData/Local/Programs/Python/Python311/Scripts/vosk-cli.exe -i \"$inputPath\" -o \"$outputPath\""; exec($com, $output, $retval);捕获错误输出
默认exec()只捕获标准输出,把错误输出重定向到标准输出,就能看到具体报错信息(比如缺少依赖、模型路径错误):$com = "C:/Users/joe/AppData/Local/Programs/Python/Python311/Scripts/vosk-cli.exe -i file.wav -o file.ddt 2>&1"; exec($com, $output, $retval);确认Vosk模型路径
vosk-cli.exe运行依赖模型文件,CMD能正常执行是因为当前环境包含模型路径,但PHP进程的环境变量可能未配置。可以在命令中直接指定模型路径(如果支持-m参数),或者先切换到模型所在目录再执行命令:$com = "cd C:/path/to/vosk-model && C:/Users/joe/AppData/Local/Programs/Python/Python311/Scripts/vosk-cli.exe -i file.wav -o file.ddt";用proc_open替代exec排查
proc_open能更精细地控制进程,分别捕获标准输出和错误输出,适合定位深层问题:$descriptorspec = array( 0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "w") ); $cwd = __DIR__; $process = proc_open("C:/Users/joe/AppData/Local/Programs/Python/Python311/Scripts/vosk-cli.exe -i file.wav -o file.ddt", $descriptorspec, $pipes, $cwd); if (is_resource($process)) { $stdout = stream_get_contents($pipes[1]); fclose($pipes[1]); $stderr = stream_get_contents($pipes[2]); fclose($pipes[2]); $retval = proc_close($process); echo "状态码:$retval\n"; echo "标准输出:\n$stdout\n"; echo "错误输出:\n$stderr\n"; }检查PHP安全限制
打开php.ini文件,查看disable_functions配置项,确保exec、shell_exec等函数没有被禁用。如果被禁用,注释掉对应配置后重启Web服务器。
内容的提问来源于stack exchange,提问作者Rene
相关产品推荐
相关产品推荐

