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);
}
}
}
java调用微软语音库,程序员罗杰-.NET C# 语音合成源码(TTS)微软库相关推荐
- 为什么C/C++程序员都要阅读Redis源码之:Redis学习事件驱动设计
0. 为什么我说C/C++程序员都要阅读Redis源码 主要原因就是『简洁』.如果你用源码编译过Redis,你会发现十分轻快,一步到位.其他语言的开发者可能不会了解这种痛,作为C/C++程序员,如果你 ...
- c++ 多线程 类成员函数_为什么我说C/C++程序员都要阅读Redis源码之:通过Redis学习事件驱动设计
0. 为什么我说C/C++程序员都要阅读Redis源码 主要原因就是『简洁』.如果你用源码编译过Redis,你会发现十分轻快,一步到位.其他语言的开发者可能不会了解这种痛,作为C/C++程序员,如果你 ...
- Thinkphp5内核大型程序员交流博客系统源码
介绍: Thinkphp5内核大型程序员交流博客系统源码 网盘下载地址: http://kekewl.cc/qGKM757akv40 图片:
- 为什么C/C++程序员一定要阅读redis源码?腾讯面试教你做人【linux服务器开发】
为什么C/C++程序员一定要阅读redis源码?腾讯面试教你做人[linux服务器开发] 专注于服务器后台开发,包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastd ...
- 趣谈程序员真香定律:源码即设计
来源 | 码砖杂役 责编 | Carol 封图 | CSDN 付费下载自视觉中国 我们经常谈论架构,讨论设计,却甚少关注实现和代码本身,架构和设计固然重要,但要说代码本身不重要,我不同意,Robert ...
- 【华为云技术分享】程序员真香定律:源码即设计
我们经常谈论架构,讨论设计,却甚少关注实现和代码本身,架构和设计固然重要,但要说代码本身不重要,我不同意,Robert C.Martin大叔也不同意,Martin认为"源码即设计" ...
- 神级以下必读! ~程序员学习资料(图书源码) 01
为表示感谢,少见的郑重声明:本文转自- http://blog.csdn.net/fanxiaobin577328725/article/details/51894331?locationNum ...
- Python开发指南[1]之程序员计时小时钟(附源码)
Python开发指南[1]之程序员计时小时钟 程序之美 前言 主体 运行效果 核心代码 逻辑分析 结束语 程序之美 前言 Python作为一门编程语言,这门语言的魅力和影响力已经远超C#.C++等编程 ...
- 菜鸟程序员如何才能学会阅读源码
阅读源码是每个优秀开发工程师的必经之路,那么这篇文章就来讲解下为什么要阅读源码以及如何阅读源码. 首先来说下为什么要读源码,有学习源码的必要吗? 为什么要阅读源码? 关于为什么阅读和学习源码,我个人认 ...
最新文章
- 记个maven无法识别JAVA_HOME的问题 Error: JAVA_HOME is not defined correctly.
- 编写wordcount程序
- Linxu内核模块开发入门(金荣的第一篇个人技术博客)
- Atitit .linux 取回root 密码q99
- 安卓 外部存储/ExternalStorage 的使用
- (二)深度学习数据处理-----图片数据处理
- 小长假来了,送 40 本 Python 好书
- SAP UI5 oFileUpload.getUploadEnabled()
- (79)Verilog HDL系统函数和任务:$write
- 工作资讯003---甘特图
- Win-MASM64汇编语言-CMP/CMPSB/CMPSW/CMPSD/JNE/JCXZ
- Golang sync.Pool 简介与用法
- 基于Dialog的MFC程序在启动时隐藏为托盘程序(三)
- 使用shell创建一个简单的菜单bash select用法
- 离散事件系统仿真(第五版)
- oracle罗马字符转数字,一些关于罗马字符的知识
- 计算机二级ms office有题库吗,计算机二级office题库-吃惊!二级MS Office高级应用通过率仅有21.07%!...
- mmdetection 绘制PR曲线
- python多找表格进行数据对比
- 计算当前是时间距离凌晨零点的时间