J'essaie d'utiliser le programme de synthèse vocale balabolka et sa version en ligne de commande Balcon sur ma machine fonctionnant sous ubuntu 20.04.1 LTS via ssh. J'ai d'abord téléchargé balcon à partir de http://www.cross-plus-a.com/fr/bconsole.htm Après quelques recherches, j'ai réussi à le faire fonctionner, ce qui a nécessité l'installation de Wine, winetricks, Microsoft speechPlatformRuntime, speechsdk et msxml6. J'ai également installé quelques voix SAPI 5 TTS. J'ai suivi les étapes décrites dans Wine : Comment utiliser les voix SAPI 5 pour l'application TTS "Balabolka" ?
J'utilise cette ligne de commande lors de mes tests : WINEPREFIX="$HOME/prefix32" wine "$HOME/prefix32/drive_c/Program Files/balcon/balcon/balcon.exe" -f text.txt -n Daniel_Full_22kHz -w audiooutput.wav
Cette commande fonctionne parfaitement lorsqu'elle est exécutée directement sur la machine hôte, mais mon objectif est d'exécuter cette commande via ssh depuis une autre machine. A des fins de test, j'ai essayé une connexion ssh directement depuis la ligne de commande Windows et également en utilisant Python + paramiko.
Voici la partie la plus étrange : Après avoir redémarré la machine Ubuntu, le premier essai en utilisant l'une des méthodes mentionnées réussit, mais les essais suivants échouent toujours.
lorsque j'utilise la connexion directe ssh dans Windows cmd, j'obtiens l'erreur suivante :
~$ 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 Application tried de créer une fenêtre, mais aucun pilote n'a pu être chargé. 0009:err:winediag:nodrv_CreateWindow Assurez-vous que votre serveur X est en cours d'exécution et que $DISPLAY_CreateWindow a bien été chargé. fonctionne et que $DISPLAY est correctement défini. 0009:err:ole:CoGetClassObject class {d941651c-44e6-4c17-badf-c36826fc3424} non enregistrée 0009:err:ole:create_server class {d941651c-44e6-4c17-badf-c36826fc3424} non enregistrée 0009:err:ole:CoGetClassObject pas d'objet de classe {d941651c-44e6-4c17-badf-c36826fc3424} n'a pu être créé pour le contexte 0x5 0009:err:ole:CoGetClassObject classe {cb96b400-c743-11cd-80e5-00aa003e4b50} non enregistrée 0009:err:ole:CoGetClassObject classe {cb96b400-c743-11cd-80e5-00aa003e4b50} non enregistrée 0009:err:ole:create_server class {cb96b400-c743-11cd-80e5-00aa003e4b50} non enregistrée 0009:err:ole:CoGetClassObject pas d'objet de classe {cb96b400-c743-11cd-80e5-00aa003e4b50} n'a pu être créé pour le contexte. 0x7 Erreur : voix non sélectionnée
L'erreur indique un problème avec la variable d'environnement $DISPLAY. en utilisant echo $DISPLAY j'ai trouvé que la variable n'était pas définie dans la console ssh, je l'ai donc définie en utilisant export DISPLAY=:0 la valeur :0 est obtenue en exécutant echo $DISPLAY localy sur le serveur ssh ubuntu. Après cette modification, toutes les tentatives ultérieures ont fonctionné correctement.
J'ai essayé de faire la même chose en utilisant Python+paramiko, voici mon script :
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()
Au début, j'ai obtenu la même erreur $DISPLAY et je l'ai donc ajouté en utilisant env_dict = {"DISPLAY":":0"}
et j'ai autorisé la modification de cette variable dans la configuration sshd du serveur, mais maintenant j'obtiens toujours l'erreur :
0009:err:ole:CoGetClassObject class {d941651c-44e6-4c17-badf-c36826fc3424} non enregistré 0009:err:ole:create_server classe {d941651c-44e6-4c17-badf-c36826fc3424} non enregistrée 0009:err:ole:CoGetClassObject pas d'objet de classe {d941651c-44e6-4c17-badf-c36826fc3424} n'a pu être créé pour le contexte 0x5 0009:err:ole:CoGetClassObject classe {cb96b400-c743-11cd-80e5-00aa003e4b50} non enregistrée 0009:err:ole:CoGetClassObject classe {cb96b400-c743-11cd-80e5-00aa003e4b50} non enregistrée 0009:err:ole:create_server class {cb96b400-c743-11cd-80e5-00aa003e4b50} non enregistrée 0009:err:ole:CoGetClassObject pas d'objet de classe {cb96b400-c743-11cd-80e5-00aa003e4b50} n'a pu être créé pour le contexte 0x7 Erreur : voix non sélectionnée
la dernière partie de l'erreur Error: voice not selected
n'est pas significatif puisque la même cmd fonctionne dans les autres cas, quelque chose d'autre échoue mais je ne peux pas le trouver. Je ne comprends pas non plus pourquoi le premier essai après un redémarrage du serveur fonctionne correctement quelle que soit la méthode (console ssh ou Python + paramiko).
J'ai essayé d'utiliser la fonction invokeshell() de paramiko avec les mêmes résultats
Toute aide sera très appréciée