wav操作引入dll(DotNetSpeech.dll),引入以后需要选中项目中引入的dll,鼠标右键,选择属性,把“嵌入互操作类型”设置为False。不然会提示无法嵌入互操作类型"SpeechLib.SpVoiceClass".请改用适用的接口.
DotNetSpeech.SpeechAudioFormatType.SAFTCCITT_uLaw_11kHzMono表示音频编码格式为G711U
           var text = "我来测试一下!AB连续字母加空格";
var path = Path.Combine(@"C:\ZZ_VoiceFile", $"1.wav");
text = AddKongGeToPlateNo(text).Trim();
SpVoiceUtil SpVoiceUtil = new SpVoiceUtil();
SpVoiceUtil.setRate();
SpVoiceUtil.setVolume();
SpVoiceUtil.WreiteToWAV(path, text, DotNetSpeech.SpeechAudioFormatType.SAFTCCITT_uLaw_11kHzMono); //SAFT11kHz16BitMono 生成wav文件 // 连续字母中加空格
private static string AddKongGeToPlateNo(string s)
{
int length = s.Length;
string[] letters = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
for (int i = ; i < length - ; i++)
{
string str = s.Substring(i, );
string str1 = s.Substring(i + , );
if (letters.Contains(str) && letters.Contains(str1))
{
s = s.Substring(, i + ) + " " + s.Substring(i + );
length = length + ;
}
}
return s;
}

帮助类

 class SpVoiceUtil
{
SpVoice voice = new DotNetSpeech.SpVoiceClass(); public delegate void CallBack(bool b, int InputWordPosition, int InputWordLength); /// <summary>
/// 朗读文本
/// </summary>
/// <param name="str">要朗读的文本</param>
/// <param name="CallBack">回调地址</param>
/// <returns>返回bool</returns>
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 != );
} /// <summary>
/// 回调函数线程子程序
/// </summary>
/// <param name="callBack"></param>
private void Call(Object callBack)
{
int InputWordLength = ; //局部_朗读长度
int InputWordPosition = ; //局部_朗读位置 CallBack CallBack = (CallBack)callBack; while ((int)voice.Status.RunningState != )
{
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);
} /// <summary>
/// 获取语音库
/// </summary>
/// <returns>List<string></returns>
public List<string> getDescription()
{
List<string> list = new List<string>();
DotNetSpeech.ISpeechObjectTokens obj = voice.GetVoices();
int count = obj.Count;//获取语音库总数
for (int i = ; i < count; i++)
{
string desc = obj.Item(i).GetDescription(); //遍历语音库
list.Add(desc);
}
return list;
} /// <summary>
/// 设置当前使用语音库
/// </summary>
/// <returns>bool</returns>
public bool setDescription(string name)
{
List<string> list = new List<string>();
DotNetSpeech.ISpeechObjectTokens obj = voice.GetVoices();
int count = obj.Count;//获取语音库总数
bool result = false;
for (int i = ; i < count; i++)
{
string desc = obj.Item(i).GetDescription(); //遍历语音库
if (desc.Equals(name))
{
voice.Voice = obj.Item(i);
result = true;
}
}
return result;
} /// <summary>
/// 设置语速
/// </summary>
/// <param name="n"></param>
public void setRate(int n)
{
voice.Rate = n;
} /// <summary>
/// 设置声音大小
/// </summary>
/// <param name="n"></param>
public void setVolume(int n)
{
voice.Volume = n;
} /// <summary>
/// 暂停
/// </summary>
public void Pause()
{
voice.Pause();
} /// <summary>
/// 继续
/// </summary>
public void Resume()
{
voice.Resume();
} /// <summary>
/// 停止
/// </summary>
public void Stop()
{
voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
} /// <summary>
/// 输出WAV
/// </summary>
/// <param name="path">保存路径</param>
/// <param name="str">要转换的文本内容</param>
/// <returns></returns>
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);
}
}

DotNetSpeech----文本转wave语音文件的更多相关文章

  1. Python网页正文转换语音文件的操作方法

    天气真的是越来越冷啦,有时候我们想翻看网页新闻,但是又冷的不想把手拿出来,移动鼠标翻看.这时候,是不是特别想电脑像讲故事一样,给我们念出来呢?人生苦短,我有python啊,试试用 Python 来朗读 ...

  2. C#开发微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)

    我们知道,企业号主要是面向企业需求而生的,因此内部消息的交流显得非常重要,而且发送.回复消息数量应该很可观,对于大企业尤其如此,因此可以结合企业号实现内部消息的交流.企业号具有关注安全.消息无限制等特 ...

  3. C# wav语音文件合并

    开发完成语音播报产品,由于客户所使用的播放产品种类繁多,在使用HDMI接口播放音频时,由于采用的声卡不同,个别机器会出现播报声音过小,或者不播报的情况.所以采用将语音文件合并播放的方式,来解决此问题. ...

  4. 压缩文本、字节或者文件的压缩辅助类-GZipHelper

    下面为大家介绍一.NET下辅助公共类GZipHelper,该工具类主要作用是对文本.字符.文件等进行压缩与解压.该类主要使用命名空间:System.IO.Compression下的GZipStream ...

  5. 压缩文本、字节或者文件的压缩辅助类-GZipHelper 欢迎收藏

    压缩文本.字节或者文件的压缩辅助类-GZipHelper 欢迎收藏 下面为大家介绍一.NET下辅助公共类GZipHelper,该工具类主要作用是对文本.字符.文件等进行压缩与解压.该类主要使用命名空间 ...

  6. 文本导出到pdf文件

    程序中数据导出是经常有的需求,今天学习把文本导出到pdf文件.主要是用QPrinter,QPainter TextEditToPdf::TextEditToPdf(QWidget *parent, Q ...

  7. 文本导出到pdf文件(使用QPrinter和QPainter和QTextDocument)

    程序中数据导出是经常有的需求,今天学习把文本导出到pdf文件.主要是用QPrinter,QPainter TextEditToPdf::TextEditToPdf(QWidget *parent, Q ...

  8. C#读取固定文本格式的txt文件

    C#读取固定文本格式的txt文件 一个简单的C#读取txt文档的程序,文档中用固定的格式存放着实例数据. //判断关键字在文档中是否存在 ] == "设备ID:107157061" ...

  9. 使用QGIS将文本坐标转换为矢量文件

    本文主要是说明如果使用QGIS将文本格式的点坐标转换为矢量文件(如shapefile格式). 所需工具:QGIS 所需数据:文本格式的点文件 所需要处理的点坐标文件如下所示, 114.2 22.15 ...

随机推荐

  1. mysql数据库关系表设计原则

    三范式https://blog.csdn.net/qq_36432666/article/details/78934073 https://kb.cnblogs.com/page/138526/ ht ...

  2. ES-基本操作

    (1)创建索引 put 192.168.247.197:9200/type2 /type2 (2)创建映射 post 192.168.247.197:9200/type2/type/_mapping ...

  3. Jquery 动态交换两个div位置并添加Css动画效果

    前端网页开发中我们经常会遇到需要动态置换两个DIV元素的位置,常见的思路大多是不考虑原始位置,直接采用append或者appendTo方式将两元素进行添加,该法未考虑原始位置,仅会添加为元素的最后一子 ...

  4. 对RoboMaster论坛自动签到脚本制作(虽然没什么用)

    RoboMaster论坛自动签到,自动浏览刷分 不务正业系列 上完最后一节课,队长跟我们说,RM有个BBS,可以看看,但是下载要金币,这个金币只能做签到等事情才能得到,所以我用python做了一个小程 ...

  5. VIM 练级

    https://coolshell.cn/articles/5426.html

  6. Python 正则表达式之 sub 和 subn函数的使用

    re.sub() 函数的功能 re是reguler expressioin的缩写,表示正则表达式 sub 是 substitute 的缩写,表示替换: re.sub是个正则表达式方面的函数,用来实现通 ...

  7. teraterm中状态框statusbox

    ;Author : Bing ;Date : 1/17/2019;Usage: modify log drictory according to actual drictorylogfile=&quo ...

  8. 方法重载(Overload)

    方法重载(Overload):多个方法名称一样,但参数列表不一样. (一个方法名称,实现类似的多个功能) 方法重载与下列因素有关: 1. 参数个数不同 public static int sum(in ...

  9. 【PAT甲级】1020 Tree Traversals (25 分)(树知二求一)

    题意: 输入一个正整数N(N<=30),给出一棵二叉树的后序遍历和中序遍历,输出它的层次遍历. trick: 当30个点构成一条单链时,如代码开头处的数据,大约1e9左右的结点编号大小,故采用结 ...

  10. Django 执行 manage 命令方式

    本人使用的Pycharm作为开发工具,可以在顶部菜单栏的Tools->Run manage.py Task直接打开manager 命令控制台 打开后在底部会有命令窗口: 或者,也可以在Pytho ...