Команда Wine не работает при выполнении через сеанс python paramiko ssh

Я пытаюсь использовать программу Balabolka для преобразования текста в речь и ее версию командной строки Balcon на моем компьютере с Ubuntu 20.04.1 LTS через ssh. Сначала я загрузил балкон с http://www.cross-plus-a.com/fr/bconsole.htm. Затем после некоторых исследований мне удалось заставить его работать, для этого потребовалось установить 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 с другого компьютера. в целях тестирования я попробовал установить ssh-соединение непосредственно из командной строки Windows, а также с помощью 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 class {d941651c-44e6-4c17-badf-c36826fc3424} не зарегистрирован 0009: CoGet noClient: oassle объект класса {d941651c-44e6-4c17-badf-c36826fc3424} может быть создан для контекста 0x5 0009: err: ole: CoGetClassObject class {cb96b400-c743-11cd-80e5-00aa003e4b50} не зарегистрирован 0009: err: olebjectClass -c743-11cd-80e5-00aa003e4b50} не зарегистрирован 0009: err: ole: create_server class {cb96b400-c743-11cd-80e5-00aa003e4b50} не зарегистрирован 0009: err: ole: CoGetClassObject нет объекта класса {cb96b400-c743-11 -00aa003e4b50} может быть создано для контекста 0x7 Ошибка: голос не выбран

Ошибка указывает на проблему с переменной среды $ DISPLAY. используя echo $DISPLAY, я обнаружил, что переменная не установлена ​​в консоли ssh, поэтому я установил ее, используя export DISPLAY=:0, значение: 0 получается путем запуска echo $DISPLAY localy на сервере ssh ubuntu. После этой модификации все последующие попытки работают нормально.

Я пытался сделать то же самое с помощью 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 class {d941651c-44e6-4c17-badf-c36826fc3424} не зарегистрирован 0009: CoGet noClassle: oassle объект класса {d941651c-44e6-4c17-badf-c36826fc3424} может быть создан для контекста 0x5 0009: err: ole: CoGetClassObject class {cb96b400-c743-11cd-80e5-00aa003e4b50} не зарегистрирован 0009: err: olebjectClass -c743-11cd-80e5-00aa003e4b50} не зарегистрирован 0009: err: ole: create_server class {cb96b400-c743-11cd-80e5-00aa003e4b50} не зарегистрирован 0009: err: ole: CoGetClassObject нет объекта класса {cb96b400-c743-11 -00aa003e4b50} может быть создано для контекста 0x7 Ошибка: голос не выбран

последняя часть ошибки Error: voice not selected не имеет значения, поскольку тот же cmd работает и в других случаях. Что-то еще не работает, но я не могу его найти. Также я не понимаю, почему первая попытка после перезагрузки сервера работает нормально независимо от метода (консоль ssh или python + paramiko)

Я пробовал использовать invokeshell () paramiko с теми же результатами

Любая помощь будет высоко ценится


person Meizu nakamura    schedule 02.11.2020    source источник


Ответы (1)


После дальнейшего исследования выяснилось, что проблема связана с переменной WINEPREFIX. переместив его внутрь env_dict и используя абсолютный путь, проблема больше не воспроизводится

env_dict = {"DISPLAY:":0", "WINEPREFIX":"absolute/path/to/prefix"}
person Meizu nakamura    schedule 02.11.2020
comment