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,

Bizarre, mon excel est en français, j'ai fait une macro la plus simple possible et cela marche parfaitement bien, le texte renvoyé est bien en anglais.

Voici la macro et les librairies sélectionnées dans mes références.

cheickna

Cdlt

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 "".
Voici mes références:

image

Bonsoir cheickna

ATTENTION

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 Integer

Etape 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 Function

Etape 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 Sub

J'espère que cela pourrait aider certains.
Je suis bien entendu preneur de toute amélioration de ce code.

Rechercher des sujets similaires à "comment changer langue fonction application speech speak"