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. 吴裕雄 python 神经网络——TensorFlow训练神经网络:全模型

    import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data INPUT_NODE = 784 ...

  2. DHCP原理及报文格式

    DHCP原理及报文格式 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是IETF为实现IP的自动配置而设计的协议,它可以为客户机自动分配IP地址. ...

  3. leetcode 0209

    目录 ✅ 500. 键盘行 描述 解答 ✅ 905. 按奇偶排序数组 描述 解答 py sorted 参数详解 ✅ 559. N叉树的最大深度 描述 解答 java dfs-like method(r ...

  4. 在自定义的widget中引入图表后,运行时出现TypeError #1009错误

    本人网上查找了很多资料,其中大部分都是关于Flash中的动画效果问题,与这里的问题关系型不太大.故把问题的解决方法写在这里,与人方便,与己方便. 方法一: 1.在自定义的widget中添加如下两个方法 ...

  5. 「JSOI2014」打兔子

    「JSOI2014」打兔子 传送门 首先要特判 \(k \ge \lceil \frac{n}{2} \rceil\) 的情况,因为此时显然可以消灭所有的兔子,也就是再环上隔一个点打一枪. 但是我们又 ...

  6. 「JSOI2015」最大公约数

    「JSOI2015」最大公约数 传送门 考虑先枚举区间左端点, 然后我们会发现所有可能的区间虽然有 \(O(n)\) 个,但是本质不同的区间 \(\gcd\) 只有 \(\log n\) 级别,而且是 ...

  7. SpringBoot常用注解解析

    @RestController 将返回的对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中.绝大部分情况下都是直接以 JSON 形式返回给客户端,很少的情况下才会以 ...

  8. Python使用pyautogui控制鼠标键盘

    官方文档:https://pyautogui.readthedocs.io/en/latest/# 安装pyautogui模块 在 Windows 上,不需要安装其他模块. 在 OS X 上,运行 s ...

  9. webdriver-js操作滚动条

    webdriver-js操作滚动条 1.      webdriver高级应用-js操作滚动条 1.滑动页面的滚动条到页面最下面 2.滑动页面的滚动条到页面的某个元素 3.滑动页面的滚动条向下移动某个 ...

  10. PAT T1019 Separate the Animals

    暴力搜索加剪枝,二进制保存状态,set去重~ #include<bits/stdc++.h> using namespace std; ; string s[maxn]; struct n ...