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. C++实现文件关联

    下面这段话是百度百科对文件关联的解释. 文件关联就是将一种类型的文件与一个可以打开它的程序建立起一种依存关系.举个例子来说,位图文件(BMP文件)在Windows中的默认关联程序是“画图”,如果将其默 ...

  2. JAVA 虚拟机内存

    1.普通java应用程序,使用java命令运行, java -Xms1024m -Xmx1024m -XX:MaxNewSize=256m  -XX:MaxPermSize=256m -jar 2.t ...

  3. [HTML5&amp;CSS3]Transform具体解释

    Transform字面上就是变形,改变的意思. 在CSS3中transform主要包含以下几种:旋转rotate.扭曲skew.缩放scale和移动translate以及矩阵变形matrix.以下我们 ...

  4. PAT trie

    最近在上计算机应用编程,老师给了一个大小为900MB的含20000000行邮箱地址的文件. 然后再给出了1000条查询数据,让你用字典树建树然后查询是否出现过. 试了下普通的tire树,特意用二进制写 ...

  5. poj1742

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 33998   Accepted: 11554 Descripti ...

  6. G - Oil Deposits(dfs)

    G - Oil Deposits Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u De ...

  7. 2018.10.24-day3 python总结

    昨日回顾:1.while2.运算符3.初始编码4.补充p2和p3的区别 Python2 (1) 今日学习目录1.整型 int() 2.布尔值 bool() 3.字符串详解 4. for循环

  8. Delphi Pdf的使用方法

    此方法安装了llPDFLib.v3.6 控件.对pdf左侧.右侧正文进行了操作. procedure TForm1.Button1Click(Sender: TObject); var node,nd ...

  9. 使用Kotlin开发Android应用(I):简介

    Kotlin是一门基于JVM的编程语言,它正成长为Android开发中用于替代Java语言的继承者.Java是世界上使用最多的编程语言之一,当其他编程语言为更加便于开发者使用而不断进化时,Java并没 ...

  10. 联想Y50用U盘改装win7的详细教程

    由于一些原因,部分网友想把自带的win8.1系统改成win7,苦于Y50没有光驱,装系统不方便,下面特意做一个用U盘改装系统的教程,先准备一个8G或更大的U盘,如果里面有重要文件,请先备份,等会要清空 ...