Synthèse et reconnaissance vocale

Signaler
Messages postés
661
Date d'inscription
vendredi 2 décembre 2005
Statut
Membre
Dernière intervention
23 mars 2011
-
Messages postés
32
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
23 juin 2009
-
Bonjour,

J'ai reussi à faire une transcription en VB.NET du tutoriel présent à cette adresse : http://lgmorand.developpez.com/dotnet/syntrecovocale/

La synthèse vocale fonctionne très bien. En revanche j’ai quelques soucis avec la reconnaissance vocale. La méthode « HandlerReco » est bien appelée à chaque fois que je prononce un mot. En revanche, il n’arrive pas à afficher la règle déclenchée (retour d’une chaîne vide dans la variable « regle »).

Et en ce qui la variable « entree », j'ai affiché ce qu'elle contenait avec une MessageBox et il me retourne pas le mot identifié mais à chaque fois le mot « blah ».

Alors je voudrais savoir si vous pourriez tester ce code et si vous obteniez la même chose ?

Pour que le code fonctionne fonctionne bien, il faut :
          1°   Installer Microsoft Speech SDK 5.1 (disponible à cette adresse : 5E86EC97-40A7-453F-B0EE-6583171B4530&displaylang=en http://www.microsoft.com/downloads/details.aspx?FamilyId=5E86EC97-40A7-453F-B0EE-6583171B4530&displaylang=en 
                     >>> Nom du fichier : SpeechSDK51.exe                68.0 MB
         
           2°   Ajouter une référence avec le fichier sapi.dll se trouvant dans ce répertoire : " C:\Program Files\Fichiers communs\Microsoft Shared\Speech "

           3°   Configurer Windows pour qu'il utilise le moteur du Speech SDK "SAPI Developer Sample Engine"



              Panneau de configuration > Voix
Voici le code en VB.NET :


<!-- BEGIN TEMPLATE: bbcode_code -->

Code :







Private
Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles Button1.Click
test(TextBox1.Text)' TestBox1.Text contient le texte que l’utilisateur veut entendreEndSub
 
Sub test(ByVal phrase AsString)' Synthèse vocaleDim voix AsNew SpVoice
Dim flags As SpeechVoiceSpeakFlags

If ComboBox1.SelectedItem = ""Then
MsgBox("Veuillez sélectionner le type de voix !!!", MsgBoxStyle.OkOnly)ExitSubEndIf
voix.Voice voix.GetVoices("", "").Item(Convert.ToInt32(ComboBox1.SelectedIndex))If TextBox1.Text ""Then
MsgBox("Veuillez entrer une phrase !!!", MsgBoxStyle.OkOnly)ExitSubEndIf
voix.Speak(phrase, flags)
voix.Volume = 50EndSub
 
--------------------------------------------------------------------------
 
PrivateSub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles Button2.Click
test2()EndSub
 
Sub test2()' Reconnaissance vocaleDim monRecoContext AsNew SpSharedRecoContext
Dim maGrammaire As ISpeechRecoGrammar = monRecoContext.CreateGrammar(0)
 
maGrammaire.CmdLoadFromFile("C:\grammaire.xml", SpeechLoadOption.SLODynamic)
maGrammaire.DictationSetState(SPRULESTATE.SPRS_ACTIVE)
 
AddHandler monRecoContext.Recognition, AddressOf HandlerReco
 
EndSub
 
#Region"HandlerReco"PrivateSub HandlerReco(ByVal StreamNumber AsInteger, ByVal StreamPosition AsObject, ByVal RecognitionType As SpeechRecognitionType, ByVal result As ISpeechRecoResult)Dim entree AsString result.PhraseInfo.GetText(0, -1, True)Dim regle AsString result.PhraseInfo.Rule.Name
MsgBox(entree)Dim precision AsDouble CDbl(result.PhraseInfo.Elements.Item(0).ActualConfidence)Dim precision2 AsDouble CDbl(result.PhraseInfo.Elements.Item(0).ActualConfidence)
 
If precision <= -1ThenSelectCase regle
Case"message" : MessageBox.Show("Nouveau message")Case"exit" : MessageBox.Show("L'application va être fermée")EndSelectEndIfEndSub#End Region





<!-- END TEMPLATE: bbcode_code -->



Voici le contenu du fichier “Grammaire.XML”


<!-- BEGIN TEMPLATE: bbcode_quote -->



Citation:

<GRAMMAR LANGID="409">
<RULE NAME="developpez" TOPLEVEL="ACTIVE">
developpez

</RULE>
<RULE NAME="message" TOPLEVEL="ACTIVE">
message

</RULE>
<RULE NAME="hide" TOPLEVEL="ACTIVE">
hide

</RULE>
<RULE NAME="exit" TOPLEVEL="ACTIVE">
<L>
exit

close

</L>
</RULE>
</GRAMMAR>



<!-- END TEMPLATE: bbcode_quote -->

Merci à tous ceux qui prêteront un peu d'attention à mon post.

6 réponses

Messages postés
661
Date d'inscription
vendredi 2 décembre 2005
Statut
Membre
Dernière intervention
23 mars 2011
8
Private
Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles Button1.Click
    test(TextBox1.Text)' TestBox1.Text contient le texte  que l’utilisateur veut entendre
EndSub
 
Sub test(ByVal phrase AsString)' Synthèse vocale
    Dim voix AsNew SpVoice
    Dim flags As SpeechVoiceSpeakFlags
   
    If ComboBox1.SelectedItem = ""Then
        MsgBox("Veuillez sélectionner le type de voix !!!", MsgBoxStyle.OkOnly)
        ExitSub
    EndIf
    voix.Voice = voix.GetVoices("", "").Item(Convert.ToInt32(ComboBox1.SelectedIndex))
    If TextBox1.Text = ""Then
        MsgBox("Veuillez entrer une phrase !!!", MsgBoxStyle.OkOnly)
        ExitSub
    EndIf
    voix.Speak(phrase, flags)
    voix.Volume = 50
EndSub
 
--------------------------------------------------------------------------
 
PrivateSub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles Button2.Click
test2()
EndSub
 
Sub test2()' Reconnaissance vocale
       
Dim monRecoContext AsNew SpSharedRecoContext
      Dim maGrammaire As ISpeechRecoGrammar = monRecoContext.CreateGrammar(0)
 
      maGrammaire.CmdLoadFromFile("C:\grammaire.xml", SpeechLoadOption.SLODynamic)
      maGrammaire.DictationSetState(SPRULESTATE.SPRS_ACTIVE)
 
      AddHandler monRecoContext.Recognition, AddressOf HandlerReco
 
EndSub
 
#Region"HandlerReco"
    PrivateSub HandlerReco(ByVal StreamNumber AsInteger, ByVal StreamPosition AsObject, ByVal RecognitionType As SpeechRecognitionType, ByVal result As ISpeechRecoResult)
        Dim entree AsString = result.PhraseInfo.GetText(0, -1, True)
        Dim regle AsString = result.PhraseInfo.Rule.Name
        MsgBox(entree)
        Dim precision AsDouble = CDbl(result.PhraseInfo.Elements.Item(0).ActualConfidence)
        Dim precision2 AsDouble = CDbl(result.PhraseInfo.Elements.Item(0).ActualConfidence)
 
        If precision <= -1Then
            SelectCase regle
                Case"message" : MessageBox.Show("Nouveau message")
                Case"exit" : MessageBox.Show("L'application va être fermée")
            EndSelect
        EndIf       
    EndSub
#End Region
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Bonjour,

Peut-être une remarque/question stupide : Est-ce que le fait que tu utilises la reconnaissance Anglaise au lieu du Français, jouerais un rôle dans ton problème ?
(fichier : Mcrosoft English Recognizer)

Amicalement,
Us.
Messages postés
661
Date d'inscription
vendredi 2 décembre 2005
Statut
Membre
Dernière intervention
23 mars 2011
8
Salut us_30,

Je me suis trompé c'est pas Microsoft English Recognizer v5.1 mais SAPI Developer Sample Engine qui est utilisé comme moteuret lorsque je teste la synthèse vocale (pour cela, j'ai une TextBox où l'utilisateur
peut rentrer le texte en français qu'il désire entendre). La voix qui dit la phrase de l'utilisateur est française, ce n'est pas une voix anglaise à qui on demande de dire une phrase française. L'accent est correct.


Est ce que tu as reussi à tester mon code ou si tu as d'autres questions sur des points d'ombres sur mon code n'hésites pas à me les poser.


Merci de m'avoir répondu aussi vite.
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Bonsoir,

Désolé, je ne peux pas tester ton code car c'est du VB.NET si j'en crois les constantes... je ne faisais qu'une suggestion.
Je laisse une personne calée sur le sujet en VB.Net répondre...

Déjà "blah" cela me cause pas beaucoup, ni sur la base de connaissances de Microsoft ... c'est pas trés clair... IL me semble que cela est lié à un dépassement de capacité
ou quelque chose comme ça... (mauvais typage ?)... c'est vraiment tous que je peux faire... c'est pas grand chose... désolé.

Amicalement,
Us.
Messages postés
32
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
23 juin 2009

digital1977
Messages postés
32
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
23 juin 2009

digital1977
Salut,

Peux-tu s'il te plait me convertir ce bout de code DotNet en VB6 ?

SpVoice voix = new SpVoice();
SpeechVoiceSpeakFlags flags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
voix.Voice = voix.GetVoices("","").Item(Convert.ToInt32(numericUpDown1.Value));
voix.Speak("hello world", flags);
voix.Volume=50;