Download.microsoft.com



Virtual Lab: UCMA 3.0 Workflow SDK入門目標:使用工作流程活動以配合自來電者收集資料、執行條件邏輯、執行自訂程式碼、取得使用者的出席狀態與傳送呼叫等通訊功能。使用自訂的DTMF語法以自來電者收集資料。透過提供個人化指示與說明功能以提供給來電者良好的使用者體驗。情境:Unified Communications Managed API 3.0 Workflow SDK允許使用者建立支援包含語音與即時訊息通訊、精確的指示與文法的工作流程等功能的Windows工作流程以支援機器與人類對話、包含呼叫轉傳與偵測通訊事件之呼叫控制,以及使用出席感知能力以智慧化的路由呼叫等能力。估計時間:45分鐘。在本實驗中的電腦:TS-SeanTS-Anna所有電腦的管理員帳戶密碼均為pass@word1。UCMA 3.0 Workflow SDK簡介UCMA 3.0 Workflow SDK是UCMA 3.0 SDK的一部份,它可以用來在伺服端應用程式中建置支援工作流程的應用程式,非常適合用來開發Call Center類型的應用程式,它可以讓開發人員自由的設定要求來電者(Caller)提供輸入的資料,並且依來電者輸入的資訊進行回應,最佳的應用程式範例就是大家最常用到的銀行信用卡開卡程式,或是客戶中心自動接電話的智慧型應答者(Intelligence Attendant),會視來電者輸入的資料遞交給不同的程式或是直接交給總機或客服人員直接進行語音對話等。Workflow SDK內是以.NET Framework的Windows Workflow Foundation為基石,而開發人員更可以直接利用Visual Studio內的Workflow Designer來設計工作流程與撰寫程式等,UCMA Workflow SDK提供了充份的組件與類別以支援開發這類工作流程應用程式所需。Workflow SDK內包含了兩項重要的元件:各種不同的活動(activity),這些活動將UCMA核心的Managed API與WF核心完美的整合,以支援Workflow Designer的工作流程開發。文法(Grammar)元件,這是Workflow SDK最重要的元件,透過文法的定義,可以讓應用程式自動偵測來自來電者的輸入資料,並做出各種不同的回應(例如選項的提示或是輸入錯誤的語音回應等)。本實驗即要帶領開發人員實際體驗UCMA Workflow 3.0 SDK的各式功能。練習1:UCMA 3.0 Workflow SDK的工作流程活動情境:在下列練習中您將會實際實作Microsoft Lync 2010的自動化程式。工作項目細部流程在TS-Sean電腦中完成下列程序開啟Visual Studio方案注意:在本工作中,你將會開啟專案並以設定它以你的參數值來執行。自開始功能表,瀏覽All Programs > Microsoft Visual Studio 2010。按下Microsoft Visual Studio 2010的圖示以啟動它。選擇功能表File > Open Project。瀏覽到資料夾C:\%UC14TrainingKit%\Labs\7\Source\Before。開啟UCMA_WorkflowActivities方案。在Solution Explorer中,打開App.config檔。變更ApplicationId的值為你的UCMA 3.0應用程式的值,如:urn:application:LabApp10600。變更ApplicationName的值為你的UCMA 3.0應用程式的值,如:LabApp10600。變更TrustedContactUri的值為你的UCMA 3.0應用程式所建立的聯絡人的值,如:sip:LabContact10600@。變更SecondaryLabUserId的值為SIP URI,如:sip@annal@。建立工作流程注意:在本工作中,你將會學習使用在UCMA 3.0 Workflow SDK中各種不同的工作流程。在Solution Explorer中,開啟Workflow1.xoml。開啟並停駐(pin)工具盒。展開工具盒的Unified Communications Workflow區段。將SpeechStatement活動拖到Workflow的設計工具中並將它放到communicationsSequenceActivity1的第一個活動。開啟新活動的屬性並更名為Welcome。在Welcome活動上按右鍵,並選擇Generate Handlers。加入下列程式碼到Welcome_TurnStarting事件常式,我們想要讓Workflow來以名稱向使用者問候,所以我們需要動態建構MainPrompt的數值,SpeechStatementActivity的TurnStarting事件會在活動要播放指令時觸發。[C#]this.Welcome.MainPrompt.AppendText( "Welcome {0}. I can help you manage your tasks", GetUserDisplayName(communicationsSequenceActivity1.CallProvider.Call.RemoteEndpoint.Participant.Uri)); 切回Workflow Designer。選取EnterPIN活動並開啟它的屬性。選取EnterPIN活動的ExpectedDtmfInputs屬性並按下”...”按鈕以編輯屬性。請輸入1 2 3 4 5(每個數字間以空白間隔)並按OK,在稍後的練習中,你將會修改這個活動並接受來自使用者更複雜的輸入。但現在本活動只需要接受1 2 3 4 5為有效輸入。設定EnterPIN的IncompleteTimeout屬性值為00:00:20,此屬性指示使用輸入資料後到收集完成的時間長度。設定EnterPIN的InitialSilenceTimeout屬性值為00:00:10,此屬性指示在開始給定輸入值或收集失敗的時間長度。設定EnterPIN的MainPrompt屬性值為Please enter your 5 digit PIN,此屬性是在活動起始時播放用。設定完成後的EnterPIN屬性如圖所示。在CheckPIN活動上按兩下,此自訂程式碼活動(Code Activity)是Windows Workflow 3.0原生活動,並且它會執行在ExecuteCode內的程式碼。加入下列程式碼到CheckPIN_ExecuteCode事件常式,在正式環境中,你可以執行一段程式碼來驗證由來電者輸入的PIN碼。[C#]_validPIN = true; 在GetTask活動上按兩下,並加入下列程式碼到GetTasks_ExecuteCode事件常式以自XAML檔取得來電者的工作。[C#]XDocument xdoc = XDocument.Load("Tasks.xml"); _tasks = (from t in xdoc.Elements("Tasks").Elements("Task") where !t.Element("Status").Equals("Completed") select new Task { Id = Convert.ToInt32(t.Element("Id").Value), AssignedTo = Program.SecondaryLabUserId, Description = t.Element("Description").Value, Status = t.Element("Status").Value }).ToList(); 回到Workflow Designer。將SpeechQuestionAnswer活動拖到Workflow設計介面中,並將它放到GetTasks活動之後。開啟新活動的屬性並更名為ChooseTask。設定ChooseTask的IncompleteTimeout屬性值為00:00:20。設定ChooseTask的InitialSilenceTimeout屬性值為00:00:10。選取ChooseTask活動的ExpectedDtmfInputs屬性並按下”...”按鈕以編輯屬性。請在不同的列中輸入1-9的數字,並按OK,在稍後的練習中,你將會修改這個活動以接取在執行期來自GetTasks活動所擷取的工作。設定完的ChooseTask活動屬性如下圖所示:在ChooseTask活動上按右鍵並選擇Generate Handlers。加入下列程式碼到ChooseTask_TurnStarting事件常式,在擷取來電者的工作後動態的建立ChooseTask活動的MainPrompt屬性值,AppendBreak是在指令中加入中斷,以讓指令聽起來更自然,而PromptBreak列舉值是用來表示不同長度的中斷。[C#]this.ChooseTask.MainPrompt.ClearContent(); this.ChooseTask.MainPrompt.AppendText("Please choose one of the following active tasks:"); this.ChooseTask.MainPrompt.AppendBreak(PromptBreak.Medium); foreach (var task in _tasks) { this.ChooseTask.MainPrompt.AppendText("Task {0}: {1}", task.Id, task.Description); this.ChooseTask.MainPrompt.AppendBreak(PromptBreak.Medium); } 切回到Workflow Designer。在SetTask活動中按兩下並加入下列程式碼至SetTask_ExecuteCode以設定選取的工作。[C#]_selectedTaskId = Convert.ToInt32(this.ChooseTask.RecognitionResult.Text.Replace(" ", String.Empty)); 將GetPresence活動拖到Workflow Designer設計介面中,並將它放在SelectedTask活動後。開啟新活動的屬性並更名它為GetPresence,GetPresense會提示警示指出活動的Targets屬性未設定,Targets屬性表示要查詢出席狀態的使用者清單,你將在稍後於執行期以SelectedTask指派的使用者為主,設定Targets屬性。在SelectedTask活動上按右鍵,選擇View Code。加入下列程式碼於SelectedTask_TurnStarting事件常式的結尾,當來電者選擇一個工作時,加入被指派的使用者到GetPresence的Targets集合。[C#]this.GetPresenceActivity1.Targets.Add(new RealTimeAddress(_taskAssignedToUri)); 選取IfElseActivityOnline中的分支IfElseBranchOnline並開啟它的屬性。選擇條件類型以宣告角色條件然後將條件展開。按下Condition Name屬性中的”...”按鈕,以設定If-Else分支的條件。選取Placeholder條件並按Edit。在儲存條件後,按Rename以更名它為UserIsOnline。將BlindTransfer活動拖到IfElseActivityTransfer的IfElseBranchTransfer分支中。開啟新活動的屬性並更名為BlindTransfer,BlindTransfer活動會指示CallerParty屬性尚未設定。在UserIsOnline活動上按右鍵並選擇View Code。加入下列程式碼於UserIsOnline_TurnStarting事件常式中以設定BlindTransfer活動的CalledParty屬性。[C#]this.BlindTransfer.CalledParty = new RealTimeAddress(_taskAssignedToUri); 儲存變更。測試工作流程注意:在本工作中,你將會執行與測試你在前一步驟中完成的工作流程方案。切換到TS-Anna電腦。開啟Microsoft Lync。設定使用者的狀態為Available。切換回TS-Sean電腦。切換至Visual Studio 2010。由功能表的Debug > Start Without Debugging或按CTRL+F5啟動應用程式。開啟Microsoft Lync。找到你的UCMA 3.0應用程式所顯露的聯絡人,例如LabContact10600@。提交語音呼叫到該聯絡人,此時會以來電者的名稱自動應答,並指示使用者輸入五位數的PIN碼。輸入12345作為PIN碼,自動應答會擷取來電者的可用活動並提示它們作為選擇。輸入1以選擇第一項工作,自動應答系統確認來電者的選擇,工作流程會檢查指派工作的使用者的出席狀態,應答程式會通知使用者是在線上並詢問是否想要轉接給其他使用者。按1表示同意,工作流程會轉接此呼叫。切換到TS-Anna。回答連入呼叫。掛斷。切換到TS-Sean。切換到主控台應用程式並按ENTER,應用程式終端點會終止,同時協同平台會關閉。練習2:建立自訂的文法情境:文法(Grammars)會用來自使用者端收集複雜的語音與DTMF輸入,在本練習中,你將會使用Grammar-Xml(GRXML)語法建立一個自訂的文法宣告,你也會使用在UCMA 3.0 Workflow SDK中內含的Microsoft.Speech.Recognition.SrgsGrammar類別動態的建立文法。工作項目細部流程在TS-Sean電腦中完成下列程序使用GRXML建立自訂文法EnterPIN活動預期會輸入五位數的編號順序,其ExpectedDtmfInputs屬性不足以正常的描述此順序,你將會加入在1-9之間可能的組合值作為預期的輸入值,解決的方式是使用DTMF文法以宣告預期的DTMF輸入描述。加入新的XML檔到WorkflowActivities專案。更名此XML檔案為PINGrammar.grxml。開啟PINGrammar.grxml的屬性。設定Build Action為Content。設定Copy to Output Directory為Copy Always,當WorkflowActivities專案編譯時,PINGrammar.grxml會複製到與專案二進位檔相同的位置。使用下列內容取代PINGrammar.grxml的內容。[XML]<grammar xml:lang="en-US" root="ValidPIN" mode="dtmf" tag-format="properties-ms/1.0" version="1.0" xmlns=""> <rule id="digit" scope="public"> <one-of> <item>0</item> <item>1</item> <item>2</item> <item>3</item> <item>4</item> <item>5</item> <item>6</item> <item>7</item> <item>8</item> <item>9</item> </one-of> </rule> <rule id="ValidPIN" scope="public"> <one-of> <item repeat="5"> <ruleref uri="#digit"/> </item> </one-of> </rule> </grammar> 你能透過設定grammar元件頂層的mode屬性以設定文法只接受DTMF,否則,預設行為是文法可用來驗證語音和DTMF輸入。文法可簡單的以規則集來表示,第一個規則是輸入必須是清單中的其中之一才是有效,而清單中的項目是0-9的數字。頂層的grammar元件指定了本文法的根規則是id為ValidPIN的規則,根規則是文法會處理的主要規則,ValidPIN規則參考了digit規則並要求順序要重覆五次。切換回Workflow Designer。選取EnterPIN活動並開啟它的屬性。設定Grammars屬性為PINGrammar.grxml。設定NoRecognitionPrompt的值為Sorry, that is not a valid PIN。在執行期建立自訂文法你已經看過工作流程如何提示使用者要選取的工作清單,而在這個簡單的範例中,此清單會來自於包含在專案中的XML檔案。然而在真實環境的工作流程中,工作可以來自外部系統如SQL Server資料庫或Microsoft Outlook,這些工作流程無法馬上知道選項的數量,靜態的文法無法滿足這個需求。請在GetTasks活動上按兩下,並加入下列程式碼到GetTasks_ExecuteCode事件常式以建立文法以驗證來電者輸入的選項。[C#]// Clear out hardcoded expected Dtmf inputs this.ChooseTask.ExpectedDtmfInputs = null; // Create a dynamic grammar based on the number of tasks in the list var choices = new string[_tasks.Count]; choices = (from t in _tasks select t.Id.ToString()).ToArray(); var grammar = new SrgsDocument(); grammar.Mode = SrgsGrammarMode.Dtmf; var rule = new SrgsRule("Items"); var oneOf = new SrgsOneOf(choices); rule.Elements.Add(oneOf); grammar.Rules.Add(rule); grammar.Root = rule; // Clear out the grammars before adding a new one this.ChooseTask.Grammars.Clear(); this.ChooseTask.DtmfGrammars.Add(new Grammar(grammar)); 設定ChooseTask活動的ExceptedDtmfInputs屬性為null以清除活動中原本的設定。文法會動態的透過建立SrgsDocument物件的執行個體建立並加入規則到文法中。一個稱為Items的規則會指示來電者必須要選擇已建立的其中一個有效ID,並加入到文件的Rules集合中,以及設定根規則。新的文件將會加到ChooseTask活動的DtmfGrammars集合中。切換回Workflow Designer。選取ChooseTasks活動並開啟屬性視窗。設定NoRecognitionPrompt的值為Sorry, you did not select a valid task。測試自訂文法由功能表的Debug > Start Without Debugging或按CTRL+F5啟動應用程式。開啟Microsoft Lync。找到你的UCMA 3.0應用程式所顯露的聯絡人,例如LabContact10600@。提交語音呼叫到該聯絡人,此時會以來電者的名稱自動應答,並指示使用者輸入五位數的PIN碼。輸入一組無效的PIN碼如1234*,布PINGrammar.grxml中設定的文法會驗證由使用者輸入的PIN指示輸入無法接受,活動的NoRecognitionPrompt會在使用者輸入無效資料時播放。注意:Microsoft Lync的數值鍵盤允許來電者使用數字鍵上的字母輸入數值,為了要輸入無效值,請在PIN碼的最後一位輸入”*”。輸入一個有效的PIN碼(例如12345),自動應答程式會取得來電者可用的有效清單並提示來電者選擇。輸入一個無效的工作代碼(例如5),在執行期所建立的文法會驗證使用者的輸入並提示使用者輸入有效的選項。掛斷電話。切換到主控台應用程式並按ENTER,應用程式的終端點會關閉並終止協同平台。練習3:提示,指令與通訊事件情境:在本練習中,你將會使用提示,指令與通訊事件來強化使用者呼叫進工作流程應用程式時的體驗。工作項目細部流程在TS-Sean電腦中完成下列程序提示(Prompt)注意:在本工作中,你將會探索你可以使用在SpeechStatement與SpeechQuestionAnswer工作流程活動中可使用的不同提示功能,你也會學到更多精準與自然的聲音提示。切換到Workflow1.xoml.cs程式碼後置檔。找到EnterPIN_TurnStarting事件處理常式。加入下列程式碼到EnterPIN_TurnStarting事件常式中,以設定EnterPIN活動的SilencePrompt。[C#]this.EnterPIN.Prompts.SilencePrompt.ClearContent(); this.EnterPIN.Prompts.SilencePrompt.AppendText(PROMPT_SILENCE); this.EnterPIN.Prompts.SilencePrompt.AppendText("Please enter your five-digit, numeric PIN"); 注意:SpeechActivity與SpeechQuestionAnswerActivity活動支援一系列的指示集合以用來增進呼叫使用者的體驗,舉例來說,SilencePrompt是當使用者保持靜默時的提示。你可以在EnterPIN活動TurnStarting事件常式中建構SilencePrompt屬性,SilencePrompt也能夠在Workflow Designer中設定,然而在TurnStarting事件常式中設定可以讓你有更多彈性以設定更多的可用指示。注意,我們可以從TurnStarting事件常式可能要被執行數次時的首次將SilencePrompt的值清空。加入下列程式碼到EnterPIN_TurnStarting事件常式的最後以設定EnterPIN活動的NoRecognitionPrompt屬性值,NoRecognitionPrompt會在使用者輸入無法接受時播放。[C#]this.EnterPIN.Prompts.NoRecognitionPrompt.ClearContent(); var noRecPrompt = new PromptBuilder(); noRecPrompt.AppendText(PROMPT_NORECOGNITION); noRecPrompt.AppendBreak(PromptBreak.Medium); noRecPrompt.AppendText("Please enter your five-digit, numeric PIN"); this.EnterPIN.Prompts.NoRecognitionPrompt.AppendPromptBuilder(noRecPrompt); 注意:另外一個動態建構指示的方法是使用PromptBuilder物件,動態加入文字,語音與中斷到PromptBuilder以建立指示,呼叫NoRecognitionPrompt中的AppendPromptBuilder以加入PromptBuilder的執行個體到指示中。找到ChooseTask_TurnStarting事件常式。加入下列程式碼到ChooseTask_TurnStarting事件常式中以設定ChooseTask活動的SilencePrompt與NoRecognitionPrompt屬性。[C#]this.ChooseTask.Prompts.SilencePrompt.ClearContent(); this.ChooseTask.Prompts.SilencePrompt.AppendText(PROMPT_SILENCE); this.ChooseTask.Prompts.NoRecognitionPrompt.ClearContent(); var noRecPrompt = new PromptBuilder(); noRecPrompt.AppendText(PROMPT_NORECOGNITION); noRecPrompt.AppendBreak(PromptBreak.Medium); noRecPrompt.AppendText("Choose one of the tasks by entering its number."); this.ChooseTask.Prompts.NoRecognitionPrompt.AppendPromptBuilder(noRecPrompt); 指令(Command)注意:在本工作中,你將會加入Help指令到工作流程以允許使用者按0以取得說明。切換到Workflow Designer。在communicationsSequenceActibity1活動下方選取下拉選單,並選擇View Commands,一個CommandActivity儲存了所有可用於通訊順序的指令。由工具箱中拖拉SpeechHelpCommand至CommandsActivity中。選取SpeechHelpCommand並開啟它的屬性視窗。選擇ExpectedDtmfInputs屬性並按下”...”按鈕以編輯數值。輸入0並按OK,定義預期的輸入值以在使用者於線上時,觸發在SpeechQuestionAnswer活動中的說明指令,而此活動的HelpPrompt會被執行。選取communicationsSequenceActivity1活動內的下拉選單並選擇View CommunicationsSequqnceActivity。選取EnterPIN活動並開啟它的屬性視窗。展開EnterPIN活動的Prompts集合。在HelpPrompt內輸入下列指令:Please enter your five-digit PIN so that the system can validate your identity,當工作流程指示來電者輸入PIN值時,來電者可按下0,來電者會在按0時聽到在EnterPIN活動中所輸入的HelpPrompt值。重覆上一個步驟,於ChooseTask活動的HelpPrompt屬性輸入下列指令:Please choose a task, the system will look up the availability of the person that the task is assigned to。通訊事件(Communication Events)注意:在本工作中,你將會加入通訊事件以收集來電者連續輸入無效值的次數。選取communicationsSequenceActivity1活動內的下拉選單並選擇View CommunicationEvents。注意:CommunicationEvents活動包含了定義於通訊序列中的事件清單,每個事件都會對應到個別的動序列並且在事件引發時執行。預設情況下,CallDisconnected事件通訊事件會在每次通訊序列中建立,當呼叫在通訊序列之中斷線時,這個事件會被引發,同時序列會被執行,CallDisconnected事件包含了一個程式碼活動,但預設是無程式碼,保留給應用程式實作特定邏輯。將ConsecutiveNoRecognitionSpeechEvent活動拖到CommunicationEvents活動中,ConsecutiveNoRecognitionSpeechEvent活動會在來電者連續輸入數次無法符合預期的值時觸發。開啟ConsecutiveNoRecognitionSpeechEvent活動的屬性視窗,MaximumNoRecognitions的屬性值預設為3。設定MaximumNoRecognitions屬性的值為2。拖拉SpeechStatement活動到ConsecutiveNoRecognitionSpeechEvent活動內。設定活動的MainPrompt屬性值為Sorry, I did not understand your response or you did not enter one. Please try again later,當來電者輸入無效的值到SpeechQuestionAnswer活動的回應連續兩次時,工作流程將會執行此指示。拖拉GoTo動到ConsecutiveNoRecognitionSpeechEvent活動中,並且將它置於SpeechStatement活動中。開啟GoTo活動的屬性。選取TargetActivityName並按下”...”按鈕以編輯屬性,將它與disconnectCallActivity1活動連接,來電者將會在ConsecutiveNoRecognitionSpeechEvent觸發時即斷線。注意:當在等待使用者輸入產生問題時,有三個連續的通訊事件,ConsecutiveSilencesSpeechEvent會在沒有任何回應時觸發;ConsecutiveNoRecognitionsSpeechEvent則是在使用者輸入值無符合文法設定時觸發(直到設定的連續次數上限);最後是ConsecutiveNoInputsSpeechEvent會視設定的最大值,在silence與no recognization事件間觸發。測試指示,指令與通訊事件。由功能表的Debug > Start Without Debugging或按CTRL+F5啟動應用程式。開啟Microsoft Lync。找到你的UCMA 3.0應用程式所顯露的聯絡人,例如LabContact10600@。提交語音呼叫到該聯絡人,此時會以來電者的名稱自動應答,並指示使用者輸入五位數的PIN碼。在指示時先不要輸入PIN值,然後再輸入有效的PIN值如12345,自動應答程式會取得來電者可用的有效清單並提示來電者選擇。輸入0,這會觸發工作流程中的SpeechHelpCommand活動。來電者會聽到EnterPIN活動中的HelpPrompt指示。輸入一個無效的工作項目代碼(如4),來電者會聽到來自ChooseTask活動的NoRecognitionPrompt指示。輸入一個無效的工作項目代碼(如5),ConsecutiveNoRecognitionSpeechEvent活動序列會被觸發。來電者的連線會終止。切換到主控台應用程式並按ENTER,應用程式的終端點會關閉並終止協同平台。 ................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download