I just stumbled upon a great presentation from Scott Hansleman on how to be more productive. I really recognized myself in the behavior that he points out. It’s sure time well spent to check it out. I have new things to try on Monday morning for sure!
How to be more productive
Filed in Uncategorized Leave a comment
Windows Phone text to speech
Filed in C# | Windows Phone Leave a comment
In Windows Phone there are great features to communicate with an app using voice. In previous post I have described how to command your app using your voice. In this post I will cover on how the app can respond using text to speech. The feature text to speech can be used in various scenarios to give the user feedback and is definitely a great tool to optimize your apps accessibility. The entire source code can be downloaded at the end of the post.
Windows Phone have support for 15 languages (sadly, not Swedish) and each language comes with two voices, one male and one female. The phone has one voice set as default. This can be viewed and changed in the phone settings. The default voice is the one to be used if not the app say otherwise.
- windows phone settings
First of all we create a simple UI with three buttons supporting our three scenarios. Add event handlers to the buttons.
Now we need to add speech recognition capability to the app. If not, we will get a security error when we try to speak any text. Open the app manifest and add the capability as shown in the picture below.
Now we will dig into the code and start with scenario number 1. The crazy thing here is that only two lines of code are needed to speech text with the default voice. First of all we create a new method and in that we create a SpeechSynthesizer object that will be used to speak the text we will provide for it. Then we will use the method SpeakTextAsync on the synthesizer-object and send in the text. Note that this method is async so we need to decorate our method with the async keyword.
private async void GreetInEnglish()
{
//Fist create the synth that will be playing the sound
SpeechSynthesizer synth = new SpeechSynthesizer();
//await the synth while it speaks the text of your choice. This will use the default voice.
await synth.SpeakTextAsync("Hello man! How are you today? Well i'm just fine myself!");
}
Run the app and hear it greet you!
Now for scenario no 2 we will start out as in scenario 1 with a new method. Now we will tell the phone to use a female French voice. This is easily done by querying the InstalledVoices.All for a voice that is of culture “fr-FR” and female. Then we will tell the SpeechSynthesizer-object to use that voice. I have used Google-translate to translate the text from the previous sample to French. This will make the speech sound more natural J
private async void GreetInFrench()
{
//Create the synth that will be playing the sound
SpeechSynthesizer synth = new SpeechSynthesizer();
//Find the voice of your choice. In this case french woman
var voice = (from x in InstalledVoices.All
where x.Language == "fr-FR" &&
x.Gender == VoiceGender.Female
select x).FirstOrDefault();
//Tell the synth to use the selected voice
synth.SetVoice(voice);
//await the synth while it speaks the text of your choice with the selected voice
await synth.SpeakTextAsync("Bonjour homme! Comment allez-vous aujourd'hui? Eh bien, je suis juste moi-même très bien!");
}
For our final scenario we will create a method that will loop through all the installed voices and let them say “Hello World”. Just as in the previous example we will use the installed voices, but this time we will loop over them and let each and one of them speak the text.
private async void LoopAllVoices()
{
//Create the synth that will be playing the sound
SpeechSynthesizer synth = new SpeechSynthesizer();
//Loop all the installed voices
foreach (var voice in InstalledVoices.All)
{
//Tell the synth to use the selected voice
synth.SetVoice(voice);
//await the synth while it speaks the text with the current voice
await synth.SpeakTextAsync("Hello world!");
}
}
Download the source code and have fun!
Send speech commands to your Windows Phone 8 app
Filed in C# | Windows Phone 4 Comments
In Windows Phone 7.x users can already interact with their phone using the voice. This is done by pressing and holding the Windows key and giving the phone a voice command e.g. “Start [appname]” or “Open [appname]“. In Windows Phone 8 you can extend this and add additional phrases that a user can say which opens up new opportunities allows users to launch to a specific page in an app and launch an app and initiate an action. This post will cover how easy you can implement voice commands in your app. Source code is provided at the end.
Note; this post covers start up commands. Speech recognition within the app will be covered in a later post.
So, we start of with a new Windows Phone 8 project.
The first step is to open the WMAppManifest.xml-file located in the Properties-folder. Switch to the Capabilities-tab. Here we will give the app the necessary capabilities to be able to handle the voice commands. Check the ID_CAP_SPEECH_RECOGNITION-capability.

For our demo purpose, before we start with the commands, we add another page to the solution so we have something to navigate to. We can call the page Target.xaml.
Now we are going to add a new item to our project. Select Add->New Item in the context menu for the project and select Voice Command Definition. Lets name it VCDFile.

The VCD-file will give you an example of how to setup your commands. So lets digg into the file and make it our own. Let’s start at the top with the Command Prefix and Example. The value in the prefix tag is what the app will look for as a prefix to the command. So the user will say “SpeechDemo” followed by the commands. The value in the example tag will be displayed by the help for this app as an example of the commands the app supports.
SpeechDemo navigate to target
Next we are going to add a command that the app will act upon.
First we will give our command a name. In this case “Navigate”.
Then we will provide an example for this command. “navigate to target”. This will be displayed to the user by the phone as help.
Then we will specify what the phone will actually listen for. “[and] navigating to target”. The square brackets indicates that the word is optional. The reason why we use it this way is because it can give the user a more natural way of speaking. To explain this we will first take a look at two different ways of starting the app;
“SpeechDemo navigate to target” –> Here the “and” would sound weird.
“Start SpeechDemo and navigate to target” –> Without the “and” the user would feel that the command sounded weird.
Then we will provide feedback. This is what the phone will read back to the user and write on the screen.
Navigate is where you can, if you want, specify where the app should navigate when it receives the command. Here we insert our previously added page, “Target”. If you don’t specify a target you will land on your main page where you parse the incomming command and take action in code.
The whole thing wraps up like;
navigate to target [and] navigate to target Navigating to target page...
If you like, you can also specify options to a command with a “PhraseList”. The phrase list can be extended over time and is can be used for e.g. level selction in a game. To use a phrase list you insert the name of the phrase list in curly brackets. Here is an example we will use later on;
show message one [and] show message {number} Showing message one two three
We are now finished with the VCD-file. Now we need to install the VCD file. The file needs to be installed the first time the app runs. Before the install, no commands will work with the app, since the commands are registered with the speech system on the user’s phone. In this demo we will install the file when the app starts. Go to the code behind for MainPage.xaml and add the following lines;
public MainPage()
{
InitializeComponent();
SetupVoice();
}
public async void SetupVoice()
{
await VoiceCommandService.InstallCommandSetsFromFileAsync(new Uri("ms-appx:///VCDFile.xml", UriKind.RelativeOrAbsolute));
}
This will install the file. Note that the VCD-file can loaded from any URI and not only from the app and that it can be changed by the app when it is running.
Now we can start the app for the for the first time and then begin sending voice commands.
Start the app and then press and hold the Windows key and say; “SpeechDemo navigate to target”. The app will give feedback and then navigate to the target page in the app.


If you wish to inspect the translated query-string for the command this can be done in the “OnNavigatedTo”-method. This is useful when you need to see what phrase that was used or if you wish to have all the commands on one page without navigating away. We are gonna use our command “ShowMessage” from before to show how this can be done. Insert the following code in the MainPage.xaml and try the saying “SpeechDemo show message one”.
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (e.NavigationMode == System.Windows.Navigation.NavigationMode.New)
{
if (NavigationContext.QueryString.ContainsKey("voiceCommandName")) //voice command in querystring
{
var command = NavigationContext.QueryString["voiceCommandName"]; //voice command in querystring
switch (command)
{
case "ShowMessage": //The name of the VCD-command
var phrase = NavigationContext.QueryString["number"]; //get the phrase
DemoText.Text = string.Format("ShowMessage command {0} activated", phrase);
break;
default:
DemoText.Text = "Couldn't find the command";
break;
}
}
}
}
Now you have everything you need to create cool apps with voice commands!
Download the source code and have fun! =)
Use Prism data template selector in Windows Phone app
Filed in C# | Windows Phone | XAML 1 Comment
Quite often you would like to have a Collection in your view model that supports multiple types that derives from the same base type. Along with the different subclasses, you might want different data templates in your view, one for each type. Microsoft Prism can help you do this in an easy way and automatically select correct template for each type. This post will show how to do it on Windows Phone and you can also download the source code for the demo project (Windows Phone 7.1 for compatability) at the bottom of the page.
First of all, use Nuget to install Prism Phone to your project.

Now, lets play with an example where we want to present a Schedule that contains meetings and trips. This gives us a solution that looks like this.

We edit our simple models so they look like this;
namespace PrismTemplateSelector.Models
{
public class ScheduleItem
{
public DateTime StartDate
{
get;
set;
}
public DateTime StopDate
{
get;
set;
}
}
}
namespace PrismTemplateSelector.Models
{
public class Meeting : ScheduleItem
{
public string MeetingOrganizer
{
get;
set;
}
}
}
namespace PrismTemplateSelector.Models
{
public class Trip : ScheduleItem
{
public string Destination
{
get;
set;
}
}
}
Now we will add some code to our view model to add some demo data for our view.
namespace PrismTemplateSelector.ViewModels
{
public class MainPageViewModel
{
public MainPageViewModel()
{
Items = new ObservableCollection();
LoadDemoData();
}
public ObservableCollection Items { get; set; }
private void LoadDemoData()
{
Items.Add(new Meeting()
{
StartDate = DateTime.Now.AddHours(1),
StopDate = DateTime.Now.AddHours(4),
MeetingOrganizer = "Todd Schmidt"
});
Items.Add(new Trip()
{
StartDate = DateTime.Now.AddDays(4),
StopDate = DateTime.Now.AddDays(14),
Destination = "New York"
});
Items.Add(new Meeting()
{
StartDate = DateTime.Now.AddDays(3),
StopDate = DateTime.Now.AddDays(3).AddHours(1),
MeetingOrganizer = "Gilian Pearson"
});
}
}
}
Now when that is all set up, lets look at the magic in our xaml. First of all we will add namespace for Prism into our xaml-view.
xmlns:prism="clr-namespace:Microsoft.Practices.Prism.ViewModel;assembly=Microsoft.Practices.Prism"
After this we will start to write our data template and add them to our resources on the page. Note that the DataTemplate x:key shall be the name of the type you wish to bind to the template.
So finally we will tie Everything together and apply the templateselector to our listbox.
Speaker at Sogeti seminar in Umeå
Filed in Windows 8 | Windows Phone Leave a comment
Last week i spoke about Windows 8 and Windows Phone 8 at a seminar hosted by Sogeti in Umeå. Great turnout, between 40-45 participators for my two sessions.
The event was covered by InfoTech and the whole article can be read in Swedish here





