从 Windows 上的嵌入式 64 位 LUA 5.4 调用文本转语音,无需中断主机应用程序

问题描述 投票:0回答:1

我正在为 Synthesizer V Studio(一种生成合成歌声的虚拟乐器)编写可访问性脚本。我的目标是拥有一组嵌入式脚本,为用户提供有关项目的信息;某些设置的状态、调整选项时的声音响应等。例如,用户可以热键一个脚本,将所选音符下移半音,TTS 会读出新音高的名称(“ C4”或其他)。

该软件嵌入了LUA 5.4。 Windows 支持很重要,而且该软件是 64 位的,因此即使我在技术上可以要求模块,只要它们被手动放置在安装目录中,但我还没有找到任何兼容的 DLL。

脚本也经过严格的沙箱处理;我可以在官方 5.4 实现中做任何事情,但脚本不能直接相互交互,并且任何变量都需要保存到文件中,以供其他脚本或同一脚本的未来运行使用。有一个内置的“setTimeout”函数在 LUA 中以与 JavaScript 对应的方式相同的方式工作,启用异步回调函数,但否则脚本执行会阻止主机应用程序。


我尝试过使用

os.execute
,它有点有效。我可以使用
mshta vbscript:Execute("CreateObject(""SAPI.SpVoice"").Speak(""'..text..'"")(window.close)")
让操作系统读出我的文本,但这会打开命令提示符窗口,并使应用程序失去焦点。应用程序的焦点不集中是最大的问题,因为用户每次调整都必须重新输入。

我尝试过各种其他调用文本转语音的方法(ptts、espeak、使用

start /b
运行),但都显示了这种行为。这并不奇怪,因为即使我运行的可执行文件位于后台,启动该进程的命令窗口也不会。

我没有 Mac 来测试

os.execute('say "'..text..'"')
的工作原理,但我确实打算尽可能使其跨平台。


我在另一个 StackOverflow 主题 中发现 luacom 可能允许“不可见”后台执行该命令,但是我无法构建 5.4/x64 DLL。我分叉了 moteus/luacom 并能够运行他们已经配置的构建,但是任何将 LUA 5.4 添加到列表并使用最新版本的 luarocks 的尝试都会导致一切失败,甚至是较低版本。

我确实成功构建了 5.3/x64 版本,结果出现消息“从‘C:\Program Files\Synthesizer V Studio Pro\luacom.dll’加载模块‘luacom’时出错:找不到指定的模块。”

我的appveyor.yml

version: 1.5.{build}

environment:
  matrix:
  - LUA: "lua 5.1"
  - LUA: "lua 5.2"
  - LUA: "lua 5.3"
  - LUA: "lua 5.4"

platform:
  - x64
  - x86

before_build:
  - set PATH=C:\Python27\Scripts;%PATH%
  - pip install git+https://github.com/luarocks/hererocks
  - if /I "%platform%"=="x86" set HR_TARGET=vs_32
  - if /I "%platform%"=="x64" set HR_TARGET=vs_64
  - hererocks env --%LUA% --target %HR_TARGET% -rlatest
  - call env\bin\activate

build_script:
  - luarocks make luacom-scm.moteus-1.rockspec

test_script:
  - lua -lluacom -v -e"print{}"

artifacts:
  - path: bin/luacom.dll
    name: luacom

当然,如果我能找到一些替代方案,luacom可能就没有必要了。很可能 luacom 根本无法为 LUA 5.4 构建。我以前从未用 C++ 做过任何东西,所以我承认我在这里非常不了解。


我的下一个想法是,也许我可以让一个外部进程监视一个文件,并在需要读出时从 LUA 向该文件写入一行,然后让外部进程注意到更改并调用 TTS。这可能很难以跨平台的方式弄清楚,同时避免复杂的设置步骤或依赖关系,但看起来我可能必须沿着这条路开始。我曾希望有一个完全独立的解决方案,它需要用户单独启动另一个可执行文件,但一旦启动并运行,可能会提供更加无缝的解决方案。

如有任何建议或反馈,我们将不胜感激。

编辑:我有一个熟人为我运行了一个快速的 MacOS 测试,并且

say
命令似乎在后台运行良好,而不会中断主机应用程序,所以这只是一个 Windows 问题。

windows lua accessibility text-to-speech appveyor
1个回答
0
投票
Lua 中的

os.execute
是 C RTL 函数
system()
的包装器,它在 Windows 上的行为始终如下:它创建一个控制台窗口并使应用程序窗口失去焦点。
您应该使用外部(DLL)库以便能够在不创建窗口的情况下运行进程。
你可以自己写这么短的DLL。
Lua 5.4 FFI 库(以 DLL 的形式)也将是一个解决方案,因为它将所有 WinAPI 函数公开给您的 Lua 代码。

© www.soinside.com 2019 - 2024. All rights reserved.