gpt4 book ai didi

python - 在 Windows Server 2019 上,通过 cgi/Apache 调用的 pyttsx3 生成空的 wav 文件

转载 作者:行者123 更新时间:2023-12-04 17:16:36 57 4
gpt4 key购买 nike

我在 Windows Server 2019 VM 上运行 Apache2.4。 Apache 已设置好,因此我可以在我的 cgi-bin 脚本中使用 python。我有一个脚本可以执行

#!C:/Python39/python.exe

text = "This is some example text."
engine = pyttsx3.init("sapi5")
engine.save_to_file(text, "test.wav")
engine.runAndWait()

print("Content-type: audio/wav")
print()

with open("test.wav", "rb") as file:
print(file.read())

如果我从命令行调用该脚本,它会创建一个 115kb 的文件,其中包含我的文本的口语版本。但是,如果我通过网络浏览器调用相同的脚本(即浏览到 http://whatever/cgi-bin/test.py),它会创建一个 46b 文件,该文件似乎是一个有效的 WAV header ,但是没有实际数据——也就是说,它创建了一个有效的空声音文件。据我所知,我没有看到出现任何错误,既没有写入屏幕,也没有写入 Apache 的错误日志,也没有写入 Windows 日志。

(在我的本地网络上的 Windows 10 机器上运行 WAMP 时,相同的代码似乎有效。我还尝试安装 PHP 并让 Apache 使用它来调用 Python 是一个 shell 命令,这没有区别。(我不知道为什么我会这么认为!))

我怎样才能使它在 cgi/Apache 下像在命令行下一样工作?


我不知道这是否有用的信息,但这里是这些机器上安装的一些东西的版本(ETA,我已经尝试在 Windows 10 上升级以更好地匹配 Windows Server 2019):

Windows 10

HTTPD: 2.4.35 升级到 2.4.48,仍然有效

PHP:PHP Version 7.2.10(但在我的测试中Python被称为CGI,所以这应该无关紧要)升级到8.0.6,仍然有效

PYTHON:3.9.2rc1(tags/v3.9.2rc1:4064156,2021 年 2 月 17 日,11:25:18)[MSC v.1928 64 位 (AMD64)] 升级到 3.9。 6 (tags/v3.9.6:db3ff76, Jun 28 2021, 15:26:21) [MSC v.1929 64 位 (AMD64)],仍然有效

.NET:运行“Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name version -EA 0 | Where { $_.PSChildName -Match '^(? !S)\p{L}'} | 选择 PSChildName,版本"产生:

PSChildName                      Version
----------- -------
v2.0.50727 2.0.50727.4927
v3.0 3.0.30729.4926
Windows Communication Foundation 3.0.4506.4926
Windows Presentation Foundation 3.0.6920.4902
v3.5 3.5.30729.4926
Client 4.8.04084
Full 4.8.04084
Client 4.0.0.0

服务器 2019

HTTPD:2.4.48

PHP:PHP 版本 8.0.9(但在我的测试中 Python 被称为 CGI,所以这应该无关紧要)

Python:3.9.6(标签/v3.9.6:db3ff76,2021 年 6 月 28 日,15:26:21)[MSC v.1929 64 位 (AMD64)]

.NET:运行“Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name version -EA 0 | Where { $_.PSChildName -Match '^(? !S)\p{L}'} | 选择 PSChildName,版本"产生:

PSChildName                      Version
----------- -------
v2.0.50727 2.0.50727.4927
v3.0 3.0.30729.4926
Windows Communication Foundation 3.0.4506.4926
Windows Presentation Foundation 3.0.6920.4902
v3.5 3.5.30729.4926
Client 4.8.03761
Full 4.8.03761
Client 4.0.0.0

使用 debug=True,在我看到的 Apache error_log 中

Traceback (most recent call last):
File "pyttsx3\\driver.py", line 90, in _pump
cmd[0](*cmd[1])
File "pyttsx3\\drivers\\sapi5.py", line 69, in save_to_file
temp_stream = self._tts.AudioOutputStream
_ctypes.COMError: (-2147200966, None, (None, None, None, 0, None))

-2147200966 似乎是 SPERR_NOT_FOUND,即“未找到请求的数据项(数据键、值等)。”


从 Apache 迁移到 IIS 并没有什么不同。

在系统设置中,我尝试允许应用程序访问任何与音频相关的内容。我使用 o&o ShutUp10++ 也允许我可以做的一切。这没有什么不同。

仍然通过 IIS 运行,使用 procmon64,我发现 python.exe 提示访问某些注册表项,并且它作为 IUSR 运行,所以我让 IUSR 完全控制 HKLM\Software\Microsoft\Speech 和 Speech_OneCore和 HKU.DEFAULT\Software\Microsoft 中的一样。我还读到我可能需要对 C:\windows\system32\config\systemprofile\appdata\roaming 的读取权限和/或 sysWOW64 中的系统配置文件,所以我也授予了 IUSR 对这两个文件的读取权限。

我仍然无法运行我的脚本。然而,我似乎已经更改了错误消息,现在是:

-2147221164, '类未注册', (None, None, None, 0, None))

最佳答案

  1. 这里只是一个随机的想法:可能取决于环境我这样说是因为生成一个空文件听起来就像 python 无法到达 tts 核心。

您可以检查 cmd 中的 %PATH% 变量是否与作为 cgi 执行时在脚本中获得的变量匹配。

通过在命令行窗口中运行 set 获取 %PATH% 变量内容。通过添加

获取脚本的路径
import sys

print(sys.path)

使用类似下面的语句将缺失的路径直接添加到您的脚本中

sys.path.append(r'C:\Python38-64\lib\site-packages\win32\lib')
  1. 无法正确导入tts核心

尝试在您的脚本中添加如下内容。根据您在通过 cgi 运行时是否看到脚本输出,您可能希望将打印语句替换为日志语句。

try:
import pyttsx3.drivers.sapi5
except ImportError as e:
print('I could not import my driver')
else:
print('Driver imported')

同时尝试用espeak替换sapi5驱动

  1. 当作为 cgi 运行时,您的 python 实例不允许与系统通信

为初学者禁用 AV 和防火墙软件,然后重试。如果没有任何帮助,请尝试使用 netstat -natp | 查看 python 脚本(以 cmd 运行)使用了哪些端口。 findstr/I python.从那里开始,在以 cgi 运行时重复并查看这些端口是否打开。

  1. 没有其他希望

如果上述所有方法都失败,请尝试使用 IIS 运行您的 cgi,以区分问题是来自 apache 还是 Windows。

[编辑] 更新

尝试使用调试运行引擎以获取更多信息,例如 engine = pyttsx3.init("sapi5", debug=True)

不要忘记准备好 basicLogger 配置,以便正确进行调试。

如果您的 cgi 脚本不是线程安全的,您也可以尝试交换您的 apache MPM。为此,在 httpd/conf.modules.d 中找到一个名为 00-mpm.conf 的文件(或者通过搜索 grep/findstr mpd_mpm 找到 conf 文件)

您应该有 mpm_prefork 或 mpm_event(apache 2.4 中的默认设置)。某些 cgi 内容不能与 mpm_event 一起正常工作。尝试将其注释掉并改用 prefork。然后不要忘记重新启动apache。请注意,这会使 php-fpm 无法使用,但为了测试,它会有很大帮助。

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_event_module modules/mod_mpm_event.so

[/编辑]

[编辑 2]通过调试,您现在知道您有错误 -2147200966,转换为 0x8004503A,在各个方向的点是:

  • 由于操作系统限制(文件 ACL、 secret 性问题),您无权访问 TTS 引擎。

您可以尝试停止 apache 服务,更改该服务使其作为系统运行,然后重试。或者,您可以停止该服务,启动 UAC 窗口,并尝试使用相应的配置文件从 bin 路径手动启动 apache。

  • 您的 TTS 引擎缺少文件

极不可能,因为您的非 cgi 版本可以运行,但您可能需要重新安装引擎和语言包以确保所有组件都已正确注册

  • 保密问题

在控制面板中检查没有什么可以阻止麦克风/电话的使用。或者,您可以启动 o&oshutup10 以查看是否强制执行某些隐私设置(甚至可以是 GPO,因为您的环境是企业)

[/编辑 2]

关于python - 在 Windows Server 2019 上,通过 cgi/Apache 调用的 pyttsx3 生成空的 wav 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68591360/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com