嗨,我想使用微软的语音API SAPI与python 3.7。
import win32com.client
speaker = win32com.client.Dispatch("SAPI.SpVoice")
speaker.Speak("Hello, it works!")我正在使用Remotedesktop。我通过RDP启动我的python脚本,它工作得很好,我可以听到文本到语音的输出。但是在我关闭RDP之后,它就停止工作了。
我可以将我的RDP连接配置为在远程桌面PC或我的工作PC上播放声音。两者都工作得很好,但前提是要连接RDP。在我关闭RDP之后,这两个变体都不再工作。
在我关闭RDP之后,我在我的python日志文件中得到这个错误:
speaker.Speak("Hello, it works!")
File "<COMObject SAPI.SpVoice>", line 3, in Speak
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147200925), None)我尝试设置AudioOutput,因为我认为这可能会导致问题:
print(len(speaker.GetAudioOutputs()))
for k in speaker.GetAudioOutputs():
print(k.GetDescription())
speaker.AudioOutput = speaker.GetAudioOutputs()[0]只要RDP在运行,我就可以在GetAudioOutputs()列表中看到音频输出设备。但是在我关闭RDP连接之后,再也没有可用的输出设备了。len(speaker.GetAudioOutputs())为0。当然,我的远程PC上确实有一个工作正常的音频设备,但它不显示。
它可以很好地与其他远程桌面解决方案,如Chrome远程桌面或Anydesk,但不能与微软的RDP。不幸的是,我确实需要微软的RDP。
我不知道怎样才能让它工作。
我想也许我每次都要“重置”SAPI,这样在我关闭RDP之后,音频设备的更改就可以被识别出来。
任何帮助都是非常感谢的。
发布于 2021-11-10 22:50:52
我在谷歌上快速搜索了错误代码-2147200925,它可以解析为SPERR_NOT_ACTIVE_SESSION。产生此错误的原因是,一旦终端会话断开连接,SAPI将不会执行音频输入或输出。
您唯一的选择是使用不同的远程桌面协议(例如,VNC),该协议不使用用户会话切换,或者使用WinRT语音合成API,该API不进行此检查。
因为您使用的是Python,所以我用谷歌搜索了一下,找到了pypl上的winrt包,它似乎使与WinRT API的接口变得简单。我不能进一步保证这一点;我根本没有使用过它。
https://stackoverflow.com/questions/69875841
复制相似问题