java调用微软语音库,程序员罗杰-.NET C# 语音合成源码(TTS)微软库

应表哥要求,写一个简单的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);

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值