我正在尝试通过ssh在运行ubuntu 20.04.1 LTS的计算机上使用“文本到语音”程序balabolka和它的命令行版本Balcon。首先,我从http://www.cross-plus-a.com/fr/bconsole.htm下载了balcon ,然后经过一些研究后设法使它工作,这需要安装Wine,winetricks,Microsoft SpeechPlatformRuntime,speechsdk和msxml6 。我还安装了一些SAPI 5 TTS声音。我按照https://askubuntu.com/questions/1189046/wine-how-to-use-sapi-5-voices-for-tts-application-balabolka中所述的步骤进行操作
我在测试时使用以下命令行: WINEPREFIX="$HOME/prefix32" wine "$HOME/prefix32/drive_c/Program Files/balcon/balcon/balcon.exe" -f text.txt -n Daniel_Full_22kHz -w audiooutput.wav
直接在主机上运行时,此命令可以完美运行,但是我的目标是通过另一台计算机上的ssh运行此命令。出于测试目的,我尝试直接从Windows命令行使用ssh连接,也使用python + paramiko。
这是一个奇怪的部分:重启Ubuntu计算机后,使用任何上述方法的第一次尝试都成功,但是随后的尝试总是失败。
使用直接ssh连接时,出现以下错误:
〜$ WINPREFIX =“ $ HOME / prefix32” wine“ $ HOME / prefix32 / drive_c / Program Files / balcon / balcon / balcon.exe” -f text.txt -n Daniel_Full_22kHz -w audiooutput.wav 0009:err:winediag:nodrv_CreateWindow应用程序试图创建一个窗口,但是无法加载驱动程序。0009:err:winediag:nodrv_CreateWindow确保您的X服务器正在运行,并且$ DISPLAY设置正确。0009:err:ole:CoGetClassObject类{d941651c-44e6-4c17-badf-c36826fc3424}未注册0009:err:ole:create_server类{d941651c-44e6-4c17-badf-c36826fc3424}未注册0009:err:ole:CoGetClassObject no可以为上下文0x5 0009:err:ole:CoGetClassObject类{cb96b400-c743-11cd-80e5-00aa003e4b50}未注册创建类对象{d941651c-44e6-4c17-badf-c36826fc3424} 0009:err:ole:
该错误表明$ DISPLAY环境变量存在问题。使用时,echo $DISPLAY
我发现未在ssh控制台中设置该变量,因此我使用export DISPLAY=:0
值:0对其进行了设置,该值是通过echo $DISPLAY
在ubuntu ssh服务器上运行localy获得的。修改之后,所有后续尝试都可以正常工作。
我尝试使用python + paramiko做同样的事情,这是我的脚本:
import os
import shell
import paramiko
def connectSSH(key,host,user):
c = paramiko.SSHClient()
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
print("connecting")
c.connect( hostname = host, username = user, pkey = k )
ftp_client = c.open_sftp()
print("connected")
filet = open("./text.txt","w")
filet.write("Hi this is a text to speech test with daniel voice")
filet.close()
ftp_client.put("./text.txt","./text.txt")
env_dict = {"DISPLAY":":0"}
cmd = "WINPREFIX=\"$HOME/prefix32\" wine \"$HOME/prefix32/drive_c/Program Files/balcon/balcon/balcon.exe \" -f %s -n %s -w %s" % ("kesra2.txt", "Daniel_Full_22kHz","audiooutput.wav")
print(cmd)
stdin,stdout,stderr=c.exec_command(cmd,environment=env_dict)
print(stdout.readlines())
print(stderr.readlines())
ftp_client.get("audiooutput.wav","audiooutput.wav")
ftp_client.close()
最初我遇到了相同的$ DISPLAY错误,因此我使用来添加它,env_dict = {"DISPLAY":":0"}
并允许在服务器sshd配置上进行此变量修改,但是现在我总是会收到错误:
0009:err:ole:CoGetClassObject类{d941651c-44e6-4c17-badf-c36826fc3424}未注册0009:err:ole:create_server类{d941651c-44e6-4c17-badf-c36826fc3424}未注册0009:err:ole:CoGetClassObject no可以为上下文0x5 0009:err:ole:CoGetClassObject类{cb96b400-c743-11cd-80e5-00aa003e4b50}未注册创建类对象{d941651c-44e6-4c17-badf-c36826fc3424} 0009:err:ole:CoGetClassObject类{cb96b400 -c743-11cd-80e5-00aa003e4b50}未注册0009:err:ole:create_server类{cb96b400-c743-11cd-80e5-00aa003e4b50}未注册0009:err:ole:CoGetClassObject没有类对象{cb96b400-c743-11cd-80e5 -00aa003e4b50}可以为上下文0x7创建错误:未选择语音
错误的最后一部分Error: voice not selected
并不重要,因为在其他情况下,相同的cmd仍可正常工作,虽然有些其他地方失败了,但我找不到它。另外我不明白为什么无论使用哪种方法(ssh控制台或python + paramiko),服务器重启后的第一次尝试都可以正常工作
我尝试使用paramiko的invokeshell()获得相同的结果
任何帮助都感激不尽
经过进一步研究,似乎该问题与“ WINEPREFIX”变量有关。通过将其移动到env_dict内并使用绝对路径,该问题不再可复制
env_dict = {"DISPLAY:":0", "WINEPREFIX":"absolute/path/to/prefix"}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句