TSS(Text To Speech),语音朗读文本的技术,在Windows下台下,微软给我们提供了一套API接口(Speech API)。金山词霸的朗读功能就是用的这个接口。

WindowsXP自带的是Speech API 5.1版本,默认只支持英文,如果要支持中文需要安装语音库。

Speech API 5.1 官方下载地址

Speech API 5.1 中文语音库官方下载地址

Vista版本开始,系统自带的Speech API就换成了5.3版本,比较奇怪的是这个API并没有做到向下兼容,5.3版本在Vista以下的版本是不可用的。

有一些非官方的Windows优化版本去掉了语音功能,需要对系统进行修复。
TTS修复工具及一些其他的语音库下载
http://www.dacidian.net/tts/

下面我说一下如何实现,使用.NET 4.0新增的dynamic类型,可以很方便的使用COM类库。

Type type = Type.GetTypeFromProgID("SAPI.SpVoice");
dynamic spVoice = Activator.CreateInstance(type);
spVoice.Speak("Text To Speech 语音朗读文本技术");

当然,直接使用dynamic还是很不方便的,可以对SAPI.SpVoice进行封装

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Diagnostics;
using System.Runtime.InteropServices; namespace COM
{
[Guid("ED5DCE10-F40B-4655-9E7B-903779C77AF2")]
public partial class SpVoice : Object
{
public enum Flags
{
SVSFDefault = ,
SVSFlagsAsync = ,
SVSFPurgeBeforeSpeak = ,
SVSFIsFilename = ,
SVSFIsXML = ,
SVSFIsNotXML = ,
SVSFPersistXML = ,
SVSFNLPSpeakPunc = ,
SVSFParseSapi = ,
SVSFParseSsml = ,
SVSFParseAutodetect = ,
SVSFNLPMask = ,
SVSFParseMask = ,
SVSFVoiceMask = ,
SVSFUnusedFlags = -
} public enum Priority
{
SVPNormal = ,
SVPAlert = ,
SVPOver =
}
}
public partial class SpVoice : Object
{
private Type _ComType = null;
private object _ComObject = null; public SpVoice()
{
this.Init();
} public bool Init()
{
this._ComType = Type.GetTypeFromProgID("SAPI.SpVoice", true); // CLSID {269316D8-57BD-11D2-9EEE-00C04F797396}
if (this._ComType == null) {
throw new Exception("COM调用失败");
}
this._ComObject = Activator.CreateInstance(this._ComType, true);
return this._ComObject != null;
} public int Release()
{
return Marshal.ReleaseComObject(this._ComObject);
} public int Rate
{
get {
return (int)this._ComType.InvokeMember("Rate", BindingFlags.GetProperty, null, this._ComObject, null);
}
set {
this._ComType.InvokeMember("Rate", BindingFlags.SetProperty, null, this._ComObject, new object[] { value });
}
} public void Pause()
{
this._ComType.InvokeMember("Pause", BindingFlags.InvokeMethod, null, this._ComObject, null);
} public void Resume()
{
this._ComType.InvokeMember("Resume", BindingFlags.InvokeMethod, null, this._ComObject, null);
} public int Volume
{
get
{
return (int)this._ComType.InvokeMember("Volume", BindingFlags.GetProperty, null, this._ComObject, null);
}
set
{
this._ComType.InvokeMember("Volume", BindingFlags.SetProperty, null, this._ComObject, new object[] { value });
}
} public int Skip(int Type, int NumItems)
{
return (int)this._ComType.InvokeMember("Skip", BindingFlags.InvokeMethod, null, this._ComObject, new object[] { Type, NumItems });
} public bool IsUISupported(string TypeOfUI, object ExtraData)
{
return (bool)this._ComType.InvokeMember("IsUISupported", BindingFlags.InvokeMethod, null, this._ComObject, new object[] { TypeOfUI, ExtraData });
} public bool WaitUntilDone(int msTimeout) {
return (bool)this._ComType.InvokeMember("WaitUntilDone", BindingFlags.InvokeMethod, null, this._ComObject, new object[] { msTimeout });
} public void DisplayUI(int hWndParent, string Title, string TypeOfUI, object ExtraData)
{
this._ComType.InvokeMember("DisplayUI", BindingFlags.InvokeMethod, null, this._ComObject, new object[] { hWndParent, Title, TypeOfUI, ExtraData });
} public void Speak(string Text, Flags Flags)
{
this._ComType.InvokeMember("Speak", BindingFlags.InvokeMethod, null, this._ComObject, new object[] { Text, Flags });
} public Priority Property
{
get {
return (Priority)this._ComType.InvokeMember("Priority", BindingFlags.GetProperty, null, this._ComObject, null);
}
set {
this._ComType.InvokeMember("Priority", BindingFlags.SetProperty, null, this._ComType, new object[] { value });
}
} public List<string> GetVoices()
{
List<string> _ret = null;
object Item = null, _Voices = this._ComType.InvokeMember("GetVoices", BindingFlags.InvokeMethod, null, this._ComObject, null);
int Count = (int)_Voices.GetType().InvokeMember("Count", BindingFlags.GetProperty, null, _Voices, null);
if (Count != ) {
_ret = new List<string>();
}
for (int i = ; i < Count; i++) {
Item = _Voices.GetType().InvokeMember("Item", BindingFlags.InvokeMethod, null, _Voices, new object[]{ i });
if (Item != null) {
_ret.Add(Item.GetType().InvokeMember("GetDescription", BindingFlags.InvokeMethod, null, Item, null).ToString());
}
}
return _ret;
} public bool SetVoices(string Name)
{
bool _ret = false;
object Item = null, _Voices = this._ComType.InvokeMember("GetVoices", BindingFlags.InvokeMethod, null, this._ComObject, null);
int Count = (int)_Voices.GetType().InvokeMember("Count", BindingFlags.GetProperty, null, _Voices, null);
for (int i = ; i < Count; i++) {
Item = _Voices.GetType().InvokeMember("Item", BindingFlags.InvokeMethod, null, _Voices, new object[] { i });
if (Item != null) {
var _str = Item.GetType().InvokeMember("GetDescription", BindingFlags.InvokeMethod, null, Item, null).ToString();
if (_str == Name) {
this._ComType.InvokeMember("Voice", BindingFlags.SetProperty, null, this._ComObject, new object[] { Item });
}
}
}
return _ret;
}
}
}
转载于http://blog.csdn.net/windowsvipcuvs/article/details/30751707

这样使用起来就比较方便

var spVoices = new SpVoice()
{
Rate = -,
Volume =
};
spVoices.SetVoices(spVoices.GetVoices()[]);
spVoices.Speak(speak, SpVoice.Flags.SVSFlagsAsync);

C# 利用TTS实现文本转语音的更多相关文章

  1. 用TTS实现文本转语音

    最近被toefl单词虐成狗::>_<:: 想做一个可以自动把单词转成语音的软件,这样就可以在路上戴耳机边走边听啦~ 用微软的TTS语音库可以很容易地实现.早期的TTS要想实现中英文混合朗读 ...

  2. 【TTS】文本转语音?如何不调用第三方api来实现,使用pyttsx3

    @ 目录 前言 安装pyttsx3 实现TTS接口 后言 前言 本次的实现需求有点困难,所以也就记录下来,别到时候都忘了. 首先先不说正题,有兴趣的可以看一看: 1.目标是实现一个可以传一个文本就返回 ...

  3. C# 百度TTS,文本转语音,RestAPI之Get请求

    因为用得到,所以作个记录: 代码如下: public class BaiduTTSService : IBaiduTTSService { public string tok = GetBaiduTo ...

  4. iOS 文本转语音(TTS)详解:Swift

    上一篇博客讲解了iOS的speech FrameWork语音识别的功能:http://www.cnblogs.com/qian-gu-ling/p/6599670.html,对应的这篇博客就写一下文本 ...

  5. 文本转语音TTS(文本阅读和视频配音制作)MP3

    DL-TTS 通过AI驱动引擎可将文本转化为逼真的语音,它可以:(1)生成逼真的合成语音实现与人声的语调和情感匹配的流畅.发音自然的文本转语音.(2)细化的文本转语音控制支持多种语言,并可调整语速.语 ...

  6. C# 文本转语音朗读

    1. 利用DONET框架自带的 SpeechSynthesizer ,缺点是没有感情色彩,抑扬顿挫等. using System; using System.Collections.Generic; ...

  7. 15.Python文本转化语音方法

    1.用pywin32模块来将文本转化为语音 通过pip install pywin32安装模块,pywin32是个万金油的模块,太多的场景使用到它,但在文本转语音上,它却是个青铜玩家,简单无脑但效果不 ...

  8. unity3dWeb版文本转语音

    文本转语音 <script type="text/javascript"> function VioceSpeack(str) { var zhText = str; ...

  9. AWS机器学习初探(2):文本翻译Translate、文本转语音Polly、语音转文本Transcribe

    AWS机器学习初探(1):Comprehend - 自然语言处理服务 这几个服务的功能和使用都很直接和简单,因此放在一篇文章中介绍. 1. 文本翻译服务 Translate 1.1 功能介绍 AWS ...

随机推荐

  1. MDL原理理解

    转载自:http://blog.csdn.net/xiaoyu714543065/article/details/8445221 最小描述长度(MDL)        最小描述长度( MDL) 原理是 ...

  2. html 模版

    使用后台开发语言的都很了解语言的动态性给开发带来的好处,PHP,aspx,jsp页面都可以直接使用相应的语法和变量,输出的事就交给解释器或编译器了,用起来方便快捷,但需要额外的解释工作: 例如php模 ...

  3. 理解和使用WPF 验证机制(值得推荐)

    首先建立一个demo用以学习和实验WPF Data Validation机制.创建一个数据实体类: public class Employee { public string Name { get;  ...

  4. poj 1698(拆点+最大匹配)

    题目链接:http://poj.org/problem?id=1698 思路:最大匹配容易想到,关键是如何建图,这里我们可以将电影按需要的天数进行拆点,然后对于可以选择的日子连边,最后只需判断最大匹配 ...

  5. 庖丁解牛:USB 驱动开发技术彻底解密

    我们知道如果开发工程师不懂RS232 肯定会让人笑话可以想象面向未来USB 接口无处不在因此掌握USB 的原理固件编程及其驱动开发技术势必成为当务之急USB 即插即用的优点和灵活性运用于各种电子产品现 ...

  6. vfptr(1)

    前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有“多种形态”,这是一种泛 ...

  7. 【BZOJ3998】[TJOI2015]弦论 后缀自动机

    [BZOJ3998][TJOI2015]弦论 Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T ...

  8. JS实现全选,全不选

    <script type="text/javascript"> function selectItem() { document.getElementById(&quo ...

  9. 阻塞队列 ArrayBlockingQueue 我给自己挖了一个坑

    说一句MMB, 一下午时间, package cn.tbnb1.seckil.quene; import java.util.concurrent.ArrayBlockingQueue; import ...

  10. 构造函数强制使用new

    function Car(model, year, miles) { if (!(this instanceof Car)) { return new Car(model, year, miles); ...