ISpeechPhraseRule Code Example (SAPI 5.3)
Microsoft Speech API 5.3
ISpeechPhraseRule Code Example
The following Visual Basic form code demonstrates the use of the ISpeechPhraseRule interface. To run this code, create a form with the following controls:
- A text box called Text1
- A list box called List1
- A command button called Command1
Paste this code into the Declarations section of the form.
The Form_Load procedure creates a recognizer, a recognition context and a grammar object. It loads the grammar object with the Solitaire grammar sol.xml and activates it.
The Command1 procedure speaks the text in the text box into a file for recognition. The recognition context's Recognition event displays selected information from the recognition result. It displays the phrase elements first, and then the properties of the ISpeechPhraseRule object.
Note that both the Parent and Children properties may have a value of Nothing. Attempting to reference them in this state will cause a run-time error.
Option Explicit
Const WAVEFILENAME = "C:\ISpeechPhraseRule.wav"
Dim MyRecognizer As SpeechLib.SpInprocRecognizer
Dim MyGrammar As SpeechLib.ISpeechRecoGrammar
Dim MyFileStream As SpeechLib.SpFileStream
Dim PhraseElem As SpeechLib.ISpeechPhraseElement
Dim Voice1 As SpeechLib.SpVoice
Dim Voice2 As SpeechLib.SpVoice 'Plays the wave file back
Dim WithEvents MyRecoContext As SpeechLib.SpInProcRecoContext
Private Sub Command1_Click()
On Error GoTo EH
List1.Clear
' Create ISpeechPhraseReplacement.wav file from text in text box.
Set MyFileStream = MakeWAVFileFromText(Text1.Text, WAVEFILENAME)
'Set the file as recognizer's input stream
MyFileStream.Open WAVEFILENAME
Set MyRecognizer.AudioInputStream = MyFileStream
EH:
If Err.Number Then ShowErrMsg
End Sub
Private Sub Form_Load()
' Create Recognizer, RecoContext, Grammar, and Voice
Set MyRecognizer = New SpInprocRecognizer
Set MyRecoContext = MyRecognizer.CreateRecoContext
Set MyGrammar = MyRecoContext.CreateGrammar(16)
Set Voice1 = New SpVoice
Set Voice1.Voice = Voice1.GetVoices("gender=male").Item(0)
Set Voice2 = New SpVoice
On Error GoTo EH
' Load Grammar with solitaire XML, set active
MyGrammar.CmdLoadFromFile "C:\sol.xml", SLODynamic
MyGrammar.CmdSetRuleIdState 0, SGDSActive 'Set MyRecoContext & MyRecoContext active
MyGrammar.DictationSetState SGDSActive 'Set Dictation active
Text1.Text = "play the eight of clubs"
EH:
If Err.Number Then ShowErrMsg
End Sub
Private Sub SpeakToFile(ByVal strText As String, ByVal strFName As String)
On Error GoTo EH
Set MyFileStream = New SpFileStream 'Create stream
MyFileStream.Open strFName, SSFMCreateForWrite, True 'Open as the filename
Set Voice1.AudioOutputStream = MyFileStream 'Set voice output to file
Voice1.Speak strText, SVSFIsXML 'Speak synchronously
MyFileStream.Close 'Close file
EH:
If Err.Number Then ShowErrMsg
End Sub
Private Sub MyRecoContext_Recognition _
(ByVal StreamNumber As Long, _
ByVal StreamPosition As Variant, _
ByVal RecognitionType As SpeechLib.SpeechRecognitionType, _
ByVal Result As SpeechLib.ISpeechRecoResult)
Dim X As String
Dim ii As Integer
Dim PR As ISpeechPhraseRule
Dim PRs As ISpeechPhraseRules
On Error GoTo EH
ii = 0
For Each PhraseElem In Result.PhraseInfo.Elements
X = "element" & Str(ii) & ": " & PhraseElem.DisplayText
List1.AddItem X
ii = ii + 1
Next
'This is the rule that recognition was based on
Set PR = Result.PhraseInfo.Rule
List1.AddItem ""
List1.AddItem "Id: " & PR.Id
List1.AddItem "Rule: " & PR.Name
List1.AddItem "NumberOfElements: " & PR.NumberOfElements
List1.AddItem "FirstElement: " & PR.FirstElement
List1.AddItem "EngineConfidence: " & PR.EngineConfidence
List1.AddItem "Confidence: " & PR.Confidence
List1.AddItem ""
If PR.Parent Is Nothing Then
List1.AddItem "Parent: none"
Else
List1.AddItem "Parent: " & PR.Parent.Name
End If
If PR.Children Is Nothing Then
List1.AddItem "Children: none"
Else
'This routine replaces the original PR object
Set PRs = PR.Children
ii = 0
For Each PR In PRs
List1.AddItem "Child" & Str(ii) & ": " & PR.Name
ii = ii + 1
Next
End If
EH:
If Err.Number Then ShowErrMsg
End Sub
Private Sub MyRecoContext_EndStream _
(ByVal StreamNumber As Long, _
ByVal StreamPosition As Variant, _
ByVal StreamReleased As Boolean)
On Error GoTo EH
MyFileStream.Close
DoEvents
MyFileStream.Open WAVEFILENAME
Voice2.SpeakStream MyFileStream
MyFileStream.Close
EH:
If Err.Number Then ShowErrMsg
End Sub
Private Function MakeWAVFileFromText _
(ByVal strText As String, _
ByVal strFName As String) _
As SpFileStream
On Error GoTo EH
' Declare identifiers:
Dim FileStream As SpFileStream
Dim Voice As SpVoice
' Instantiate Voice and FileStream objects:
Set Voice = New SpVoice
Set FileStream = New SpFileStream
' Open specified .wav file, set voice output
' to file, and speak synchronously:
FileStream.Open strFName, SSFMCreateForWrite, True
Set Voice.AudioOutputStream = FileStream
Voice.Speak strText, SVSFIsXML
' Close file and return reference to FileStream object:
FileStream.Close
Set MakeWAVFileFromText = FileStream
EH:
If Err.Number Then ShowErrMsg
End Function
Private Sub ShowErrMsg()
' Declare identifiers:
Const NL = vbNewLine
Dim T As String
T = "Desc: " & Err.Description & NL
T = T & "Err #: " & Err.Number
MsgBox T, vbExclamation, "Run-Time Error"
End
End Sub