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

}

}

}

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

  1. 为什么C/C++程序员都要阅读Redis源码之:Redis学习事件驱动设计

    0. 为什么我说C/C++程序员都要阅读Redis源码 主要原因就是『简洁』.如果你用源码编译过Redis,你会发现十分轻快,一步到位.其他语言的开发者可能不会了解这种痛,作为C/C++程序员,如果你 ...

  2. c++ 多线程 类成员函数_为什么我说C/C++程序员都要阅读Redis源码之:通过Redis学习事件驱动设计

    0. 为什么我说C/C++程序员都要阅读Redis源码 主要原因就是『简洁』.如果你用源码编译过Redis,你会发现十分轻快,一步到位.其他语言的开发者可能不会了解这种痛,作为C/C++程序员,如果你 ...

  3. Thinkphp5内核大型程序员交流博客系统源码

    介绍: Thinkphp5内核大型程序员交流博客系统源码 网盘下载地址: http://kekewl.cc/qGKM757akv40 图片:

  4. 为什么C/C++程序员一定要阅读redis源码?腾讯面试教你做人【linux服务器开发】

    为什么C/C++程序员一定要阅读redis源码?腾讯面试教你做人[linux服务器开发] 专注于服务器后台开发,包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastd ...

  5. 趣谈程序员真香定律:源码即设计

    来源 | 码砖杂役 责编 | Carol 封图 | CSDN 付费下载自视觉中国 我们经常谈论架构,讨论设计,却甚少关注实现和代码本身,架构和设计固然重要,但要说代码本身不重要,我不同意,Robert ...

  6. 【华为云技术分享】程序员真香定律:源码即设计

    我们经常谈论架构,讨论设计,却甚少关注实现和代码本身,架构和设计固然重要,但要说代码本身不重要,我不同意,Robert C.Martin大叔也不同意,Martin认为"源码即设计" ...

  7. 神级以下必读! ~程序员学习资料(图书源码) 01

     为表示感谢,少见的郑重声明:本文转自- http://blog.csdn.net/fanxiaobin577328725/article/details/51894331?locationNum ...

  8. Python开发指南[1]之程序员计时小时钟(附源码)

    Python开发指南[1]之程序员计时小时钟 程序之美 前言 主体 运行效果 核心代码 逻辑分析 结束语 程序之美 前言 Python作为一门编程语言,这门语言的魅力和影响力已经远超C#.C++等编程 ...

  9. 菜鸟程序员如何才能学会阅读源码

    阅读源码是每个优秀开发工程师的必经之路,那么这篇文章就来讲解下为什么要阅读源码以及如何阅读源码. 首先来说下为什么要读源码,有学习源码的必要吗? 为什么要阅读源码? 关于为什么阅读和学习源码,我个人认 ...

最新文章

  1. 记个maven无法识别JAVA_HOME的问题 Error: JAVA_HOME is not defined correctly.
  2. 编写wordcount程序
  3. Linxu内核模块开发入门(金荣的第一篇个人技术博客)
  4. Atitit .linux 取回root 密码q99
  5. 安卓 外部存储/ExternalStorage 的使用
  6. (二)深度学习数据处理-----图片数据处理
  7. 小长假来了,送 40 本 Python 好书
  8. SAP UI5 oFileUpload.getUploadEnabled()
  9. (79)Verilog HDL系统函数和任务:$write
  10. 工作资讯003---甘特图
  11. Win-MASM64汇编语言-CMP/CMPSB/CMPSW/CMPSD/JNE/JCXZ
  12. Golang sync.Pool 简介与用法
  13. 基于Dialog的MFC程序在启动时隐藏为托盘程序(三)
  14. 使用shell创建一个简单的菜单bash select用法
  15. 离散事件系统仿真(第五版)
  16. oracle罗马字符转数字,一些关于罗马字符的知识
  17. 计算机二级ms office有题库吗,计算机二级office题库-吃惊!二级MS Office高级应用通过率仅有21.07%!...
  18. mmdetection 绘制PR曲线
  19. python多找表格进行数据对比
  20. 计算当前是时间距离凌晨零点的时间

热门文章

  1. Android Studio阿里镜像源配置
  2. SQL_存储过程——获得一棵树的所有叶子节点
  3. 树莓派4B安装ubuntu18.04 Wifi热点开启
  4. 汇编程序:计算分段函数
  5. smtp 协议 MIME协议
  6. 标签打印软件如何批量打印小程序码图片
  7. PDMan 之数据库逆向解析
  8. 百科园c语言,百科园C语言题库教程.doc
  9. 腾讯web前端笔试题及个人答案
  10. state和status的区别