翻译说明:并不全文翻译,只翻译些对本人有用的部分,原版代码为Delphi,译文用C# .NET Framework 2.0
实现,有些有关Delphi的解释略去,另添加一些C#使用SAPI的个人理解注释,不定期更新
实现,有些有关Delphi的解释略去,另添加一些C#使用SAPI的个人理解注释,不定期更新
[1]语音合成
在简单层面上实现语音合成,只需要创建SpVoiceClass对象并调用其中的Speak方法,最简单的实现如下[读出文本框中的文字]
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
[Tachikoma注:此处并未提到编程时添加对SAPI的引用,对COM组件的引用较简单,请自行处理]
对Speak方法的参数作如下说明:
0]对Speak方法的调用默认情况下将会是同步的,也就是说在朗读完指定文字之前不会返回值[同步/异步状态可用第二参数调整]
0]Speak方法返回一个流标号,当存在多个异步声音流时可通过标号识别,标号可作为参数提供给某些函数
1]第一个参数为要阅读的文字
2]第二参数为可调节的一些参数[Flags],可用"或"运算符将其连接同时使用
# SVSFDefault [该方法将同步阅读][具体见说明0]]
# SVSFlagAsync [该方法将异步阅读,调用后将立即返回,可通过事件监视朗读结束时间,或调用 WaitUntilDone 方法,或通过 SpeakCompleteEvent 得到一个事件句柄并提供给 WaitForSingleObject]
# SVSFPurgeBeforeSpeak 所有朗读中的和待朗读的字符都将被取消![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
# SVSFNLPSpeakPunc 标点将被阅读出来
# SVSFIsFilename 标明第一个参数为要朗读文本所在的文件名
# SVSFIsXML 标明文本中含有XML标签,用于控制朗读的音量/频率等参数,示例
<
EMPH
>
Hello
</
EMPH
>
<
PRON
SYM
="d eh l f y"
>
Delphi
</
PRON
>
developers!
<
VOLUME
LEVEL
="70"
>
I can speak
<
PITCH
MIDDLE
="+10"
>
high
</
PITCH
>
and
<
PITCH
MIDDLE
="-10"
>
low
</
PITCH
>
.
I can speak
<
RATE
SPEED
="+10"
>
very quickly
</
RATE
>
and
<
RATE
SPEED
="-10"
>
very slowly
</
RATE
>
.
I can speak
<
VOLUME
LEVEL
="40"
>
quietly
</
VOLUME
>
and
<
VOLUME
LEVEL
="100"
>
loudly
</
VOLUME
>
.
</
VOLUME
>
# SVSFlagAsync [该方法将异步阅读,调用后将立即返回,可通过事件监视朗读结束时间,或调用 WaitUntilDone 方法,或通过 SpeakCompleteEvent 得到一个事件句柄并提供给 WaitForSingleObject]
# SVSFPurgeBeforeSpeak 所有朗读中的和待朗读的字符都将被取消
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
# SVSFNLPSpeakPunc 标点将被阅读出来
# SVSFIsFilename 标明第一个参数为要朗读文本所在的文件名
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)