SpeechSynthesizer & et lecture [Résolu]

l informatiquepourtous 1062 Messages postés lundi 19 mars 2007Date d'inscription 27 septembre 2015 Dernière intervention - 30 août 2011 à 14:46 - Dernière réponse : l informatiquepourtous 1062 Messages postés lundi 19 mars 2007Date d'inscription 27 septembre 2015 Dernière intervention
- 30 août 2011 à 22:35
Déjà bonjour à tous !

Voilà j'ai fait une petite application qui lis du texte grâce à SpeechSynthesizer (System.Speech) en vb.net

Dans cette application j'ai du texte s'écrie dans un textbox lettre à lettres. Mon problème est le suivant :

J'aimerais que ma lecture de texte ne se fasse que entre les espaces, c'est à dire progressivement.

Pour être plus clair voici le code avec le "pseudo-code" que j'aimerais avoir de l'aide. j'ai changer le nom des objets pour être plus clair.


  
'le tout dans un timer 
 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick


'déclaration de synth
        Dim voix As New SpeechSynthesizer

        'para. de la voix
        voix.SelectVoiceByHints(VoiceGender.Female)





        'lettre à lettes
' l'écriture progressive, qui permet d'afficher la phrase(chainedetexte) lettre par lettre 

        If textbox.Text.Length >= chainedetexte.Length Then Exit Sub
       textbox.Text = chainedetexte.Substring(0, textbox.Text.Length + 1)




' le try qui permet d'éviter d'avoir une erreur de type = index à 0 pour text.last
     
   Try

' donc si le dernier char est un espace la voix le lis le text
            If Char.IsSeparator(textbox.Text.Last) Then
               

                voix.Speak(textbox.Text)

Ce que j'aurais besoin ici c'est : voix.speak(le texte qui est juste entre l'espace et le suivant, et ne lire que la portion voulu, puis passe au suivant.)

 

            End If


        Catch ex As Exception


        End Try



End sub



Je me tiens disponible pour tout complément d'information.
Je suis débutant... Merci de votre aide !
Afficher la suite 

18 réponses

Répondre au sujet
Utilisateur anonyme - 30 août 2011 à 18:18
+3
Utile
Bonsoir,
Tu peux découper ta phrase en tableau de mots avec split :
dim montableau() as string = Textbox1.text.split(" "c)

Si tu veux lire le 3eme mot il te suffira alors d'écrire :
voix.Speak(montableau(2))

Tu peux aussi ecrire directement :
voix.Speak(Textbox1.text.split(" "c)(2))

Bonne soirée.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 30 août 2011 à 22:24
+3
Utile
If Char.IsSeparator(textbox.text.Last) Or textbox.text.LastIndexOf(".") = textbox.text.Length - 1 Then
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 30 août 2011 à 22:32
+3
Utile
Plus simple
...   Or text.Last = "." Then
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Utilisateur anonyme
l informatiquepourtous 1062 Messages postés lundi 19 mars 2007Date d'inscription 27 septembre 2015 Dernière intervention - 30 août 2011 à 18:36
0
Utile
Merci de ta réponse cela ma déjà bien fait avancer, maintenant comment déterminer le dernier mots écris et ne lire que lui ?

je pensais à quelque chose du genre :

for numérodumot = 0 to nombremaxdanslaphrase -1
voix.Speak(Textbox1.text.split(" "c)(numérodumot))
numero = numéro + 1
next


Comment d'écrire numérodumot (actuel) ?
Commenter la réponse de l informatiquepourtous
l informatiquepourtous 1062 Messages postés lundi 19 mars 2007Date d'inscription 27 septembre 2015 Dernière intervention - 30 août 2011 à 18:49
0
Utile
Bon j'ai plus ou moins réussi ...
comme çà :
 Try

            Dim b As Integer

            Dim nombredemot As Integer = chainedetexte.Split(" "c).Count
            Dim mot() As String = chainedetexte.Split(" "c)

            For b = 0 To nombredemot

                voix.Speak(mot(b))
                b = b + 1
                If b = nombredemot Then Timer1.Stop()

            Next

        Catch ex As Exception


        End Try



Seul problème c'est que quand la SpeechSynthesizer est actif il faut attendre qu'elle se termine pour afficher le reste de la fenêtre, ou dans le cas présent le texte dans le textbox.
Commenter la réponse de l informatiquepourtous
Utilisateur anonyme - 30 août 2011 à 21:02
0
Utile
La méthode Speak est bloquante.
Utilise plutôt SpeakAsync.

Imports System.Speech
Public Class Form1
    Dim WithEvents Voix As New Speech.Synthesis.SpeechSynthesizer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim texte As String = "mon chat est noir et blanc"
        Voix.SpeakAsync(texte)
    End Sub

    Private Sub Voix_StateChanged(ByVal sender As Object, ByVal e As System.Speech.Synthesis.StateChangedEventArgs) Handles Voix.StateChanged
        If e.State = Synthesis.SynthesizerState.Ready Then
            MessageBox.Show("fin de lecture")
        End If
    End Sub
End Class
Commenter la réponse de Utilisateur anonyme
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 30 août 2011 à 21:04
0
Utile
Bonjour,
- lire un texte mot par mot n'a de sens que si on le lit en cours de saisie.
- nul besoin d'un Timer dans ce cas (et ce d'autant que le denier mot sera le dernier, avec split, à chaque rajout d'une lettre au mot qui suit le dernier déjà lu !
- préférer dans ce cas utiliser l'évènement keyup, et déclencher la lecture du dernier mot à la frappe d'un espace, d'un point, d'une virgule, d'un ":", d'une tabulation, etc ... >En précisant que le tout dernier ne sera reconnu qu'à la sortie de la zone de saisie.
Il est pour ce faire clair quèe pour y parvenir, il faudra mémoriser la position du dernier mot lu précédent, à laquelle ajouter sa longueur, puis lire à partir de cette position dans l'évènement Keyup (beaucoup de boulot pour faire juste mumuse !)




____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 30 août 2011 à 21:13
0
Utile
Pour être très clair sur ce que j'ai dit :
Voilà ce que donnerait la conjugaison d'un timer avec split sur l'espace) :
Phrase à frapper :
l'étoile luira demain
et on entendrait :
"létoale luiluiluirluira dededemademédemin" !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Utilisateur anonyme - 30 août 2011 à 21:18
0
Utile
et on entendrait :
"létoale luiluiluirluira dededemademédemin" !

Oui du temps de vb6
Commenter la réponse de Utilisateur anonyme
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 30 août 2011 à 21:23
0
Utile
Oui du temps de vb6


Bonjour, banana32.
Montre-moi donc comment, avec VB.Net split et un timer, tu t'y prendrais pour parvenir à la lecture à haute voix, mot par mot, encours de saisie (donc lecture à haute voix de chaque mot frappé, en cours de frappe)
Et sans utiliser ce que j'ai préconisé, à savoir l'utilisation de KeyUp !
Je suis très intéressé par cette performance qui relèverait de facultés divinatoires de VB.Net ..
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Utilisateur anonyme - 30 août 2011 à 21:30
0
Utile
Bonsoir ucfoutu.
Non je plaisantais juste sur les perfs de vb6.
Comme tu dis, il n'est pas souhaitable d'utiliser un timer dans ce cas.
Ceci dit, rien n'indique explicitement de la part du demandeur qu'il s'agit de lire un mot au fil de la frappe.
Bien à toi.
Commenter la réponse de Utilisateur anonyme
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 30 août 2011 à 21:32
0
Utile
Ouais...
Moi, j'ai lu ceci :
Dans cette application j'ai du texte s'écrie dans un textbox lettre à lettres. Mon problème est le suivant :

J'aimerais que ma lecture de texte ne se fasse que entre les espaces, c'est à dire progressivement.

A moins que je n'aie mal compris !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Utilisateur anonyme - 30 août 2011 à 21:38
0
Utile
Ah oui mes excuses j'ai du lire en diagonale
Dans ce cas, comme tu l'as signalé, il vaut mieux utiliser l'événement KeyUp, remonter jusqu'à l'espace précédent (ou le début de ligne si c'est le premier mot voire la ponctuation précédente) et lire le mot.
Commenter la réponse de Utilisateur anonyme
l informatiquepourtous 1062 Messages postés lundi 19 mars 2007Date d'inscription 27 septembre 2015 Dernière intervention - 30 août 2011 à 21:42
0
Utile
Dans ce cas, comme tu l'as signalé, il vaut mieux utiliser l'événement KeyUp, remonter jusqu'à l'espace précédent (ou le début de ligne si c'est le premier mot voire la ponctuation précédente) et lire le mot.


Là j'ai pas tout suivie, c'est à dire ?
Commenter la réponse de l informatiquepourtous
l informatiquepourtous 1062 Messages postés lundi 19 mars 2007Date d'inscription 27 septembre 2015 Dernière intervention - 30 août 2011 à 21:57
0
Utile
Bon je les fait depuis un l'événement text_changed çà marche bien, sauf qu'il répète les phrases 2 fois, et que le texte de s'affiche pas.
Commenter la réponse de l informatiquepourtous
Utilisateur anonyme - 30 août 2011 à 22:02
0
Utile
Je t'explique avec un exemple.
A toi de l'améliorer :
Imports System.Speech
Public Class Form1
    Dim WithEvents txtSaisie As New TextBox
    Dim WithEvents Voix As New Synthesis.SpeechSynthesizer
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(txtSaisie)
    End Sub

    Private Sub txtSaisie_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtSaisie.KeyUp
        If e.KeyCode = Keys.Space Then
            Voix.SpeakAsync(txtSaisie.Text.Split(" "c)(txtSaisie.Text.Split(" "c).Length - 2))
        End If
    End Sub
End Class
Commenter la réponse de Utilisateur anonyme
l informatiquepourtous 1062 Messages postés lundi 19 mars 2007Date d'inscription 27 septembre 2015 Dernière intervention - 30 août 2011 à 22:16
0
Utile
Bon voilà, j'ai modifier un peut ton code, et çà marche vraiment bien ! il me reste juste à trouver comment lire le dernier mot quand il n'y as pas d'espace après mais un point.

J'ai pas pu utiliser l'évènement keyup car le texte c'est pas moi qui le tape.


Private Sub Textbox_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Textbox.TextChanged
       
        Dim voix As New SpeechSynthesizer
  
        Try

            If Char.IsSeparator(textbox.Text.Last) Then
                voix.SpeakAsync(textbox.Text.Split(" "c)(textbox.Text.Split(" "c).Length - 2))
            End If

        Catch ex As Exception

        End Try
    
End Sub

Commenter la réponse de l informatiquepourtous
l informatiquepourtous 1062 Messages postés lundi 19 mars 2007Date d'inscription 27 septembre 2015 Dernière intervention - 30 août 2011 à 22:35
0
Utile
Merci de ton aide, c'est pas encore parfait mais à moi maintenant d'amélioré les détails pour lire la phrase proprement, sans double mot

Réponse acceptée !
Commenter la réponse de l informatiquepourtous

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.