Dll de Espeak

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Dll de Espeak

Message par LavaLava »

Salut,
je voudrais piloter la synthèse vocale Espeak à partir de sa DLL et non par SAPI.
J'arrive à dialoguer avec la DLL grâce à des CallFunction, mais dès que je veux intègrer ces même CallFunction dans des procédures cela plante...

Code : Tout sélectionner

;typedef enum { AUDIO_OUTPUT_PLAYBACK, .. } espeak_AUDIO_OUTPUT;
; int espeak_Initialize(espeak_AUDIO_OUTPUT output, int buflength, const char *path, int options);

Global hESpeak, R, Path$
Path$ = GetCurrentDirectory()
Procedure Aff()
  R = CallFunction( hESpeak, "espeak_Initialize", 0, 0, @PAth$, 0 )
  Debug R
EndProcedure

hESpeak = OpenLibrary( #PB_Any, "Espeak.dll" )
If hESpeak
  R = CallFunction( hESpeak, "espeak_Initialize", 0, 0, @Path$, 0 )
EndIf
Debug R
;Aff()
Dans cet exemple, si je commente l'appel à la fonction Aff(), le débugger affiche la valeur de retour de l'initialisation.
Par contre, si j'appelle la fonction Aff(), j'ai une erreur "invalide memory access..."

Je suppose que les format des paramètres ne doivent pas être correct et que la pile pourrait être trop dépiler/enpiler ...
mais je ne sais pas où !
Quelqu'un aurait une idée ?

J'ai essayer en déclarant des prototype tel que :
Prototype.i Espeak_Initialize( output.i, buflength.i, Path.p-ascii, options.i )
mais cela fait pareil.

Merci
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Dll de Espeak

Message par Backup »

.......................
Dernière modification par Backup le dim. 20/mars/2011 15:11, modifié 1 fois.
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Re: Dll de Espeak

Message par LavaLava »

Salut,
merci pour ta recherche, ainsi que ton travail déja fait pour le SAPI.
J'ai fait un utilitaire sur clé usb qui est sonorisé soit par SAPI ou soit par espeak en autonome.
En fait, j'utilise déja cette synthèse avec "Espeak.exe" avec runprogram,
mais comme elle est sollicité par des actions clavier il arrive ques des phrase se chevauchent ...
Donc on peut entendre plusieurs voix Espeak parler en même temps.
Il me semble :
1) Que ce n'est pas trés "propre" de cloturer un prog lancé par RunProgram, pour les ressources.
2) l'appel d'un Exe est plus lent que'n lien avec une DLL.
3) Sur la clé se trouveras déja un prog contenant la synthèse Espeak mais pas le fichier "Espeak.exe"

C'est pourquoi, pour plus de souplesse, je me suis lancé dans le pilotage direct de cette synthèse.
Ce qui de prime abord ne me semblait pas trop compliqué...
et à moins que le Puure est des limitations cela devrait être faisable.
@+
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Dll de Espeak

Message par Backup »

........................
Dernière modification par Backup le dim. 20/mars/2011 15:11, modifié 1 fois.
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Re: Dll de Espeak

Message par LavaLava »

Salut,
Mon soucis n'est pas de faire parler la synthèse Espeak grâce à "Espeak.exe",
mais au contraire d'interrompre sa diction...

Pour être clair, voici un lien pour essayer mon utilitaire et qui mettras mon soucis en évidence.
http://www.lavakri.fr/Page_MenuToRun.html

Au lancement, l'utilitaire doit être sonorisé sinon, l'on peut changer de synthèse par le raccourcis F4.
F1 affiche une mini-aide pour les autres raccourcis.

1) Si l'on choisit une synthèse SAPI :
Lors de déplacement rapide, je peux intérompre la diction en cours en utilisant le flag #SPF_PurgeBeforeSpeak
2) Si l'on choisit la synthèse Espea, commandé par des RunProgram :
lors de déplacement rapide les voix se superposent...
Je pourrais utiliser KillProgramm() mais je ne suis pas sur que cela soit très propre.

D'ou mon étude de la DLL qui permetra de "purger" la diction avant de refaire parler.

@+
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Dll de Espeak

Message par Backup »

mon code d'exemple , ne reponds pas specialement a ton probleme
mais il donne une possibillité d'exploitation , que d'autre que toi et moi ici , n'ont peut etre pas éxpérimentés, en attirant du monde sur la synthese vocale, on pourra avoir des idées neuves, qui elles, peuvent répondre a ton probleme spécifique !


j'ai pas le temps de regarder maintenant ton soucis, mais je jetterai un oeil dés que possible !

toutefois sans avoir regarder , je peux deja te dire que
en principe l'utilisation de #PB_Program_Wait empeche que
le prg en cours ne soit coupé, puisqu'on attends justement la fin de la diction, donc du prg pour terminer et passer a la suite

la programmation etant séquentiel il n'est pas possible qu'une autre instance de runprogram() soit lancé tant que celui en cours ne soit terminé ;)

si tu cherche a interrompre un prg en cours tu peux le faire
killprg n'est pas sale ! :lol:
c'est meme fait pour ,
un prg qui est terminé, libere les ressources systeme :)

la seule difference avec une Dll , c'est que celle-ci reste présente en Ram et donc, on economise le temps de chargement c'est tout !

mais pour l'avoir testé sur mon NC10 le prg de commande de Espeak
est tres rapide a se charger !!
donc, le jeux n'en vaut peut etre pas la chandelle ;)

mais je jetterai un oeil a ton pg ..
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Dll de Espeak

Message par Backup »

je viens de tester ton prg , j'ai aucun soucis !!

tout marche , j'ai jamais 2 voix qui se superposes ....
je bouge l'interface , je change de menu , ça parle niquel !
d'ailleurs chez moi ça utilise Virginie, ma voix par defaut ;)

ps : ben non meme si je change ma voix par defaut c'est toujours Virginie
qui est choisie ...
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Re: Dll de Espeak

Message par LavaLava »

Salut,
Merci d'avoir tester mon prog.
Je n'ai pas de soucis avec les voix piloté par SAPI tel que Virginie, ou Espeak,...
C'est avec la synthèse Espeak piloté en ligne de commande ou DLL que j'ai des problèmes.
Quand mon prog est lancé, tu peux faire F4 pour changer de synthèse et sélectionner Espeak en ligne de commande.
C'est dans ce cas, que si tu te déplace rapidement, tu auras des chevauchement de parole.

Mon but est de rendre la sonorisation de mon prog totalement autonome sur une clé USB.
Il faut donc que je puisse utiliser une synthèse dont les fichiers ne soit que sur la clé...
Par contre, et pour plus de confort, si le PC Hote possédedes voix Sapi je donne la possibilité de les utiliser.


@+
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Dll de Espeak

Message par Backup »

LavaLava a écrit : Quand mon prog est lancé, tu peux faire F4 pour changer de synthèse et sélectionner Espeak en ligne de commande.

@+
le probleme c'est qu'en faisant F4 ça change bien de synthese vocal, mais comme on ne sait pas ce qu'on choisi......

j'ai pas mal de voix d'installées sur mon systeme ayant moi même fait quelques prg basé sur la synthese vocal
du coup F4 me propose pleins de voix et de langues différentes , commet puis je savoir, que je suis sur la voix concernant ton probleme ?

en fait ayant balayé toutes les voix que j'avais avec F4 , et ayant bougé la fenetre autant que je le pouvais, j'ai jamais
eu de voix se marchant dessus .... ;)
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Re: Dll de Espeak

Message par LavaLava »

Salut,
vrai que si tu as beaucoup de voix cela peut être dificile.
Si tu fait Alt+F1 tu auras la fenêtre de log et la liste, dans l'ordre, de toutes les synthèse détectées.
Celle qui pose soucis est la Espeak Mode=2.
Tu peux faire Maj+F4 pour séléctionner la précédente.

Menfin, le vrai problèmes et que je voudrais utiliser cette DLL.
Pour 2 raisons :
1) une meilleure gestion de la voix, vis-à-vis de la cacaphonie de Espeak avec Espeak ..
2) Sur la clé sera installé une revue d'écran qui inclue la synthèse Espeak avec sa DLL mais pas le fichier ESpeak.exe
Mais bon, si tu me dis que l'on peu utiliser KillProgram sans mettre en péril Windows, j'aurais au moins cette solution. C'est un a priori, mais la terminologie de cette instruction me laisse à penser que Windows tue le programme et ne lui laisse pas la possibilité de libérer ressource et espaces mémoire alloué...

En tout cas encore merci pour ton travail sur SAPI qui m'a bien aidé.

@+
Répondre