IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

System.Speech : quelle langue ?


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Sam Placi
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Octobre 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Octobre 2019
    Messages : 68
    Par défaut System.Speech : quelle langue ?
    Bonjour,

    Voyez le bout de code (VB.Net) suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Dim s As New Speech.Synthesis.SpeechSynthesizer
            s.Speak("Tu tu tu")
    Placé sous le Click d'un bouton par exemple, ce code fonctionne mais prononce en français (la langue active sur mon système).
    Je voudrais qu'à la demande, la phrase soit prononcée en espagnol qui est une langue également installée sur mon PC.
    En espagnol, il devrait prononcer "Tou tou tou" au lieu de "Tu tu tu".

    Comment puis-je imposer la langue de sortie ?

    Merci d'avance pour vous réponses.

    Sam,

  2. #2
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 323
    Par défaut
    bonjour,
    voici un exemple pour traduire un texte en français est traduire la langue que vous choisirez pour traduire est le lire avec votre pc.
    voici en image :
    Nom : Capture d’écran 2022-07-11 091357.png
Affichages : 519
Taille : 5,5 Ko

    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Public Class Form1
     
        Dim language As String
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            If ComboBox1.Items.Count > 0 Then
                ComboBox1.SelectedIndex = 0
            End If
        End Sub
     
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            If Not String.IsNullOrEmpty(TextBox2.Text) Then
                Dim s As New Speech.Synthesis.SpeechSynthesizer
                s.Speak(TextBox2.Text)
            End If
        End Sub
     
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            If Not String.IsNullOrEmpty(TextBox1.Text) Then
                Dim threads As New Threading.Thread(Sub()
                                                        TextBox2.Invoke(Sub() TextBox2.Clear())
                                                        Dim result As String = TranslateText(TextBox1.Text, language)
                                                        TextBox2.Invoke(Sub() TextBox2.Text = result)
                                                    End Sub)
                threads.Start()
            End If
        End Sub
     
        Private Function TranslateText(texte As String, langue As String) As String
            Dim result As String = ""
            Try
                Dim webClients As New System.Net.WebClient()
                webClients.Encoding = System.Text.Encoding.UTF8
                webClients.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36")
                result = webClients.DownloadString(String.Format("https://clients5.google.com/translate_a/t?client=dict-chrome-ex&sl=auto&tl=" & langue & "&q=" & texte))
                result = result.Substring(result.IndexOf("[[""") + 3, result.LastIndexOf(""",") - 3)
            Catch ex As System.Net.WebException
                MsgBox(ex, MsgBoxStyle.Information)
            End Try
            Return result
        End Function
     
        Private Sub ComboBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
            If ComboBox1.Text = "francais" Then
                language = "fr"
            ElseIf ComboBox1.Text = "anglais" Then
                language = "en"
            ElseIf ComboBox1.Text = "espagnol" Then
                language = "es"
            End If
            '...etc
        End Sub
    End Class
    voici la list des codes pour traduire : https://fr.wikipedia.org/wiki/Liste_des_codes_ISO_639-1

    voila un exemple comment traduire un texte la langue que vous avez choisir pour lire dans votre pc.
    cordialement

  3. #3
    Membre éclairé Avatar de Sam Placi
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Octobre 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Octobre 2019
    Messages : 68
    Par défaut
    Bonjour Miska59,
    Merci beaucoup pour ton code, je ne manquerai pas de le tester.
    Mon problème n'étant pas vraiment la traduction, mais la prononciation.

    Je suppose que ton code prononce le texte français en français en utilisant la voix par défaut de ton système installé en français (probablement Hortense).
    Il est possible d'installer différent module linguistique sur le même système et il est permis de choisir celui qu'on veut pour le système et son interface.
    J'ai l'espagnol et le français, et il reste (malgré moi ?) un module anglais.

    Pour que s.speak prononce dans la langue que je veux, je lui désigne la voix appropriée (c'était ma question initiale de cette discussion).
    On désigne la voix adéquate par s.SelectVoice(NomDeLaVoix), jsute avant le s.speak et on peut obtenir les noms de voix dans une ComboBox par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For Each v As Speech.Synthesis.InstalledVoice In s.GetInstalledVoices
    ComboBox1.items.Add(v.Name)
    Next
     
    'et donc :
     
    s.SelectVoice(ComboBox1.Text)
    s.Speak("Un texte dans la langue de la voix choisie, pour obtenir une bonne prononciation, en principe")  '
    Sur mon système avec les 3 langues, les voix sont :
    1. Microsoft Hortense Desktop (la francophone)
    2. Microsoft Helena Desktop (l'hispanophone)
    3. Microsoft Zira Desktop (l'anglophone)


    Dans les paramètres du système (Windows 10), je trouve d'autres voix, il y en a plus que 3 et Zira ne s'y trouve pas. Mon problème actuel est que je voudrais pouvoir disposer des voix du système dans mon code (Pablo prononce mieux que Helena).

    Les voix dans mon code :
    Nom : Voix1.jpg
Affichages : 517
Taille : 14,0 Ko
    Les voix dans le système :
    Nom : Voix2.jpg
Affichages : 508
Taille : 28,2 Ko

    Merci d'avance pour ton aide.

    Sam

  4. #4
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 323
    Par défaut
    Bonsoir,

    si j'ai bien compris ce que vous voulez avoir tous voix qui sont installer sur votre pc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Imports System.Speech.Synthesis
    Imports System.Globalization
     
    Public Class Form1
     
        Dim language As String
        Dim reader As New SpeechSynthesizer()
        Dim listLanguage As String() = {"fr-FR", "en-US", "es-ES"}
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            If ComboBox1.Items.Count > 0 Then
                ComboBox1.SelectedIndex = 0
            End If
            InstalleVoices()
        End Sub
     
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            If Not String.IsNullOrEmpty(TextBox2.Text) Then
                reader.Volume = 100
                reader.Rate = 0
                reader.SpeakAsync(TextBox2.Text)
            End If
        End Sub
     
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            If Not String.IsNullOrEmpty(TextBox1.Text) Then
                Dim threads As New Threading.Thread(Sub()
                                                        TextBox2.Invoke(Sub() TextBox2.Clear())
                                                        Dim traduction As String = TranslateText(TextBox1.Text, language)
                                                        TextBox2.Invoke(Sub() TextBox2.Text = traduction)
                                                    End Sub)
                threads.Start()
            End If
        End Sub
     
        Private Function TranslateText(input As String, langue As String) As String
            Dim result As String = ""
            Try
                Dim webClients As New System.Net.WebClient()
                webClients.Encoding = System.Text.Encoding.UTF8
                webClients.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36")
                result = webClients.DownloadString(String.Format("https://clients5.google.com/translate_a/t?client=dict-chrome-ex&sl=fr&tl=" & langue & "&q=" & input))
            Catch ex As System.Net.WebException
                MsgBox(ex, MsgBoxStyle.Information)
            End Try
            Return result.Substring(result.IndexOf("[""") + 2, result.LastIndexOf("""]") - 2)
        End Function
     
        Private Sub ComboBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
            If ComboBox1.Text = "francais" Then
                language = "fr"
            ElseIf ComboBox1.Text = "anglais" Then
                language = "en"
            ElseIf ComboBox1.Text = "espagnol" Then
                language = "es"
            End If
            '...etc
        End Sub
     
        Private Sub InstalleVoices()
            For i = 0 To listLanguage.Length - 1
                For Each voice As InstalledVoice In reader.GetInstalledVoices(New CultureInfo(listLanguage(i)))
                    Dim info As VoiceInfo = voice.VoiceInfo
                    ComboBox2.Items.Add(info.Name)
                    If ComboBox2.Items.Count > 0 Then
                        ComboBox2.SelectedIndex = 0
                    End If
                Next
            Next
        End Sub
     
        Private Sub ComboBox2_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged
                Dim voice As String = CType(ComboBox2.SelectedItem, String)
                If voice IsNot Nothing Then
                    reader.SelectVoice(voice)
                End If
        End Sub
    End Class
    voici une mise à jour du code pour avoir tous les voix sur votre pc. Cordialement,

  5. #5
    Membre éclairé Avatar de Sam Placi
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Octobre 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Octobre 2019
    Messages : 68
    Par défaut
    J'ai déjà essayé, c'est vite fait de remplacer mon code par le tien pour remplir la ComboBox.
    Ton code donne exactement le même résultat que le mien, les 6 voix visibles dans les paramètres de Windows ne viennent pas dans la Combo.
    Peut-être peux-tu vérifier les voix dans les paramètres "son" de ton système pour voir si tu obtiens la même bizarrerie que moi.
    Merci d'avance,
    Bonne soirée,
    Sam

  6. #6
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 323
    Par défaut
    bonsoir sam,

    voici la solution a ton problème.
    Nom : Capture d’écran 2022-07-11 210800.png
Affichages : 511
Taille : 50,6 Ko

    le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim synthesier As New SpeechSynthesizer
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            For Each voice As InstalledVoice In synthesier.GetInstalledVoices
                RichTextBox1.AppendText(voice.VoiceInfo.Name & Environment.NewLine)
            Next
        End Sub
    voici un programme que j'ai récuperer : L'outil copie les éléments sélectionnés de la clé "HKLM\SOFTWARE\Microsoft\Speech_OneCore\Voices\Tokens" vers "HKLM\SOFTWARE\Microsoft\Speech\Voices\Tokens".

    En raison de la manipulation des clés dans HKLM, l'outil nécessite des droits d'administrateur pour être lancé.

    Nom : Capture d’écran 2022-07-11 211609.png
Affichages : 493
Taille : 22,5 Ko

    le lien de ce programme : https://www.dipisoft.com/file/TTSVoicePatcher.zip

    pour info : tu cliquera voix en rose du logiciel.il vont ce mettre a gauche du logiciel et tu aura tout les voix avec GetInstalledVoices.

    Cordialement,

  7. #7
    Membre éclairé Avatar de Sam Placi
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Octobre 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Octobre 2019
    Messages : 68
    Par défaut
    Impeccable !!!

    Note que le Patcher n'a pas fonctionné. Lancé en tant qu'administrateur, il s'est apparemment comporté comme annoncé mais mon code ne voyait toujours les voix souhaitées ensuite.

    Mais ton explication L'outil copie les éléments sélectionnés de la clé HKLM\SOFTWARE\Microsoft\Speech_OneCore\Voices\Tokens"
    vers "HKLM\SOFTWARE\Microsoft\Speech\Voices\Tokens"
    m'a dit que faire.

    J'ai procédé par exportation de la première clé vers un fichier xyz.reg. Dans ce fichier, j'ai remplacé les occurrences de Speech_OneCore par Speech. J'ai fait ensuite l'importation du fichier dans la registry. Comme je n'ai pas fait le détail, ce sont toutes les voix de Speech_OneCore qui ont été ajoutées à Speech.

    Mon programme reçoit toutes les voix et je peux choisir celles qui me conviennent le mieux.

    Encore merci.

    Sam

    Nom : Reg.jpg
Affichages : 481
Taille : 50,2 Ko

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Expérience du namespace System.Speech.Recognition
    Par PerpetualSnow dans le forum Framework .NET
    Réponses: 0
    Dernier message: 26/08/2009, 12h42
  2. System.speech et SpeechSynthetizer
    Par kan02 dans le forum C#
    Réponses: 1
    Dernier message: 08/04/2009, 14h39
  3. Internationalisation : quelles langues choisir ?
    Par cjacquel dans le forum Général Conception Web
    Réponses: 5
    Dernier message: 09/05/2006, 16h28
  4. Trouver en quelle langue est écrit un texte
    Par Lorponos dans le forum Autres Logiciels
    Réponses: 12
    Dernier message: 27/04/2006, 12h33
  5. [Système] Connaître la langue et le pays de l'OS
    Par seb-16000 dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 10/11/2003, 11h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo