Introduction
This is an application to convert the user's Text or Text file of .txt format to audio file of .wav format. Here the application identifies the words and punctuation marks from the text file and breaks it accordingly with the letters and phonemes concerned. The user will get the audio output of whatever text he/she has written in the richtextbox or whatever text file he/she has introduced in the textbox concerned.
Background
I am trying to develop a Friend (an application) who will understand your words, remember it and will also talk as a friend. This Text to Speech Converter is another module of the Application, through which the application understands the user's words and reapplies them accordingly (Goal).
Using the Code
<code>
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using SpeechLib;
Here in the above code the most importance difference you will notice is the namespace SpeechLib
. This is the Dynamic Link Library of SAPI5.1, i.e. Speech Application programming Interphase5.1.
namespace WindowsApplication1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent(); }
SpFileStream spFileStream = new SpFileStream(); SpeechStreamFileMode spFileMode =
SpeechStreamFileMode.SSFMCreateForWrite; SpObjectTokenClass my_SpObjToken = new SpObjectTokenClass(); SpeechVoiceSpeakFlags my_Spflag =
SpeechVoiceSpeakFlags.SVSFlagsAsync; SpVoice my_Voice = new SpVoice(); int sp_Rate=0,sp_Volume=70;
private void Form1_Load(object sender, EventArgs e)
{
TextArea_User.Hide();
FilePath_Lbl.Hide();
FileBrowse_TxtBox.Hide();
Browse_Btn.Hide();
}
Here in the above code, I am defining a few objects as "spFileStream" of class SpFileStream
,"spFilemode" of Class SpeechStreamFileMode
,"my_SpObjToken" of SpObjectTokenClass
,"my_Voice" of SpVoice Class
. I will discuss every object in later sections. A few integral variables are there, they are sp_Rate
initialized by "0"
and sp_Volume
initialized by "70"
. These sp_Rate
and sp_Volume
will pass their values to different sections.
In Form1_Load
event, i am hiding a few objects which will be used as per need below.
private void Speak_Btn_Click(object sender, EventArgs e)
{
if (TxtArea_Chk.Checked == true)
{
my_Voice.Speak(TextArea_User.Text, my_Spflag);
my_Voice.Volume = sp_Volume;
my_Voice.Rate = sp_Rate;
}
else if (TxtFilePath_Chk.Checked == true)
{
my_Voice.Speak(my_fDlg.FileName,
SpeechVoiceSpeakFlags.SVSFIsFilename); my_Voice.Volume = sp_Volume;
my_Voice.Rate = sp_Rate;
}
}
Here in Speak_Btn_Click
event, I am checking whether the TxtArea_Chk
(checkBox
) is clicked or not, if it is clicked then the text of the text of TextArea_User
(richTextBox
) will be passed to the Speak
method of SpVoice
class through concerned object my_Voice
with the my_Spflag
variable which is defined as "SVSFlagsAsync
" (i.e. to speak asynchronously). If user had selected the TxtFilePath_Chk
(checkBox
), then the text file from openDialogBox
gets passed to Speak
method of SpVoice
class through concerned object "my_Voice
", with second argument as "SVSFIsFilename
" of enum SpeechVoiceSpeakFlags
. Here in both cases, the Volume and Rate of SpVoice
class is initialised with the variable "sp_Volume
" and "sp_Rate
" through the same object as my_Voice
.
private void DecRate_Btn_Click(object sender, EventArgs e)
{
if (sp_Rate > 0)
sp_Rate--;
else
MessageBox.Show("It is minimum Level.");
}
Here in DecRate_Btn_Click
event, sp_Rate
gets decremented by one if value is greater than 0
or it will show the message of minimum Limit.
private void IncRate_Btn_Click(object sender, EventArgs e)
{
if (sp_Rate <= 20)
sp_Rate++;
else
MessageBox.Show("It is maximum Level.");
}
Here in IncRate_Btn_Click
event, sp_Rate
gets incremented by one if value is less than 21
or it will show the message of maximum Limit.
private void DecVolume_Btn_Click(object sender, EventArgs e)
{
if (sp_Volume > 60)
sp_Volume-=2;
else
MessageBox.Show("It is minimum Limit");
}
Here in DecVolume_Btn_Click
event, sp_Volume
gets decremented by two if value is greater than 60 or it will show the message of minimum Limit.
private void IncVolume_Btn_Click(object sender, EventArgs e)
{
if (sp_Volume <= 100)
sp_Volume+=2;
else
MessageBox.Show("It is Maximum Limit.");
}
Here in IncVolume_Btn_Click
event, sp_Volume
gets incremented by two if value is less than 100
or it will show the message of maximum Limit.
private void Exit_Btn_Click(object sender, EventArgs e)
{
this.Dispose();
}
Here in Exit_Btn_Click
event, the application gets disposed.
private void SaveFile_Btn_Click(object sender, EventArgs e)
{
SaveFileDialog my_Sfd = new SaveFileDialog();
my_Sfd.Filter = "All files (*.*)|*.*|wav files (*.wav)|*.wav";
my_Sfd.Title = "Save to a wav file.";
my_Sfd.FilterIndex = 2;
my_Sfd.RestoreDirectory = true;
if ((my_Sfd.ShowDialog() == DialogResult.OK)&&(TxtArea_Chk.Checked == true))
{
spFileStream.Open(my_Sfd.FileName, spFileMode, false);
my_Voice.AudioOutputStream = spFileStream;
my_Voice.Speak(TextArea_User.Text, my_Spflag);
my_Voice.WaitUntilDone(-1);
spFileStream.Close();
}
else if((my_Sfd.ShowDialog() ==
DialogResult.OK)&&(TxtFilePath_Chk.Checked == true))
{
spFileStream.Open(my_Sfd.FileName, spFileMode, false);
my_Voice.AudioOutputStream = spFileStream;
my_Voice.Speak(my_fDlg.FileName, SpeechVoiceSpeakFlags.SVSFIsFilename);
my_Voice.WaitUntilDone(-1);
spFileStream.Close();
}
}
Here in SaveFile_Btn_Click
event, I had opened the saveDialogBox
where the filter is ".wav"
and after checking the checked mode of TxtArea_Chk
or TxtFilePath_Chk
, we are converting the text into audio file and saves it as per user's preferred name and location.
private void TxtArea_Chk_CheckedChanged(object sender, EventArgs e)
{
TxtFilePath_Chk.Enabled = false;
UserChoice_GrpBox.Text = "User Text Area";
TextArea_User.Show();
FilePath_Lbl.Hide();
FileBrowse_TxtBox.Hide();
Browse_Btn.Hide();
}
Here in TxtArea_Chk
of checked changed event, I am disabling the TxtFilePath_Chk
, and changing text of GroupBox
with calling show method for TextArea_User
and Hide
method for FilePath_Lbl
, FileBrowse_TxtBox
and Browse_Btn
.
private void TxtFilePath_Chk_CheckedChanged(object sender, EventArgs e)
{
TxtArea_Chk.Enabled = false;
UserChoice_GrpBox.Text = "User Text File";
TextArea_User.Hide();
FilePath_Lbl.Show();
FileBrowse_TxtBox.Show();
Browse_Btn.Show();
}
Here in TxtFilePath_Chk
of checked changed event, I am disabling the TxtArea_Chk
, and changing text of GroupBox
with calling hide method for TextArea_User
and show method for FilePath_Lbl
, FileBrowse_TxtBox
and Browse_Btn
.
int igCounter = 0;
private void Refresh_Btn_Click(object sender, EventArgs e)
{
UserChoice_GrpBox.Text = "User Choice Area";
TxtArea_Chk.Enabled = true;
TxtFilePath_Chk.Enabled = true;
TxtArea_Chk.Checked = false;
TxtFilePath_Chk.Checked = false;
TextArea_User.Hide();
FilePath_Lbl.Hide();
FileBrowse_TxtBox.Hide();
Browse_Btn.Hide();
if (igCounter == 0)
{
MessageBox.Show("Single Click twice to Complete refresh.");
igCounter++;
}
}
Here in Refresh_Btn Click
event, what I am doing is just defining the boolean true
value to both checkbox
's enabled and hiding all the other members of the groupBox
.
OpenFileDialog my_fDlg = new OpenFileDialog();
String user_WaveFile;
private void Browse_Btn_Click(object sender, EventArgs e)
{
my_fDlg.Title = "Browse your .wav file.";
my_fDlg.Filter = "Wav Files (*.txt)|*.txt";
my_fDlg.RestoreDirectory = true;
if (my_fDlg.ShowDialog() == DialogResult.OK)
{
user_WaveFile = @my_fDlg.FileName;
FileBrowse_TxtBox.Text = @my_fDlg.FileName;
}
}
Here in Browse_Btn
Click event, I had opened an openDialogBox
having filter ".txt" and initialize the text of the textBox
with the user preferable filename.
What Does the Code Do?
This code belongs to the main form as "Form1.cs", here in User Choice group section the user will have two selection checkboxes - one for richTextbox
and another to browse the text file from the system. Through these checkboxes, the user can choose the required way to convert his text to speech/audio file or user can browse his/her text file to Convert into the audio file. When user Clicks the "speak" button, then text from the richtextbox or the text from the .txt file passes to the speak
method of spVoice
class contained in the Speechlib.dll file. As through the SaveFile
button, the procedure is the same as the speak method converts the text into audio format of .wav and a saveDialogbox
opens for the preferred location to save. User can also set the volume and speaking rate as from the "Inc" and "Dec" button. Here the volume and rate is an integral variable which initializes the volume and rate of the Volume and Rate of the SpVoice
class of Speechlib.dll file.
How Do I Use It?
Mark the checkbox
that user needs. If user is going through the richtextbox
, then the user has to write the text there in richtextbox
and click the speak button or if user had marked the TextFilePath
checkbox, then he/she will have to browse the textfile
through browser button and then click the speak button. To save the audio file, the user will get a saveDialogbox
through saveFile
button and he/she can save the audio file generated at any location with a new name.
Why Would Someone Want to Use your Version?
It is possible to get any similar application, but its uniqueness is about the integrated pattern of converting text from richtextbox
or even through textfile
into audio file.
Environment of the Code to be Restricted?
This code is written in C#2.0 with Visual Studio 2005 and .NET 3.0 Framework.
Points of Interest
Getting the audio file from the user's simple text or his/her simple text file is most important in this application. The core concept that I am using here is (SAPI5.1) speak method of Spvoice
class.
History
- 18th June, 2009: Initial post