应表哥要求,写一个简单的TTS软件,他们单位上用于广播通知用。源码如下:
简单说明:
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
}
SpVoiceUtil SpVoiceUtil = new SpVoiceUtil();
private void frmMain_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
List list = SpVoiceUtil.getDescription();
foreach (var item in list)
{
comboBox1.Items.Add(item);
}
if (comboBox1.Items.Count > 0)
{
comboBox1.SelectedIndex = 0;
}
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
SpVoiceUtil.setDescription(this.Text);
}
//暂停
private void button2_Click(object sender, EventArgs e)
{
SpVoiceUtil.Pause();
}
//继续
private void button5_Click(object sender, EventArgs e)
{
SpVoiceUtil.Resume();
}
//停止
private void button3_Click(object sender, EventArgs e)
{
SpVoiceUtil.Stop();
}
//设置语速
private void trackBar1_Scroll(object sender, EventArgs e)
{
lab_Rate.Text = trackBar1.Value.ToString();
SpVoiceUtil.setRate(trackBar1.Value);
}
//设置音量
private void trackBar2_Scroll(object sender, EventArgs e)
{
lab_Volume.Text = trackBar2.Value.ToString();
SpVoiceUtil.setVolume(trackBar2.Value);
}
//开始朗读
private void button1_Click(object sender, EventArgs e)
{
SpVoiceUtil.Speak(txt_str.Text, CallBack);
}
//写出WAV
private void button4_Click(object sender, EventArgs e)
{
bool isTrue = false;
SaveFileDialog dialog = new SaveFileDialog();
dialog.Filter = "All files (*.*)|*.*|wav files (*.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("输出失败");
}
}
//回调信息
private void CallBack(bool b, int InputWordPosition, int InputWordLength)
{
textBox1.AppendText("是否读完:"+b.ToString()+"\r\n");
textBox1.AppendText("朗读长度:" + InputWordPosition.ToString() + "\r\n");
textBox1.AppendText("朗读位置:" + InputWordLength.ToString() + "\r\n");
}
}
namespace SpVoiceDemo
{
class SpVoiceUtil
{
SpVoice voice = new DotNetSpeech.SpVoiceClass();
public delegate void CallBack(bool b,int InputWordPosition, int InputWordLength);
///
/// 朗读文本
///
/// 要朗读的文本
/// 回调地址
/// 返回bool
public bool Speak(string str, CallBack CallBack)
{
int n = voice.Speak(str, SpeechVoiceSpeakFlags.SVSFlagsAsync);
Thread thread = new Thread(new ParameterizedThreadStart(Call));
thread.IsBackground = true;
thread.Start((Object)CallBack);
return !(n!=1);
}
///
/// 回调函数线程子程序
///
///
private void Call(Object callBack)
{
int InputWordLength = 0; //局部_朗读长度
int InputWordPosition = 0; //局部_朗读位置
CallBack CallBack = (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
public List getDescription()
{
List list = new List();
DotNetSpeech.ISpeechObjectTokens obj = voice.GetVoices();
int count = obj.Count;//获取语音库总数
for (int i = 0; i
{
string desc = obj.Item(i).GetDescription(); //遍历语音库
list.Add(desc);
}
return list;
}
///
/// 设置当前使用语音库
///
/// bool
public bool setDescription(string name)
{
List list = new List();
DotNetSpeech.ISpeechObjectTokens obj = voice.GetVoices();
int count = obj.Count;//获取语音库总数
bool result = false;
for (int i = 0; i
{
string desc = obj.Item(i).GetDescription(); //遍历语音库
if (desc.Equals(name))
{
voice.Voice = obj.Item(i);
result = true;
}
}
return result;
}
///
/// 设置语速
///
///
public void setRate(int n)
{
voice.Rate = n;
}
///
/// 设置声音大小
///
///
public void setVolume(int n)
{
voice.Volume = n;
}
///
/// 暂停
///
public void Pause()
{
voice.Pause();
}
///
/// 继续
///
public void Resume()
{
voice.Resume();
}
///
/// 停止
///
public void Stop()
{
voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
}
///
/// 输出WAV
///
/// 保存路径
/// 要转换的文本内容
///
public bool WreiteToWAV(string path,string str,SpeechAudioFormatType SpAudioType)
{
SpeechStreamFileMode SpFileMode = SpeechStreamFileMode.SSFMCreateForWrite;
SpFileStream SpFileStream = new SpFileStream();
SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
SpAudioFormat SpAudio = new DotNetSpeech.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();
return File.Exists(path);
}
}
}