用Microsoft Agent 控件與電腦交談
發表于:2007-07-14來源:作者:點擊數:
標簽:
Microsoft Agent 控件比Office 97中的助手功能更加豐富和強大,它提供的動畫人物不僅有生動、有趣的動作,而且還能通過聲卡、麥克風與用戶進行交談,這些功能使計算機更具人性魅力,其應用前途相當廣闊。Microsoft Agent控件的內部機制很復雜,但用 VB 來操縱它卻
Microsoft Agent 控件比Office 97中的助手功能更加豐富和強大,它提供的動畫人物不僅有生動、有趣的動作,而且還能通過聲卡、麥克風與用戶進行交談,這些功能使計算機更具人性魅力,其應用前途相當廣闊。Microsoft Agent控件的內部機制很復雜,但用
VB來操縱它卻是非常方便,本文將介紹VB 5.0調用Microsoft Agent 控件的基本方法。
安裝Microsoft Agent 控件
·首先安裝Microsoft Agent的核心組件 msagent.exe。
·接著安裝Lernout & Hauspie TruVoice Text-to-Speech Engi ne(完成從文字合成語音的工作) cgram.exe。
·最后安裝 Microsoft Command and Control Speech Engine( 提供語音識別功能)Actcnc.exe。
·另外還需要A
.net動畫人物數據文件,在本文中使用了Genie.ac s、Robby.acs兩個文件。
上述文件均可從 http://www.microsoft.com/workshop/imedia/ agent/default.as p
下載。
Microsoft Agent控件的初始化
先把Microsoft Agent控件添加到VB的控制工具條上,并在用戶的 Form上繪制該控件(在下述例子中,其Name屬性設為MyAgent)。下面的代碼調用IAgentCtlCharacters::Loa d()方法裝入一個動畫人物的數據,調用IAgentCtlCharacter::Show()/Hide()方法來顯示/隱藏動畫人物。
Const DATAPATH = "c:\"
Dim Genie As IAgentCtlCharacter
Dim Robby As IAgentCtlCharacter
Dim GenieRequest1,GenieRequest2 As IAgentCtlRequest
Dim RobbyRequest1 As IAgentCtlRequestPrivate Sub Form_Load()
’裝入動畫人物數據,其中第一個參數為CharacterID
MyAgent.Characters.Load "Genie", DATAPATH & "Genie.acs"
MyAgent.Characters.Load "Robby", DATAPATH & "Robby.acs"
’獲取與CharacterID相對應的IAgentCtlCharacter變量
Set Genie = MyAgent.Characters("Genie")
Set Robby = MyAgent.Characters("Robby")
’顯示/隱藏動畫人物
Genie.Show
Genie.HideEnd Sub
Microsoft Agent 控件的動畫編程
每個動畫人物都有自己特定的動作,例如Genie有聽、看、讀、寫、發怒、感謝等數十種動畫形態,可以調用IAgentCtlCharacter::pla y()方法來設置動畫動作。為了在多個動畫人物之間協調它們的動作, 比如讓Robby等待Genie的某個動作執行完畢后才做另外一個動作,可采用IAgentCtlCharacter::Wait()方法來實現同步。在數十種動畫動作中有一類比較特殊(動作名以"ing"為后綴,如"Searching"),一旦執行便循環播放一段動畫,只有調用IAgentCtlCharacter::Inter
rupt() 方法才能終止。示例代碼如下:
Private Sub Co mmand1_Click()
Genie.Show
' 執行名為"Suggest"的動作
Genie.Play "Suggest"
' 把Genie移動到座標(200,200)處,用GenieRequest1來標識該動作請求
Set GenieRequest1 = Genie.MoveTo(200, 200)
' 執行名為"Searching"的循環動畫動作,用GenieRequest2來標識該動作請求
Set GenieRequest2 = Genie.Play("Searching")
' Robby等待Genie的MoveTo方法執行完畢,方才顯示
Robby.Wait GenieRequest1
Robby.Show
Robby.Play "Suggest"
Robby.Play "read"
Robby.Play "Congratulate"
' 由Robby來終止Genie的循環動畫動作
Robby.Interrupt GenieRequest2
Genie.Play "write"
Genie.Hide
Robby.HideEnd Sub
Microsoft Agent 控件的語音合成功能
Microsoft Agent控件支持英語的語音合成功能,只需輸入句子的文字,便會生成該句子的語音信號并通過聲卡、音箱播放出來。語音合成功能通過調用IAgentCtlCharact er::Speak()方法來實現。輸出中文時不能用上述方法,只能用WAV文件代替,給Speak()方法的第一個參數傳遞文字氣球中包含的文字,給第二個參數傳遞一個WAV文件路徑。同樣為同步多個動畫人物的語音輸出也必須使用IAgentCtlCharact er::Wait()方法。目前Mi crosoft Agent 控件還不支持多個人物的聲音混合效果。具體實現代碼如下:
Private Sub Command2_Click()
Genie.MoveTo 100, 200
Genie.Show
Genie.Play "Greet"
' Speak()方法的第一個參數即為需進行語音合成的句子文字
Genie.Speak "I am Genie, your most humble and loyal serv
ant."
Genie.Speak "Where is Robby?"
Set GenieRequest1 = Genie.Play("LookLeft")
' 等Genie的"LookLeft"執行以后,再執行Robby的動作
Robby.Wait GenieRequest1
Robby.MoveTo 250, 200
Robby.Show
Robby.Play "Greet"
Robby.Speak "Sorry for the delay."
Set RobbyRequest1 = Robby.Speak("Traffic is really busy today on the Inf ormation Superhighway.")
’等Robby講完了,Genie再講
Genie.Wait RobbyRequest1
Genie.Play "LookLeftReturn"
Genie.Speak "Welcome to the release of Microsoft Agent, the new ActiveX technology that supports interactive chara cters"
’輸出中文語音,"歡迎光臨"的中文語音包含在welcome.wav中
Genie.Speak "歡迎光臨", "c:\welcome.wav"
Genie.Hide
Robby.HideEnd Sub
Microsoft Agent 控件的語音識別功能
Microsoft Agent控件具有語音識別能力,用戶可以向動畫人物發出語音命令(同時按住Scroll Lock鍵)。Microsoft Agent控件為每個 Agent動畫人物提供一個特殊命令窗口,用以顯示該動畫人物能夠接受的所有語音命令。該命令窗口中的命令不能用鼠標或鍵盤來選取,只能通過語音??梢杂肐AgentComands::Add()方法來為命令窗口添加自定義命令。第一個參數是命令的標識符ID,第二個參數是該命令在命令窗口中的顯示標簽,第三個參數是該命令對應的語音識別句子。當用戶通過麥克風向動畫人物發出命令時會激發IAgent的Command事件, 可以編寫一個接收Command事件的過程來完成與語音命令相對應的任務。
Private Sub Command3_Click()
Static initialized As Boolean
' 添加自定義命令
If Not initialized Then
Genie.Commands.Add "Word", "Run Word", "word", True, True
Genie.Commands.Add "Time", "What time is it?", "What time is it?", True , True
Genie.Commands.Add "Bigger", "Bigger", "Bigger", True, True
Genie.Commands.Add "Smaller", "Smaller", "Smaller", True, True
initialized = True
End If
Genie.Show
Genie.Speak "Can I help you?"End SubPrivate Sub MyAgent_Command(ByVal Us erInput As Object)
Select Case UserInput.Name
Case "Time"
' 當聽到"What time is it?"后回答當前時間
Genie.Speak "The time is " & Time
Case "Word"
' 當聽到"word"后,便運行MS Word
Genie.Speak "Yes,sir!"
Shell "d:\winword\winword.exe",
vbNormalFocus
Case "Bigger"
' 當聽到"bigger"后,Genie會放大
Genie.Width = Genie.Width * 1.5
Genie.Height = Genie.Height * 1.5
Case "Smaller"
' 當聽到"samller"后,Genie會縮小
Genie.Width = Genie.Width / 1.5
Genie.Height = Genie.Height / 1.5
End Select
End Sub
原文轉自:http://www.anti-gravitydesign.com