第一范文网 - 专业文章范例文档资料分享平台

SAPI 5.1 语音合成 和 语音识别[C#]

来源:用户分享 时间:2025/5/19 14:36:25 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

SAPI 5.1 语音合成 和 语音识别 [C#]

翻译源:Speech Synthesis & Speech Recognition Using SAPI 5.1 By Brian Long (http://www.blong.com/)

翻译说明:并不全文翻译,只翻译些对本人有用的部分,原版代码为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标签,用于控制朗读的音量\\频率等参数,示例

Hello

developers!

I can speak

I can speak

I can speak .

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(\e\

System.Diagnostics.Trace.WriteLine(sot.GetAttribute(\

dor\

System.Diagnostics.Trace.WriteLine(sot.GetAttribute(\\

System.Diagnostics.Trace.WriteLine(sot.GetAttribute(\der\

System.Diagnostics.Trace.WriteLine(sot.GetAttribute(\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 trackBarVolume.Maximum = 100;

trackBarVolume.Value = svc.Volume;//Volume取值 0

100 10

ISpeechObjectTokens sots = svc.GetVoices(String.Empty,

String.Empty);

int i = 0;

foreach (ISpeechObjectToken sot in sots)

{

String str = sot.GetDescription(0);//得到语音名称|相当于sot.GetAttribute(\

comboBoxLanguage.Items.Add(str);

if (str == svc.Voice.GetDescription(0)) comboBoxLanguage.SelectedIndex = i; i++; } }

Go to source web page: SAPI 5.1 语音合成 和 语音识别 [C#][2] - Tachikoma的乱七八糟 - 博客园

翻译说明:这篇译原文五个部分Making Your Computer Talk,Voice Events,Animating Speech, Keeping Track Of Spoken Text,Speaking Dialogs

只是说翻译范围覆盖这五个部分的范围,其中有一些例子不重写了,因为我暂时用不上,有一些乱七八糟的话不译,怕出错,毕竟对其理解不是很深,只挑一些重要的进行复述

Making Your Computer Talk 部分

提及了如何让朗读暂停和进行,只提取其中用到的几个函数,基本上原型一些出来就知道怎么回事,不详细翻译了 类SpVoiceClass

public virtual void Pause(); //暂停函数 public virtual void Resume();//恢复函数

public virtual int Skip(string Type, int NumItems);//跳过朗读函数

基本一看名称就知道了,只对Skip的参数做一个说明,Type参数代表要跳过的Item的类型[如 sentence 按句子跳过...],但注意这个参数目前只能是\后面的NumItems 是指要跳过多少个句子

Voice Events 事件部分

事件的使用和正常的使用没什么大的区别,唯一需要注意的是 类SpVoiceClass

public virtual SpeechVoiceEvents EventInterests 这个属性,运行原理如下:

朗读开始后,类会检测EventInterests属性里所有事件,并触发事件,没有包括在内的事件不会触发

SpeechVoiceEvents枚举变量如下 Enum SpeechVoiceEvents SVEStartInputStream = 2 SVEEndInputStream = 4 SVEVoiceChange = 8

{ get; set; }

搜索更多关于: SAPI 5.1 语音合成 和 语音识别[C#] 的文档
SAPI 5.1 语音合成 和 语音识别[C#].doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c9lds93044s2xc786bdia_1.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top