Comment changer la langue avec la fonction Application.Speech.Speak
Bonjour,
Je voudrais faire appel à la fonction Application.Speech.Speak pour lire un texte dans une application Excel.
La fonction est simple à utiliser mais la lecture se fait toujours en français même si le mot ou le texte est en anglais.
J'ai effectué quelques recherches et j'ai trouvé un code qui est supposé changer la langue selon une valeur dans la registry windows. Selon qu'on utilise l'une ou l'autre instruction CreateObject, la fonction est simplement inopérante. Elle ne change rien.
CreateObject("SAPI.SpVoice").Voice.Category.Default = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_en-GB_Hazel_11.0"
Application.Speech.Speak ("I don't like my job")
CreateObject("SAPI.SpVoice").Voice.Category.Default = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_fr-FR_Hortense_11.0"
Application.Speech.Speak ("I don't like my job")A savoir : Je n'ai ajouté aucune référence de librairie dans l'application comme proposé dans certains exemples. Les 2 clés de registre existent bien sur ma machine en Windows 11 PRO.
Sauriez vous pourquoi cela ne marche pas ? Dans l'affirmative pourriez vous m'apporter une quelconque aide pour résoudre ce problème?
En vous remerciant par avance
Edit modo : fichier pouvant causer des problèmes irréversibles dans la base de registre supprimé
Bonjour Arturo,
Merci pour votre réponse. C'est effectivement bizarre car j'ai les mêmes librairies activées dans référence et même une de plus.
Une précision peut-être, vous utilisez la phrase "dont like my job". Si vous utilisez " I don't..." probablement que vous verrez que la prononciation sera "i" et non "aï".
Voici mes références:
Bonsoir cheickna
Je viens de supprimer votre fichier qui touche la base de registre de Windows, ce qui est dangereux
Merci de faire attention de ne pas proposer ce genre de technique SVP
Cordialement.
Bonsoir BrunoM45,
J'en suis vraiment désolé. Je n'avais pas compris le fonctionnement de CreateObject qui pour moi créait l'objet dans l'instance Excel en cours d'exécution et dont la valeur par défaut était la clé de Registry donnée. C'est un exemple que j'avais trouvé lors d'une de mes recherches pour savoir comment lire en anglais et pas en français. J'en conviens que si cela crée la clé, c'est effectivement dangereux. C'est même surtout risqué de la part de Microsoft qu'une instruction aussi simple puisse modifier une clé au lieu que ce soit via des API.
Toutes mes excuses!
Bonjour,
J'ai finalement résolu mon problème qui consistait à forcer Excel à prononcer un texte en anglais et non en français pas défaut.
Je la partage car ça pourrait servir à d'autres qui seront confrontés à ce problème mais aussi probablement que certains dans le groupe pourront améliorer le code.
Etape 1 : Ajout de la référence "Microsoft Speech Object Library" dans le projet qui fait référence à Sapi.dll
Etape 2 : J'ai crée ces 3 variables dans un module
'variables pour la gestion des voix
Public V As SpeechLib.SpVoice
Public T As SpeechLib.ISpeechObjectToken
'Le numéro de la voix dans les paramètres
Public Ivoice As IntegerEtape 3: Création d'une fonction AvailableVoices() qui permet de trouver les voix disponibles sur le système. Il teste si la description de la voix contient le mot "English" ou "United states" et si OK il stocke l'indice de cette langue dans la variable Ivoice.
J'appelle donc simplement cette fonction dans l'évènement UserForm_Initialize() afin d'initialiser l'indice de la voix. Et à ce stade si je ne trouve pas de voix anglaise (valeur de retour -1) je peux le signaler à l'utilisateur et désactiver ma fonction de lecture des mots.
Function AvailableVoices() As Integer
Dim i As Long
Dim voc As SpeechLib.SpVoice
Dim strVoice As String
AvailableVoices = -1
'NB : Si la fonction retourne -1 c'est que la voie en anglais n'a pas été trouvée sur le système puisque le premier indice la fonction GetVoice.Item est 0
Set voc = New SpVoice
Debug.Print voc.GetVoices.Count & " available voices:"
For i = 0 To voc.GetVoices.Count - 1
Set voc.Voice = voc.GetVoices.Item(i)
Debug.Print " " & i & " - " & voc.Voice.GetDescription
strVoice = voc.Voice.GetDescription
'voc.Speak "test audio"
If InStr(strVoice, "English") > 0 Or InStr(strVoice, "United States") > 0 Then 'on teste si la langue st anglaise
Ivoice = i
AvailableVoices = Ivoice
Exit For
End If
Next i
Ivoice = AvailableVoices 'au cas où la fonction retourne -1 (on pourra donc utiliser Ivoice pour tester dans l'appli si cette fonction a été appelée ou pas)
End FunctionEtape 4 : Création d'une procédure SayIT() qui prononce en anglais la phrase anglaise passée en paramètre.
Attention : Elle prononce un mot en anglais avec une voix en anglais mais elle ne traduit pas un mot en français en anglais
Sub SayIt(strTexte As String)
Dim T As String
On Error GoTo EH
Set V = New SpVoice
If Ivoice <> -1 Then
Set V.Voice = V.GetVoices().Item(Ivoice)
'V.Speak V.Voice.GetDescription
V.Speak strTexte
End If
EH:
If Err.Number Then
T = "Desc: " & Err.Description & vbNewLine
T = T & "Err #: " & Err.Number
MsgBox T, vbExclamation, "Run-Time Error"
End If
End SubJ'espère que cela pourrait aider certains.
Je suis bien entendu preneur de toute amélioration de ce code.
