Introduction
The demo below explains how to convert text to speech using C# in Visual Studio 2010 using System.Speech
Library.
Microsoft .NET framework provides System.Speech.Synthesis
for voice synthesis.
System.Speech
Library.System.Speech.Synthesis
for voice synthesis.
Building the Sample
You must have Visual Studio 2010 to build and run the sample.
Description
To convert text to speech which is called voice synthesis, you must include "System.Speech
" reference in your project. It contains functions for both speech synthesis and recognition.
After adding System.speech
reference, you have to use System.Speech.Synthesis
in your project which contains various functions for voice synthesis.
System.Speech
" reference in your project. It contains functions for both speech synthesis and recognition.System.speech
reference, you have to use System.Speech.Synthesis
in your project which contains various functions for voice synthesis.
Creating Object of SpeechSynthesizer Class
The first step is to create an object of SpeechSynthesizer
class (e.g. "reader
" in my sample).
SpeechSynthesizer reader = new SpeechSynthesizer();
SpeechSynthesizer
class (e.g. "reader
" in my sample).
Calling Speak() Function
The next step is to call the "Speak()
" function by passing the text to spoken as string
.
reader.Speak("This is my first speech project");
The problem with the speak()
function is that it is not threaded. It means that you cannot perform any other function in your Windows Form until the "reader
" object has completed the speech.
So it is better to use "SpeakAsync()
" function. I have also used SpeakAsync()
in the sample.
reader.SpeakAsync("Speaking text asynchronously");
Speak()
" function by passing the text to spoken as string
.speak()
function is that it is not threaded. It means that you cannot perform any other function in your Windows Form until the "reader
" object has completed the speech.SpeakAsync()
" function. I have also used SpeakAsync()
in the sample.
Using Pause() and Resume() functions
You can also detect the state of the "reader
" object by using "SynthesizerState
" property. And using that, you can also "Pause
" or "Resume
" the narration.
if (reader.State == SynthesizerState.Speaking)
{
reader.Pause();
}
if (reader.State == SynthesizerState.Paused)
{
reader.Resume();
}
reader
" object by using "SynthesizerState
" property. And using that, you can also "Pause
" or "Resume
" the narration.
Using Dispose() function
You can use Dispose()
function to stop narration and dispose the "reader
" object.
if( reader!= null )
{
reader.Dispose();
}
These are some of the basic operations. You can also change voice, volume, rate and other parameters. You can also save the spoken audio stream directly into a "wave" file.
The sample also shows some other features such as using event handlers to detect speech progress and display status of synthesizer.
Below is the complete code for speech synthesis.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Speech.Synthesis;
using System.IO;
namespace text_to_speech
{
public partial class Form1 : Form
{
SpeechSynthesizer reader; //declare the object
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
reader = new SpeechSynthesizer(); //create new object
button2.Enabled = false;
button3.Enabled = false;
button4.Enabled = false;
textBox1.ScrollBars = ScrollBars.Both;
}
//SPEAK TEXT
private void button1_Click(object sender, EventArgs e)
{
reader.Dispose();
if (textBox1.Text != "") //if text area is not empty
{
reader = new SpeechSynthesizer();
reader.SpeakAsync(textBox1.Text);
label2.Text = "SPEAKING";
button2.Enabled = true;
button4.Enabled = true;
reader.SpeakCompleted += new EventHandler<speakcompletedeventargs />(reader_SpeakCompleted);
}
else
{
MessageBox.Show("Please enter some text in the textbox",
"Message", MessageBoxButtons.OK);
}
}
//event handler
void reader_SpeakCompleted(object sender, SpeakCompletedEventArgs e)
{
label2.Text = "IDLE";
}
//PAUSE
private void button2_Click(object sender, EventArgs e)
{
if (reader != null)
{
if (reader.State == SynthesizerState.Speaking)
{
reader.Pause();
label2.Text = "PAUSED";
button3.Enabled = true;
}
}
}
//RESUME
private void button3_Click(object sender, EventArgs e)
{
if (reader != null)
{
if (reader.State == SynthesizerState.Paused)
{
reader.Resume();
label2.Text = "SPEAKING";
}
button3.Enabled = false;
}
}
//STOP
private void button4_Click(object sender, EventArgs e)
{
if (reader != null)
{
reader.Dispose();
label2.Text = "IDLE";
button2.Enabled = false;
button3.Enabled = false;
button4.Enabled = false;
}
}
//load data from text file button
private void button5_Click(object sender, EventArgs e)
{
openFileDialog1.ShowDialog();
}
private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
{
//copy data from text file and load it to textbox
textBox1.Text = File.ReadAllText(openFileDialog1.FileName.ToString());
}
}
}
Dispose()
function to stop narration and dispose the "reader
" object.
Adding SYSTEM.SPEECH Reference