一、Text To Speech

简介:

站在巨人的肩膀上,这里我将做一下整理,也是对自己所学的总结。

 

本节介绍 文字 to 语音 包含两部分:
1、微软是实现TTS
2、微软将声音保存为语音文件
3、利用Google翻译实现TTS

 

微软TTS

微软的SAPI(Speech Application Programming Interface)提供了强大的Text To Speech接口,而且支持自动化。

通过微软的SAPI,可以实现TTS(Text to Speech),即“从文本到语音”,是人机对话的一部分,让机器能够说话。

使用方式:
使用COM组件技术实现TTS---注意:Xp需要安装Microsoft Speech SDK Version 5.1,先安装SDK再安装语言包。

 

下面我们就来用几句代码来实现TTS的功能

COM组件技术
添加引用:在COM选项卡里面,添加Microsoft Speech  object  library的引用
   在代码区添加 Using SpeechLib
 

复制代码
 private void btnRead_Click(object sender, EventArgs e)
        {
            string strContent = txtContent.Text.Trim();

            SpeechVoiceSpeakFlags Speak = SpeechVoiceSpeakFlags.SVSFlagsAsync ;
            SpVoice voice = new SpVoice();
            voice.Speak(strContent, Speak);
        }
复制代码

如此简单就可以实现了TTS。但是,这种方式只能利用默认的声音。即:控制面板--语音识别--文本到语音转换(我Win7是Lili Chinese的声音)
实现多语音的画,网上查阅如此即可。但是在我Win7本机上用vs2010米有作用,我觉得应该是没有安装其他语音包的缘故,稍后再试

复制代码
            SpeechVoiceSpeakFlags flag = SpeechVoiceSpeakFlags.SVSFlagsAsync;
            SpVoice voice = new SpVoice();
            voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(3);
            //Item(0)单词男声Sam
            //Item(1)单词男声Mike
            //Item(2)单词女声Mary
            //Item(3)中文发音,如果是英文,就依单词字母一个一个发音
            voice.Speak(textBox1.Text, flag);
复制代码

既然晓得了如何简单的用,再稍稍去了解下其如何实现的呢?
1、SpeechVoiceSpeakFlags是一个枚举类型

复制代码
    //这里的枚举都是什么意思呢?   
   public enum SpeechVoiceSpeakFlags
    {
        SVSFUnusedFlags = -512,
        SVSFDefault = 0,
        SVSFParseAutodetect = 0,
        SVSFlagsAsync = 1,
        SVSFPurgeBeforeSpeak = 2,
        SVSFIsFilename = 4,
        SVSFIsXML = 8,
        SVSFIsNotXML = 16,
        SVSFPersistXML = 32,
        SVSFNLPMask = 64,
        SVSFNLPSpeakPunc = 64,
        SVSFParseSapi = 128,
        SVSFParseSsml = 256,
        SVSFParseMask = 384,
        SVSFVoiceMask = 511,
    }
复制代码

 

2、SpVoice是一个接口,但是....

复制代码
namespace SpeechLib
{
    [CoClass(typeof(SpVoiceClass))]  //CoClass是组件类
    [Guid("269316D8-57BD-11D2-9EEE-00C04F797396")]
    public interface SpVoice : ISpeechVoice, _ISpeechVoiceEvents_Event
    {
    }
}
复制代码

如果上例子中对SpVoiceClass实例化时,就会报错无法嵌入互操作类型“SpeechLib.SpVoiceClass”。请改用适用的接口。这是为什么呢?

[CoClass(typeof(SpVoiceClass))]  应该是让SpVoice和SpVoiceClass建立了某种关系吧,因为上面调用的voice.Voice和voice.GetVoice以及voice.Speak都是SpVoiceClass的成员,暂且先介个样子理解,学习CoClass之后再做更正吧!!!!
--COM coclass 在 C# 中表示为具有无参数构造函数的类。
--MSDN解释:http://msdn.microsoft.com/zh-cn/library/aa288455(v=vs.71).aspx

 

SpVoiceClass类

复制代码
namespace SpeechLib
{
    [ComSourceInterfaces("SpeechLib._ISpeechVoiceEvents")]
    [TypeLibType(2)]
    [ClassInterface(0)]
    [Guid("96749377-3391-11D2-9EE3-00C04F797396")]
    public class SpVoiceClass : ISpeechVoice, SpVoice, _ISpeechVoiceEvents_Event, ISpVoice, ISpPhoneticAlphabetSelection
    {
        //这里只列举了部分的成员  
public SpVoiceClass(); [DispId(5)] public virtual int Rate { get; set; } [DispId(6)] public virtual int Volume { get; set; } [DispId(18)] public virtual void GetRate(out int pRateAdjust); public virtual void GetVoice(out ISpObjectToken ppToken); [DispId(14)] public virtual void Pause(); [DispId(15)] public virtual void Resume(); public virtual void SetVolume(ushort usVolume); [DispId(12)] public virtual int Speak(string Text, SpeechVoiceSpeakFlags Flags = SpeechVoiceSpeakFlags.SVSFDefault); public virtual void Speak(string pwcs, uint dwFlags, out uint pulStreamNumber); } }
复制代码

此处只是列举出了部分成员,简单介绍下其中某些成员的作用!
pause/Resume      暂停/继续
SetVoice/GetVoice    设置声音
SetRate          设置读取速度
SetVolume/GetVolume  声音大小
...
...

-------遗留问题:DispId和ComSourceInterfaces等都是什么意思?

 

将声音保存为语音文件

复制代码
            SpeechVoiceSpeakFlags flag = SpeechVoiceSpeakFlags.SVSFlagsAsync;
            SpVoice voice = new SpVoice();
            voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(3);


            SpeechStreamFileMode SpFileMode = SpeechStreamFileMode.SSFMCreateForWrite;
 
            SpFileStream SpFileStream = new SpFileStream();
            SpFileStream.Open(@"C:\test.wav", SpFileMode, false);
            voice.AudioOutputStream = SpFileStream;//设定voice的输出为Stream
            voice.Speak(textBox1.Text.Trim(), flag);
            voice.WaitUntilDone(Timeout.Infinite);//Using System.Threading;
 
            SpFileStream.Close();
复制代码

 利用谷歌翻译来实现TTS
谷歌翻译有朗读的功能

根据朗读时浏览器的请求,得到其请求URL

分析请求的URL:
ie  编码方式 
q  要朗读的关键字
&tl  语言
total  ???
idex  ???
textlen  应该关键字长度
prev  ???

 

 

 

 

 

还有其他方式和可以实现C#播放声音
1、利用DirectX
2、MS的COM组件
3、引用SoundPlayer
4、利用Windows Media Player

 详细见:http://www.soaspx.com/dotnet/csharp/csharp_20090922_407.html

 

补充:今天在C#Coner看见一篇文章(含实例),也是有关TTS的,写得非常好,个人非常喜欢!
   http://www.c-sharpcorner.com/uploadfile/mahesh/programming-speech-in-wpf-speech-synthesis/

 



本文转自武沛齐博客园博客,原文链接:http://www.cnblogs.com/wupeiqi/archive/2013/05/03/3057443.html,如需转载请自行联系原作者

目录
相关文章
|
存储 JSON 前端开发
JSON数组的概念、语法和用法
JSON数组的概念、语法和用法
1974 3
|
XML 算法 安全
C#编码规范
本篇内容记录了 命名惯例和规范、 ** 良好的编程习惯、** 注释 、 ** 异常处理
838 0
C#编码规范
|
Shell 程序员 开发工具
码云代码托管平台
码云代码托管平台
|
vr&ar C# 图形学
从零开始的PICO开发教程(4)-- VR世界 射线传送、旋转和移动
这篇文章是PICO开发系列教程的第四部分,详细介绍了在VR世界中实现射线传送、视角旋转和人物移动的方法,包括使用Teleportation组件进行区域传送和锚点传送,通过Snap Turn Provider组件实现视角快速旋转,以及创建PlayControl脚本来控制人物移动,并通过手柄与脚本组件的交互来增强VR体验。
|
存储 关系型数据库 MySQL
OceanBase的架构
【8月更文挑战第9天】OceanBase的架构
748 59
|
机器学习/深度学习 自然语言处理 PyTorch
Whisper对于中文语音识别与转写中文文本优化的实践(Python3.10)
阿里的FunAsr对Whisper中文领域的转写能力造成了一定的挑战,但实际上,Whisper的使用者完全可以针对中文的语音做一些优化的措施,换句话说,Whisper的“默认”形态可能在中文领域斗不过FunAsr,但是经过中文特殊优化的Whisper就未必了。
Whisper对于中文语音识别与转写中文文本优化的实践(Python3.10)
|
Java 测试技术 C#
常见浏览器兼容性测试工具
常见浏览器兼容性测试工具
823 0
|
C# 图形学
【Unity 3D】C#中String类的介绍及字符串常用操作详解(附测试代码 超详细)
【Unity 3D】C#中String类的介绍及字符串常用操作详解(附测试代码 超详细)
795 0
|
编解码
如何解决虚拟主机MP4格式的视频播放黑屏
如何解决虚拟主机MP4格式的视频播放黑屏
|
NoSQL Ubuntu Shell
香橙派 瑞芯微 RK3588 上手自记
香橙派 瑞芯微 RK3588 上手自记
1249 0