应表哥要求,写一个简单的TTS软件,他们单位上用于广播通知用。源码如下:
简单说明:
publicpartialclassfrmMain:Form
{
publicfrmMain()
{
InitializeComponent();
comboBox1.DropDownStyle=ComboBoxStyle.DropDownList;
}
SpVoiceUtilSpVoiceUtil=newSpVoiceUtil();
privatevoidfrmMain_Load(objectsender,EventArgse)
{
Control.CheckForIllegalCrossThreadCalls=false;
Listlist=SpVoiceUtil.getDescription();
foreach(variteminlist)
{
comboBox1.Items.Add(item);
}
if(comboBox1.Items.Count>0)
{
comboBox1.SelectedIndex=0;
}
}
privatevoidcomboBox1_SelectedIndexChanged(objectsender,EventArgse)
{
SpVoiceUtil.setDescription(this.Text);
}
//暂停
privatevoidbutton2_Click(objectsender,EventArgse)
{
SpVoiceUtil.Pause();
}
//继续
privatevoidbutton5_Click(objectsender,EventArgse)
{
SpVoiceUtil.Resume();
}
//停止
privatevoidbutton3_Click(objectsender,EventArgse)
{
SpVoiceUtil.Stop();
}
//设置语速
privatevoidtrackBar1_Scroll(objectsender,EventArgse)
{
lab_Rate.Text=trackBar1.Value.ToString();
SpVoiceUtil.setRate(trackBar1.Value);
}
//设置音量
privatevoidtrackBar2_Scroll(objectsender,EventArgse)
{
lab_Volume.Text=trackBar2.Value.ToString();
SpVoiceUtil.setVolume(trackBar2.Value);
}
//开始朗读
privatevoidbutton1_Click(objectsender,EventArgse)
{
SpVoiceUtil.Speak(txt_str.Text,CallBack);
}
//写出WAV
privatevoidbutton4_Click(objectsender,EventArgse)
{
boolisTrue=false;
SaveFileDialogdialog=newSaveFileDialog();
dialog.Filter="Allfiles(*.*)|*.*|wavfiles(*.wav)|*.wav";
dialog.Title="保存WAV文件";
dialog.FilterIndex=2;
dialog.RestoreDirectory=true;
if(dialog.ShowDialog()==DialogResult.OK)
{
isTrue=SpVoiceUtil.WreiteToWAV(dialog.FileName,txt_str.Text,DotNetSpeech.SpeechAudioFormatType.SAFT11kHz16BitMono);
}
if(isTrue)
{
MessageBox.Show("输出成功");
}
else{
MessageBox.Show("输出失败");
}
}
//回调信息
privatevoidCallBack(boolb,intInputWordPosition,intInputWordLength)
{
textBox1.AppendText("是否读完:"+b.ToString()+"\r\n");
textBox1.AppendText("朗读长度:"+InputWordPosition.ToString()+"\r\n");
textBox1.AppendText("朗读位置:"+InputWordLength.ToString()+"\r\n");
}
}
namespaceSpVoiceDemo
{
classSpVoiceUtil
{
SpVoicevoice=newDotNetSpeech.SpVoiceClass();
publicdelegatevoidCallBack(boolb,intInputWordPosition,intInputWordLength);
///
///朗读文本
///
///要朗读的文本
///回调地址
///返回bool
publicboolSpeak(stringstr,CallBackCallBack)
{
intn=voice.Speak(str,SpeechVoiceSpeakFlags.SVSFlagsAsync);
Threadthread=newThread(newParameterizedThreadStart(Call));
thread.IsBackground=true;
thread.Start((Object)CallBack);
return!(n!=1);
}
///
///回调函数线程子程序
///
///
privatevoidCall(ObjectcallBack)
{
intInputWordLength=0;//局部_朗读长度
intInputWordPosition=0;//局部_朗读位置
CallBackCallBack=(CallBack)callBack;
while((int)voice.Status.RunningState!=1)
{
if(InputWordPosition!=voice.Status.InputWordPosition||InputWordLength!=voice.Status.InputWordLength)
{
InputWordPosition=voice.Status.InputWordPosition;
InputWordLength=voice.Status.InputWordLength;
//回调
CallBack(false,InputWordPosition,InputWordLength);
}
}
CallBack(true,InputWordPosition,InputWordLength);
}
///
///获取语音库
///
///List
publicListgetDescription()
{
Listlist=newList();
DotNetSpeech.ISpeechObjectTokensobj=voice.GetVoices();
intcount=obj.Count;//获取语音库总数
for(inti=0;i
{
stringdesc=obj.Item(i).GetDescription();//遍历语音库
list.Add(desc);
}
returnlist;
}
///
///设置当前使用语音库
///
///bool
publicboolsetDescription(stringname)
{
Listlist=newList();
DotNetSpeech.ISpeechObjectTokensobj=voice.GetVoices();
intcount=obj.Count;//获取语音库总数
boolresult=false;
for(inti=0;i
{
stringdesc=obj.Item(i).GetDescription();//遍历语音库
if(desc.Equals(name))
{
voice.Voice=obj.Item(i);
result=true;
}
}
returnresult;
}
///
///设置语速
///
///
publicvoidsetRate(intn)
{
voice.Rate=n;
}
///
///设置声音大小
///
///
publicvoidsetVolume(intn)
{
voice.Volume=n;
}
///
///暂停
///
publicvoidPause()
{
voice.Pause();
}
///
///继续
///
publicvoidResume()
{
voice.Resume();
}
///
///停止
///
publicvoidStop()
{
voice.Speak(string.Empty,SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
}
///
///输出WAV
///
///保存路径
///要转换的文本内容
///
publicboolWreiteToWAV(stringpath,stringstr,SpeechAudioFormatTypeSpAudioType)
{
SpeechStreamFileModeSpFileMode=SpeechStreamFileMode.SSFMCreateForWrite;
SpFileStreamSpFileStream=newSpFileStream();
SpeechVoiceSpeakFlagsSpFlags=SpeechVoiceSpeakFlags.SVSFlagsAsync;
SpAudioFormatSpAudio=newDotNetSpeech.SpAudioFormat();
SpAudio.Type=SpAudioType;
SpFileStream.Format=SpAudio;
SpFileStream.Open(path,SpFileMode,false);
voice.AudioOutputStream=SpFileStream;
voice.Speak(str,SpFlags);
voice.WaitUntilDone(Timeout.Infinite);
SpFileStream.Close();
returnFile.Exists(path);
}
}
}