SAPI_5.1_语音合成_和_语音识别_[C#]
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SAPI 5.1 语音合成和语音识别[C#]
翻译源:Speech Synthesis & Speech Recognition Using SAPI 5.1 By Brian Long (/)
翻译说明:并不全文翻译,只翻译些对本人有用的部分,原版代码为Delphi,译文用C# .NET Framework 2.0
实现,有些有关Delphi的解释略去,另添加一些C#使用SAPI的个人理解注释,不定期更新
[1]语音合成
在简单层面上实现语音合成,只需要创建SpVoiceClass对象并调用其中的Speak方法,最简单的实现如下[读出文本框中的文字]
private void button1_Click(object sender, EventArgs e)
{
SpVoiceClass svc = new SpVoiceClass();
svc.Speak(textBox1.Text,SpeechVoiceSpeakFlags.SVSFDefault);
}...
[Tachikoma注:此处并未提到编程时添加对SAPI的引用,对COM组件的引用较简单,请自行处理]
对Speak方法的参数作如下说明:
0]对Speak方法的调用默认情况下将会是同步的,也就是说在朗读完指定文字之前不会返回值[同步/异步状态可用第二参数调整]
0]Speak方法返回一个流标号,当存在多个异步声音流时可通过标号识别,标号可作为参数提供给某些函数
1]第一个参数为要阅读的文字
2]第二参数为可调节的一些参数[Flags],可用"或"运算符将其连接同时使用
# SVSFDefault [该方法将同步阅读][具体见说明0]]
# SVSFlagAsync [该方法将异步阅读,调用后将立即返回,可通过事件监视朗读结束时间,或调用WaitUntilDone 方法,或通过SpeakCompleteEvent 得到一个事件句柄并提供给WaitForSingleObject]
# SVSFPurgeBeforeSpeak 所有朗读中的和待朗读的字符都将被取消
# SVSFNLPSpeakPunc 标点将被阅读出来
# SVSFIsFilename 标明第一个参数为要朗读文本所在的文件名
# SVSFIsXML 标明文本中含有XML标签,用于控制朗读的音量\频率等参数,示例
I can speak MIDDLE="-10">low
I can speak SPEED="-10">very slowly
I can speak LEVEL="100">loudly
Go to source web page: SAPI 5.1 语音合成和语音识别[C#][1] - Tachikoma的乱七八糟- 博客园
列举语音[Voices]
翻译说明:由于这个部分涉及到了Delphi编写的简单程序,将其换成C#实现,有些不必要的说
明不按照原文翻译,基本上是按照原文复述
本节目标:调整朗读语音,调整语音频率和音量
代码环境设定:两个TrackBar代表语音频率和音量,trackBarRate,trackBarVolume,一个ComboBox选择朗读语音,comboBoxLanguage
PS:朗读语音,可能会不明白朗读语音的意思,就是在控制面板-语音-文字语音转换-"语音选择"中的项,比如Microsoft Mary,Microsoft Sam等等
SpVoiceClass类中GetVoices函数原型如下
public virtual ISpeechObjectTokens GetVoices(string RequiredAttributes, string OptionalAttributes);
该函数返回一个ISpeechObjectToken集合ISpeechObjectTokens,ISpeechObjectToken描述了每个朗读语音
函数两个参数均为对所得到集合的限制,第二参数为对第一参数的补充,比如使用
GetVoices('Gender = male', '')
就会得到男声集合
对于这些参数,一般有如下参数:Name,Vendor,Age,Gender,Language[有没有更多的不
知道,翻过SAPI的帮助也没找到相关说明]
调用以下语句作以说明
ISpeechObjectToken sot = svc.GetVoices(String.Empty, String.Empty).Item(0);
System.Diagnostics.Trace.WriteLine(sot.GetAttribute("Nam e"));
System.Diagnostics.Trace.WriteLine(sot.GetAttribute("Ven
dor"));
System.Diagnostics.Trace.WriteLine(sot.GetAttribute("Age "));
System.Diagnostics.Trace.WriteLine(sot.GetAttribute("Gen der"));
System.Diagnostics.Trace.WriteLine(sot.GetAttribute("Lan guage"));
输出中会显示
Microsoft Mary
Microsoft
Adult
Female
409;9
其中409;9代表该语音支持409[英语]和9[...]语言
[这里原文提到了申请ISpeechObjectToken实例的垃圾处理的问题,由于C#的垃圾处理机制,不翻译了]
必要函数介绍完了,下面是完成目标的代码,很简单,一些没说到的写在了注释里
SpVoiceClass svc = new SpVoiceClass();
private void button1_Click(object sender, EventArgs e) {
svc.Volume = trackBarVolume.Value;
svc.Rate = trackBarRate.Value;
svc.Voice = svc.GetVoices(string.Empty,
string.Empty).Item(comboBoxLanguage.SelectedIndex);
svc.Speak(textBox1.Text,
SpeechVoiceSpeakFlags.SVSFDefault);
}
private void Form1_Shown(object sender, EventArgs e)
{
trackBarRate.Minimum = -10;
trackBarRate.Maximum = 10;
trackBarRate.Value = svc.Rate;//Rate取值 -10 10
trackBarVolume.Maximum = 100;
trackBarVolume.Value = svc.Volume;//Volume取值 0100
ISpeechObjectTokens sots = svc.GetVoices(String.Empty,