In this post, I will show you how easily you can make your first TTS application with C#. This example will use the COM interop to call SAPI functionality because SAPI has implemented a number of automation objects that can be directly used in C# or any other .Net languages.
Suppose you have Windows Vista (or Windows 7 Beta ) and Vistual Studio installed. Here is a step by step guide:
1. Create the solution by clicking the menu: File -> New -> Project, select the "Visual C#" -> "Windows" -> "Console Application",
choose a project name "SAPIInterop" . A basic C# project will be created automatically
2. Add the referrence to SAPI.dll by clicking "Project" -> "Add Referrence" -> "COM". In the list, find and select the "Microsoft Speech Object Library". A "SpeechLib" referrence will appear in the project referrences list.
3. Now we can add some piece of code to make the first "hello world" TTS application.
using System;using System.Collections.Generic;using System.Linq;using System.Text;using SpeechLib;using System.Diagnostics; namespace SAPIInterop{ class Program { static void Speak(int voiceIdx) { SpVoice spVoice = new SpVoice(); ISpeechObjectTokens tokens = spVoice.GetVoices(null, null); if (voiceIdx < 0 || voiceIdx >= tokens.Count) { Console.WriteLine("voice index out of range from [0-{0}]", tokens.Count); return; } spVoice.Voice = tokens.Item(voiceIdx); spVoice.Rate = 0; spVoice.Speak("Hello world", SpeechVoiceSpeakFlags.SVSFDefault); } static void ListVoice() { SpObjectTokenCategory tokenCat = new SpObjectTokenCategory(); tokenCat.SetId(SpeechLib.SpeechStringConstants.SpeechCategoryVoices, false); ISpeechObjectTokens tokens = tokenCat.EnumerateTokens(null, null); foreach (SpObjectToken item in tokens) { Console.WriteLine(item.GetDescription(0)); } } static void Main(string[] args) { // list voices installed on the system ListVoice(); // speak with the second voices. If you have only one voice, change it to Speak(0) Speak(1); } }}
using System;using System.Collections.Generic;using System.Linq;using System.Text;using SpeechLib;using System.Diagnostics;
namespace SAPIInterop{ class Program { static void Speak(int voiceIdx) { SpVoice spVoice = new SpVoice(); ISpeechObjectTokens tokens = spVoice.GetVoices(null, null); if (voiceIdx < 0 || voiceIdx >= tokens.Count) { Console.WriteLine("voice index out of range from [0-{0}]", tokens.Count); return; }
spVoice.Voice = tokens.Item(voiceIdx); spVoice.Rate = 0; spVoice.Speak("Hello world", SpeechVoiceSpeakFlags.SVSFDefault); }
static void ListVoice() { SpObjectTokenCategory tokenCat = new SpObjectTokenCategory(); tokenCat.SetId(SpeechLib.SpeechStringConstants.SpeechCategoryVoices, false); ISpeechObjectTokens tokens = tokenCat.EnumerateTokens(null, null); foreach (SpObjectToken item in tokens) { Console.WriteLine(item.GetDescription(0)); } }
static void Main(string[] args) { // list voices installed on the system ListVoice(); // speak with the second voices. If you have only one voice, change it to Speak(0) Speak(1); } }}