ISpeechPhraseAlternate Code Example

Microsoft Speech SDK

Intelligent Interface Technologies Home Page Microsoft Speech SDK

Speech Automation 5.1

Interface: ISpeechPhraseAlternate

ISpeechPhraseAlternate Code Example


The following Visual Basic form code displays use of the ISpeechPhraseAlternate object. It demonstrates recognition and the EmulateRecognition method. In addition, it demonstrates the use of the SpeechDocs DLL created in the Sample DLL section. This DLL must be created before this code can be run.

To run this code, create a form with the following controls:

  • A text box called Text1
  • Two list boxes, called List1 and List2
  • Two command buttons, called Command1 and Command2
  • Paste this code into the Declarations section of the form.

    Because this code uses the SpeechDocs DLL, it is necessary to add a reference to "SpeechDocs" in the Project, References dialog.

    The solitaire grammar is located in the default directory for a standard SAPI SDK installation. If the file is not there, use the path to an existing version. If no file is available, use the example code from VB Application Sample: Command and Control Recognition if needed.

    The Form_Load procedure creates a recognizer, a recognition context, and a grammar object. It loads the grammar object with sol.xml, the Solitaire grammar from the SAPI sample code, then activates the command and control (C and C) and dictation components of the grammar, and places a Solitaire command in the text box. Text matching the rules of the Solitaire grammar will produce better recognition results, but in order to demonstrate recognition alternates, it is necessary to enter phrases that do not satisfy grammar rules.

    The command button, captioned Recognition, speaks text from the text box into an audio file, and then performs speech recognition of that file. The command button captioned EmulateRecognition simply calls the EmulateRecognition method.

    When alternates are available, the code displays three alternates in the top list box, and shows the phrase elements of one alternate in the lower list box. Click any alternate to display its phrase elements in the lower list box. Double click any alternate to perform the Commit method on that alternate. In the illustration below, the first alternate is incorrect; the second alternate is highlighted, and its phrase elements are displayed in the lower list box.

    The data displayed in the lower list box is the same data displayed in the ISpeechPhraseElement code example. Please see that page for full details.



    Option Explicit
    
    Dim D As SpeechDocs.Class1      'DLL created from Speech docs
    
    Const WAVEFILENAME = "C:\ISpeechPhraseElement.wav"
    
    Private blnAlternatesExist As Boolean
    
    Dim R As SpeechLib.SpInprocRecognizer
    Dim G As SpeechLib.ISpeechRecoGrammar
    Dim F As SpeechLib.SpFileStream
    Dim V As SpeechLib.SpVoice
    
    Dim PI As SpeechLib.ISpeechPhraseInfo
    Dim A As SpeechLib.ISpeechPhraseAlternate
    Dim AA As SpeechLib.ISpeechPhraseAlternates
    Dim E As SpeechLib.ISpeechPhraseElement
    Dim EE As SpeechLib.ISpeechPhraseElements
    
    Dim WithEvents C As SpeechLib.SpInProcRecoContext
    
    Private Sub Command1_Click()
        
        List1.Clear
        List2.Clear
        Screen.MousePointer = vbHourglass
        
        'Call this method in the DLL to speak into a file
        Set F = D.SpeakToFile(Text1.Text, WAVEFILENAME, "Microsoft Sam")
        
        'Set the file as recognizer's input stream
        F.Open WAVEFILENAME
        Set R.AudioInputStream = F
    
    End Sub
    
    Private Sub Command2_Click()
    
        List1.Clear
        List2.Clear
        Screen.MousePointer = vbHourglass
        C.Recognizer.EmulateRecognition Text1.Text
    
    End Sub
    
    Private Sub Form_Load()
    
        ' Create Recognizer, RecoContext, Grammar, and Voice
        Set R = New SpInprocRecognizer
        Set C = R.CreateRecoContext
        Set G = C.CreateGrammar(16)
        Set V = New SpVoice
        
        Set D = New SpeechDocs.Class1   'Create Class1 object from SpeechDocs DLL
        
        ' Load Grammar with solitaire XML, set active
        G.CmdLoadFromFile "C:\Program Files\Microsoft Speech SDK 5.1\Samples\CPP\Reco\sol.xml", SLOStatic
        G.CmdSetRuleIdState 0, SGDSActive           'Set C & C active
        G.DictationSetState SGDSActive              'Set Dictation active
    
        Text1.Text = "let's go over minor details"
        Command1.Caption = "&Recognition;"
        Command2.Caption = "&EmulateRecognition;"
            
    End Sub
    
    Private Function PhonesToString(ByVal arrV As Variant) As String
        Dim ii As Integer, S As String
        If IsEmpty(arrV) Then
            PhonesToString = ""
        Else
            For ii = 0 To UBound(arrV)
                If Len(S) Then
                    S = S & "," & arrV(ii)
                Else
                    S = arrV(ii)
                End If
            Next ii
            PhonesToString = S
        End If
    End Function
    
    Private Sub C_Recognition(ByVal StreamNumber As Long, _
                        ByVal StreamPosition As Variant, _
                        ByVal RecognitionType As SpeechLib.SpeechRecognitionType, _
                        ByVal Result As SpeechLib.ISpeechRecoResult)
        Dim nn As Integer
        
        Set AA = Result.Alternates(3)       'May or may not be available
        If AA Is Nothing Then
        
            'No alternates when speech matches a grammar rule
            'No alternates when using EmulateRecognition
            blnAlternatesExist = False
            List1.AddItem Result.PhraseInfo.GetText
            If Len(Result.PhraseInfo.Rule.Name) Then
                List1.AddItem "   matches rule """ & Result.PhraseInfo.Rule.Name & """"
            End If
            Set PI = Result.PhraseInfo
        Else
        
            blnAlternatesExist = True
            nn = 0
            For Each A In AA
                List1.AddItem "alt" & Format(nn) & ": " & A.PhraseInfo.GetText
                nn = nn + 1
            Next
            Set PI = AA.Item(0).PhraseInfo
        End If
        
        List1.ListIndex = 0     'Highlight the selected alternate
        Call DisplayPhraseElements(0)
        Screen.MousePointer = vbDefault
    
    End Sub
    
    Private Sub C_EndStream(ByVal StreamNumber As Long, _
                        ByVal StreamPosition As Variant, _
                        ByVal StreamReleased As Boolean)
                        
        'Recognition uses the Filestream, EmulateReco does not
        If ActiveControl.Caption = "&Recognition;" Then
            F.Close
            DoEvents
            F.Open WAVEFILENAME
            V.SpeakStream F
            F.Close
        End If
        Screen.MousePointer = vbDefault
        
    End Sub
    
    Private Sub DisplayPhraseElements(Index As Integer)
        Dim X As String
        Dim T As String
        Dim A1 As Long, A2 As Long
        Dim T1 As Long, T2 As Long
        Dim C1 As Single, C2 As Integer, C3 As Integer
        
        List2.Clear
        
        'If no alternates, then there is only one PhraseInfo
        If blnAlternatesExist = True Then
            Set PI = AA.Item(Index).PhraseInfo
        End If
        
        For Each E In PI.Elements
    
            'Audio data
            A1 = E.AudioStreamOffset
            A2 = E.AudioSizeBytes
            X = Format(A1, "000000") & " " & Format(A2, "000000") & "  "
            
            'Time data
            T1 = E.AudioTimeOffset
            T2 = E.AudioSizeTime
            X = X & Format(T1, "000000000") & " " & Format(T2, "000000000") & "  "
            
            'Display attributes
            X = X & Format(E.DisplayAttributes) & " "
            
            'Confidences
            C1 = E.EngineConfidence
            C2 = E.ActualConfidence
            C3 = E.RequiredConfidence
            T = "(" & Format(C1) & " " & Format(C2) & " " & Format(C3) & ")"
            X = X & Left(T & "         ", 14)
        
            'Text and pronunciation
            X = X & Left(E.DisplayText & "              ", 14)
            X = X & PhonesToString(E.Pronunciation)
            
            List2.AddItem X
        Next
    
    End Sub
    
    Private Sub List1_Click()
        Call DisplayPhraseElements(List1.ListIndex)
    End Sub
    
    Private Sub List1_DblClick()
        AA.Item(List1.ListIndex).Commit
    End Sub