C# 利用TTS实现文本转语音
TSS(Text To Speech),语音朗读文本的技术,在Windows下台下,微软给我们提供了一套API接口(Speech API)。金山词霸的朗读功能就是用的这个接口。
WindowsXP自带的是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实现文本转语音的更多相关文章
- 用TTS实现文本转语音
最近被toefl单词虐成狗::>_<:: 想做一个可以自动把单词转成语音的软件,这样就可以在路上戴耳机边走边听啦~ 用微软的TTS语音库可以很容易地实现.早期的TTS要想实现中英文混合朗读 ...
- 【TTS】文本转语音?如何不调用第三方api来实现,使用pyttsx3
@ 目录 前言 安装pyttsx3 实现TTS接口 后言 前言 本次的实现需求有点困难,所以也就记录下来,别到时候都忘了. 首先先不说正题,有兴趣的可以看一看: 1.目标是实现一个可以传一个文本就返回 ...
- C# 百度TTS,文本转语音,RestAPI之Get请求
因为用得到,所以作个记录: 代码如下: public class BaiduTTSService : IBaiduTTSService { public string tok = GetBaiduTo ...
- iOS 文本转语音(TTS)详解:Swift
上一篇博客讲解了iOS的speech FrameWork语音识别的功能:http://www.cnblogs.com/qian-gu-ling/p/6599670.html,对应的这篇博客就写一下文本 ...
- 文本转语音TTS(文本阅读和视频配音制作)MP3
DL-TTS 通过AI驱动引擎可将文本转化为逼真的语音,它可以:(1)生成逼真的合成语音实现与人声的语调和情感匹配的流畅.发音自然的文本转语音.(2)细化的文本转语音控制支持多种语言,并可调整语速.语 ...
- C# 文本转语音朗读
1. 利用DONET框架自带的 SpeechSynthesizer ,缺点是没有感情色彩,抑扬顿挫等. using System; using System.Collections.Generic; ...
- 15.Python文本转化语音方法
1.用pywin32模块来将文本转化为语音 通过pip install pywin32安装模块,pywin32是个万金油的模块,太多的场景使用到它,但在文本转语音上,它却是个青铜玩家,简单无脑但效果不 ...
- unity3dWeb版文本转语音
文本转语音 <script type="text/javascript"> function VioceSpeack(str) { var zhText = str; ...
- AWS机器学习初探(2):文本翻译Translate、文本转语音Polly、语音转文本Transcribe
AWS机器学习初探(1):Comprehend - 自然语言处理服务 这几个服务的功能和使用都很直接和简单,因此放在一篇文章中介绍. 1. 文本翻译服务 Translate 1.1 功能介绍 AWS ...
随机推荐
- iOS 实现从后台切换到前台-复制分享宝贝内容,打开淘宝APP,自动弹出宝贝提示信息
- (void)applicationDidBecomeActive:(UIApplication *)application { NSLog(@"\n ===> 程序重新激活 !&q ...
- iptables 概念 1
[ 实战笔记 -- iptables 概念 1 ] 一. 防火墙相关概念 # 从逻辑上讲,防火墙可以分为主机防火墙和网络防火墙. 1> 主机防火墙: 针对于单个主机进行防护 2> 网络防火 ...
- 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝
[BZOJ4325]NOIP2015 斗地主 Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗 ...
- 【BZOJ2793】[Poi2012]Vouchers 调和级数
[BZOJ2793][Poi2012]Vouchers Description 考虑正整数集合,现在有n组人依次来取数,假设第i组来了x人,他们每个取的数一定是x的倍数,并且是还剩下的最小的x个.正整 ...
- 《从零开始学Swift》学习笔记(Day 38)——构造函数与存储属性初始化
原创文章,欢迎转载.转载请注明:关东升的博客 构造函数的主要作用是初始化实例,其中包括:初始化存储属性和其它的初始化.在Rectangle类或结构体中,如果在构造函数中初始化存储属性width和hei ...
- 【Python之路】第十五篇--Web框架
Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:utf- ...
- 一个经验丰富的网站建设程序员的CSS资料
没有就不能活的 53 个 CSS 技术 对新手实用的 20 个 CSS 建议 快速编写更好 CSS 代码的 5 种方法 50+ 个 CSS 创意案例和教程 101 个 CSS 小贴士.教程和范例 CS ...
- <2013 07 22> 游历西欧
从本月11号开始到昨天,10天时间,和其他六位同学畅游了西欧,路经慕尼黑-巴塞罗马-尼斯-马赛-巴黎-阿姆斯特丹,最后回到慕尼黑,每个地方都待了两天,参观了主要的景点和建筑,见识了本地文化与饮食. 令 ...
- Power Systems 虚拟化简介
本文向您详细地介绍了 Power System 虚拟化相关的技术和亮点,让您对这些最新的虚拟化技术有一个全面的了解.本文来自 IBM Systems Magazine for AIX 中文版. 自从引 ...
- Version 1.5 of the JVM is not suitable for this product.Version:1.6 or greater is required
近期在公司涉及到了服务器等的扩展,smartfoxserver扩展使用的Eclipse,尽管没学过java.可是咱毕竟是C++起价的,其它语言看看也就会了,项目依然做着,近期看到某同学有一些java的 ...