Agenda
UCMA 3.0 Highlights Management PowerShell cmdlets to create and manage UCMA trusted applications and endpoints. Autoprovisioning Application settings replicated to trusted application pools. Very easy UCMA application startup code. Quality and Resiliency Guarantee quality of service using new server role. KPIs for health indicators. DNS load balancing. Conferencing Conference scheduling and management Conference join and lobby experience Back-to-back calls Trusted participant Audio Routes Full control of media routing between participant endpoints Enables advanced communications scenarios Supervisor monitor Supervisor whisper Supervisor barge-in Context Channel Communication channel between UCMA app and Silverlight extensibility app Launch with initial context Send and receive context data Can replace WCF-based communication mechanism
Speech in UCMA Upgraded to use Speech 11 More TTS voices 16KHz audio for most TTS voices VXML SDK will work with Speech 11
Setup Support for silent runtime installs Development.NET 4 Support for Async Task Framework
Support UCMA Workflow SDK will not ship in Lync 2013 Support existing applications in a co-existence environment UCMA Workflow SDK 3.0 application running Lync 2010 server Users honed on Lync 2013 server Users able to connect to legacy application Guidance Build using UCMA core Leverage VXML
try { _platform.BeginStartup(startupAsyncResult => { try { _platform.EndStartup(startupAsyncResult); Console.WriteLine("Started platform."); EstablishEndpoint(); } catch (RealTimeException ex) { throw(ex); } }, null); } catch (InvalidOperationException ex) { throw(ex); }
var platformSettings = new ProvisionedApplicationPlatformSettings(_applicationName, _applicationId); _platform = new CollaborationPlatform(platformSettings); await _platform.StartUpAsync(); Console.WriteLine("Platform started."); var endpointSettings = new ApplicationEndpointSettings(_applicationEndpointURI, _lyncServer, _lyncServerPort); _endpoint = new ApplicationEndpoint(_platform, endpointSettings); await _endpoint.EstablishAsync(); Console.WriteLine(“Application Endpoint established.");
Extension Methods Create Task that represents pair of BeginX and EndX methods Specify Begin operation Specify End operation Set parameters Set asynchronous state
using System.Threading.Tasks; … public static Task StartUpAsync(this CollaborationPlatform platform) { if (platform == null) { throw new ArgumentNullException(); } return Task.Factory.FromAsync(platform.BeginStartup, platform.EndStartup, null); } … await _platform.StartUpAsync();
public static Task EstablishAsync( this Call call, string destinationUri, CallEstablishOptions options) { if (call == null) { throw new ArgumentNullException(); } return Task.Factory.FromAsync( call.BeginEstablish, call.EndEstablish, destinationUri, options, null); }
try { await _platform.StartupAsync(); } catch (InvalidOperationException ex) { Console.WriteLine(ex;) } catch (RealTimeException ex) { Console.WriteLine(ex;) }
Scenarios Run Tasks in sequence Run Tasks in parallel WhenAll Tasks complete WhenAny Tasks complete
demo
Agenda
UCMA Workflow SDK Positives Easy to develop with Visual design surface Handles underlying plumbing Negatives Media is expensive Scalability Have to write straight UCMA code often
Handle incoming call Associate call with workflow instance Attach a speech synthesizer to the callAttach a tone controller to the callMove between activities
var synthConnector = new SpeechSynthesisConnector(); PhoneMenuCallController.SpeechSynthesizer = new SpeechSynthesizer(); var format = new SpeechAudioFormatInfo( 16000, AudioBitsPerSample.Sixteen, Microsoft.Speech.AudioFormat.AudioChannel.Mono); PhoneMenuCallController.SpeechSynthesizer.SetOutputToAudioStream(synthConnector.Stream, format); synthConnector.AttachFlow(PhoneMenuCallController.AVCall.Flow); synthConnector.Start(); … PhoneMenuCallController.SpeechSynthesizer.SpeakAsync( "Thank you for calling the phone menu sample app! " + "Press 1 to speak to an agent, or 2 to repeat this menu.");
PhoneMenuCallController.ToneController.ToneReceived += new EventHandler (ToneController_ToneReceived); … void ToneController_ToneReceived(object sender, ToneControllerEventArgs e) { PhoneMenuCallController.SpeechSynthesizer.SpeakAsyncCancelAll(); if (e.Tone == 1) { // do something }
demo
Agenda
thank you
Lync Server 2010 Infrastructure SIP Layer Media Stack Microsoft.SpeechMicrosoft.Speech UCMA 4.0 Core API UCMA Server Speech API VoiceXMLVoiceXML Unified Communications Web API