PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Synthèse vocale : sélectionner la voix
Synthèse vocale : sélectionner la voix
Iniciado por dakota99, 04,dic. 2018 21:33 - 8 respuestas
Miembro registrado
34 mensajes
Publicado el 04,diciembre 2018 - 21:33
Bonjour,

Dans une appli Windev de souhaiterais utiliser la synthèse vocale pour lire des phrases en français puis en anglais.
J'ai suivi l'exemple fourni qui utilise un assemblage Dot.net : system.speech
et la procédure pTextToSpeech1 à laquelle il faut envoyer une chaîne de caractères à lire.

Jusqu'à présent le texte est lu correctement avec la voix par défaut. Je souhaiterais sélectionner une autre voix.
Pour ce faire il faudrait connaître le nom des voix installées.

Dans la doc https://docs.microsoft.com/fr-fr/dotnet/api/system.speech.synthesis.speechsynthesizer… il est indiqué d'utiliser la méthode pTextToSpeech1.gclTextToSpeech.GetInstalledVoices()

Ma question : comment récupérer dans Windev la valeur retournée par cette méthode ?
Le code suivant provoque l'erreur suivante : Un élément de type 'objet .NET' ne peut pas être converti vers le type 'chaîne UNICODE'.
m est une chaîne = pTextToSpeech1.gclTextToSpeech.GetInstalledVoices()

Merci pour votre aide.
Miembro registrado
334 mensajes
Publicado el 05,diciembre 2018 - 07:30
J’ai un peu bossé là dessus, attends que j’arrive au taf, et je publierait mes bouts de codes...

--
———————————————————————————————————
Ce qui se conçoit bien se code clairement et se débogue facilement...

- Pastiche d’une citation de Nicolas Boileau -
Miembro registrado
334 mensajes
Publicado el 05,diciembre 2018 - 10:40
Exemple qui fonctionne chez moi mais en SAPI:

/////////////////////// Déclaration globales ///////////////////////
gautMaVoix est un objet automation "Sapi.SpVoice"

/////////////////////// Fin d'initialisation de ma fenêtre /////////
i est un entier;

SAI_Parole = "Transporteur Tayac, veuillez vous positionner au quai 13"

LIB_Compteur = gautMaVoix>>getVoices()>>Count

ListeSupprimeTout(COMBO_Liste_des_voix)

POUR i = 0 À Val(LIB_Compteur) - 1
ListeAjoute(COMBO_Liste_des_voix, gautMaVoix>>getVoices()>>Item(i)>>GetDescription);
FIN

SI COMBO_Liste_des_voix..Occurrence > 0 ALORS
ListeSelectPlus(COMBO_Liste_des_voix, 1)
FIN

/////////////////////////// Clic sur le bouton 'PARLER' ///////////
// La vitesse est entre -10 et +10
gautMaVoix>>rate = -POT_Rate

// Le Volume est entre 0 et 100
gautMaVoix>>volume = POT_Volume

//on change la voix courante
gautMaVoix>>Voice = gautMaVoix>>getVoices()>>Item(ListeSelect(COMBO_Liste_des_voix) - 1)

// on lance la voix en mode assynchrone
gautMaVoix>>Speak(SAI_Parole, 1)

J'espere que mon bout de code va pouvoir t'aider.

--
———————————————————————————————————
Ce qui se conçoit bien se code clairement et se débogue facilement...

- Pastiche d’une citation de Nicolas Boileau -
Mensaje modificado, 05,diciembre 2018 - 10:44
Publicado el 05,diciembre 2018 - 13:53
Super, un tout grand merci pour ce code.
je n'avais pas du tout commencé avec un objet automation mais ce code fonctionne bien.

Il m'a permis de me rendre compte que les voix que j'avais ajoutées n'étaient pas prises en compte.

La solution pour y remédier :

https://forums.cnetfrance.fr/topic/1209624-narrateur-windows--ajouter-une-voix-de-synthese-francophone/

Encore merci et excellente journée
Miembro registrado
34 mensajes
Publicado el 09,diciembre 2018 - 21:57
Bonjour,

Curieusement le code en SAPI fonctionne sur la machine de développement qui est en Windows 7.
L'exécutable fonctionne sur une machine qui tourne en WIN10.
Par contre sur 3 autres machines en Windows 7 l'exécutable affiche un message d'erreur lors de l'exécution de la ligne gautMaVoix>>Speak(Txt, 1)

Message d'erreur : "vous avez appelé la méthode <Speak>
En tenant d'invoquer la méthode <Speak> ou de lire la propriété <Speak> l'objet automation/activeX a renvoyé l'erreur suivante :
erreur 80040154
erreur 80020003 le membre demandé n'existe pas.

Lorsque les voix sont testées via le panneau "Propriétés de la synthèse vocale" elles fonctionnent normalement.

Quelqu'un aurait-il une idée ?
Merci pour votre temps.
Miembro registrado
962 mensajes
Publicado el 10,diciembre 2018 - 06:00
hello,
dakota99 a écrit :
Bonjour,


m est une chaîne = pTextToSpeech1.gclTextToSpeech.GetInstalledVoices()

Merci pour votre aide.


GetInstalledVoices retourne une collection d'objets dotnet de type InstalledVoice.
Voici un exemple d'utilisation qui fait prononcer une phrase à toutes les voix installées sur le système :
// Texte à prononcer -> Aie c'est pas facile
Phrase est une chaîne =[
Sage chasseur âgé aux yeux chassieux,
sachez chasser sans chien chose aisée,
ce chat chauve caché
sous ces six chiches souches de sauge sèche.
]

LaVoix est un SpeechSynthesizer
voix est une InstalledVoice dynamique
InfoVoix est une VoiceInfo dynamique


// La vitesse est entre -10 et +10
LaVoix.Rate = -5
// Le Volume est entre 0 et 100
LaVoix.Volume = 80
// on balaie toutes les voix disponibles
POUR TOUTE voix de LaVoix.GetInstalledVoices()
InfoVoix = voix.VoiceInfo
Trace (InfoVoix.Name)
LaVoix.SelectVoice(InfoVoix.Name)
LaVoix.Speak(Phrase)
FIN


--
Ami calmant, J.P
Mensaje modificado, 10,diciembre 2018 - 06:01
Miembro registrado
34 mensajes
Publicado el 10,diciembre 2018 - 07:51
Bonjour

Un grand merci pour le code qui fonctionne parfaitement. (en tout cas sur la machine de développement)

Pour sélectionner une voix en particulier :

m est une chaîne = "Microsoft Server Speech Text to Speech Voice (fr-FR, Hortense)"
LaVoix.SelectVoice(m)
LaVoix.Speak(Phrase)

Reste plus qu'à l'essayer sur les différentes machines.
Encore merci et une excellente journée.
Miembro registrado
34 mensajes
Publicado el 14,diciembre 2018 - 21:43
Bonjour
Le code ci-dessous fonctionne parfaitement sur la machine de développement sous Win 7 Pro. Les différentes voix sont affichées dans une fenêtre Trace.
Phrase est une chaîne ="Bonjour"
LaVoix est un SpeechSynthesizer
voix est une InstalledVoice dynamique
InfoVoix est une VoiceInfo dynamique

LaVoix.Rate = -5 // La vitesse est entre -10 et +10
LaVoix.Volume = 80 // Le Volume est entre 0 et 100

POUR TOUTE voix DE LaVoix.GetInstalledVoices() // on balaie toutes les voix disponibles
InfoVoix = voix.VoiceInfo
Trace (InfoVoix.Name)
m = InfoVoix.name
Info(m)
LaVoix.SelectVoice(InfoVoix.Name)
LaVoix.Speak(Phrase)
FIN


Par contre j'ai exécuté ce code sur 2 autres machines sous Win 7 Pro. Sur chacune le code suivant est affiché :
Traitement de 'Clic sur BTN_TST' (FEN_BVN.BTN_TST), ligne 15, thread 0
Que s'est-il passé ? L'invocation de la méthode  du type  a échoué
Le framework .NET a renvoyé l'erreur suivante : 
Impossible de définir la voix. Aucune voix correspondante n'est installée ou la voix a été désactivée.

Code erreur : 200002
Niveau : erreur fatale


- Il est possible d'afficher toutes les voix mais il n'est pas possible d'en sélectionner une
- info(m) : le nom de la voix affichée est bien correct
- SpeechPlatformRuntime.msi x64 a bien été exécuté et les différentes voix ont été installées.
- lorsqu'on affiche les différentes voix "Modifier les paramètres de la synthèse vocale" : toutes les voix installées sont bien affichées. Et quand on clique sur "Tester la voix" cela fonctionne.

Quelqu'un aurait-il une idée ?
Merci pour votre temps.
Miembro registrado
34 mensajes
Publicado el 14,diciembre 2018 - 22:05
Il semblerait que le problème vienne du fait que j'ai installé la version x64 de SpeechPlatformRuntime.msi.
Cela me paraissait logique puisque ce sont des machines 64 bits.
Apparemment il faut installer la version x86 et cela fonctionne sans rien changer au code....