SpeechSynthesizer & et lecture

Résolu
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018 - 30 août 2011 à 14:46
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018 - 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 !

18 réponses

Utilisateur anonyme
30 août 2011 à 18:18
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.
3
Utilisateur anonyme
30 août 2011 à 22:24
If Char.IsSeparator(textbox.text.Last) Or textbox.text.LastIndexOf(".") = textbox.text.Length - 1 Then
3
Utilisateur anonyme
30 août 2011 à 22:32
Plus simple
...   Or text.Last = "." Then
3
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018
30 août 2011 à 18:36
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) ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018
30 août 2011 à 18:49
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.
0
Utilisateur anonyme
30 août 2011 à 21:02
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
30 août 2011 à 21:04
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
30 août 2011 à 21:13
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
0
Utilisateur anonyme
30 août 2011 à 21:18
et on entendrait :
"létoale luiluiluirluira dededemademédemin" !

Oui du temps de vb6
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
30 août 2011 à 21:23
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
0
Utilisateur anonyme
30 août 2011 à 21:30
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
30 août 2011 à 21:32
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
0
Utilisateur anonyme
30 août 2011 à 21:38
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.
0
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018
30 août 2011 à 21:42
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 ?
0
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018
30 août 2011 à 21:57
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.
0
Utilisateur anonyme
30 août 2011 à 22:02
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
0
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018
30 août 2011 à 22:16
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

0
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018
30 août 2011 à 22:35
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 !
0
Rejoignez-nous