首页 > 编程 > C# > 正文

在C#里面运用微软AGENT之TTS

2023-05-14 16:26:29
字体:
来源:转载
供稿:网友

微软Agent API能够提供卡通角色的显示,另外,它还可以支持语音识别,因此应用软件可以对语音ming令作出反应,而卡通角色可以通过合成的语音、录制好的音频信号或文字对ming令作出反应。

使用微软AGENT的要求

要使用该技术,必须使用组件:微软Agent核心组件、微软Agent中的卡通角色(Genie、Merlin、Robby和Peedy)、微软Speech API 4.0a运行时间库、微软语音识别引擎和Lernout和Hauspie文字-语音引擎,这些组件可到http://microsoft.com/products/msagent/downloads.htm下载。

语音技术简介

文字-语音转换指的是计算机将文字信息转换为合成语音进行输出,语音识别是指计算机能够识别出说话者所说的话,接受说话者的ming令和输入的数据。

语音识别和文字-语音转换都需要用到相关的引擎,几乎所有的语音识别引擎都是将输入的语音数据转换为与特定引擎相关的音素,然后这些音素被转换为应用程序能够使用的文字。

文本-语音转换的二种方式:

1、合成文本-语音转换

2、连续文本-语音转换

合成文本-语音转换方式:

在合成的发音方式中,引擎处理每个单词,并产生该单词的发音音素,然后这些音素被转入一个复杂的算法中,模仿人类的发声方式,生成语音。

连续文本-语音转换方式:

在连续文本-语音转换方式中,引擎对文本信息进行处理,从一个预先录制好的语音库中找出句子、单词和短语,在这种方式中,生成的语音是连续的。

语音应用程序的编程接口

微软语音应用程序编程接口在Win32(Windows 95、Windows NT)下使用了OLE组件对象模式(COM)架构,微软的Agent架构在合成语音输出中使用了微软语音应用程序编程接口(SAPI),还使用SAPI支持语音输入(语音识别SR或文本-语音转换TTS)。微软的Agent定义了让应用程序访问其服务的接口,使得应用程序能够控制角色动画、支持用户输入事件,指定输出方式。

角色窗口

在微软Agent应用程序中,卡通角色是在它们各自的窗口中被显示的,这些窗口总是出现在Z轴顺序的最顶端。用户可以通过鼠标左键拖动角色移动角色所在的窗口,角色的图像随着指针而移动。

说话汽球圈

除了语音输出外,动画角色还支持以卡通类型说话汽球圈形式的文字字幕,角色说话时,所说的文字就出现在汽球圈儿中,当说完时,汽球圈也就不见了。在互联网网页中使用微软AGENT

要在互联网网页中使用微软Agent服务,可以在网页中的或元素中使用HTML标记,指定控制的CLSID(类标识符),另外,还需要使用CODEBASE参数指定微软Agent的安装文件的位置和版本号。

我们可以使用Vbscript、Javascript和Jscript在互联网网页中使用微软Agent。

在.NET架构中使用微软AGENT

微软Agent不是以ActiveX控制DLL的形式提供的。要在.NET中使用它,可以使用由.NET框架SDK提供的AxImp.exe工具:

AxImp -->> ActiveX控制-Win窗体组合体生成器

Syntax: AxImp [/? | [[/source] OCXName]]

Aximp agentctl.dll

上面的ming令生成二个文件:AxAgentObjects.dll和AgentObjects.dll。通过使用这二个文件,我们就可以在.NET中使用Agent了。

C#中的微软Agent:

要在C#中使用微软Agent,我们必须在程序中添加二个DLL文件:AxAgentObjects.dll和AgentObjects.dll。加载动画角色的代码是相当简单的:

AxAgent.Characters.Load("Genie",(object)"C:/Windows/Msagent/chars/GENIE.acs");

Character = AxAgent.Characters["Genie"];

file://将语言设置为美国英语

Character.LanguageID = 0x409;

file://该行代码显示角色

Character.Show(null);

让角色说话的代码如下所示:

Character.Speak ("Welcome you sir VISIT www.onlinecsharpteach.netfirms.com ",null);

下面我们来看一个例子:

The Example:

using System;

using System.Drawing;

using System.WinForms;

using AgentObjects;

public class Hello: Form

{

private System.ComponentModel.Container components;

private System.WinForms.Button button2;

private System.WinForms.Button button1;

private System.WinForms.TextBox textBox1;

private AxAgentObjects.AxAgent AxAgent;

private IAgentCtlCharacterEx Character;

public Hello()

{

InitializeComponent();

}

public static void Main(string[] args)

{

Application.Run(new Hello());

}

private void InitializeComponent()

{

this.components = new System.ComponentModel.Container();

this.button1 = new System.WinForms.Button();

this.button2 = new System.WinForms.Button();

this.textBox1 = new System.WinForms.TextBox();

this.AxAgent = new AxAgentObjects.AxAgent();

AxAgent.BeginInit();

button2.Click += new System.EventHandler(button2_Click);

button1.Location = new System.Drawing.Point(88, 208);

button1.BackColor =

(System.Drawing.Color)System.Drawing.Color.FromARGB((byte)255, (byte)128, (byte)128);

button1.Size = new System.Drawing.Size(152, 32);

button1.TabIndex = 1;

button1.Text = "Load character";

button2.Location = new System.Drawing.Point(120, 240);

button2.BackColor =

(System.Drawing.Color)System.Drawing.Color.FromARGB((byte)255, (byte)128, (byte)128);

button2.Size = new System.Drawing.Size(96, 24);

button2.TabIndex = 2;

button2.Text = "SPEAK";

textBox1.Location = new System.Drawing.Point(48, 8);

textBox1.Text = " ";

textBox1.Multiline = true;

textBox1.TabIndex = 0;

textBox1.Size = new System.Drawing.Size(248, 200);

textBox1.BackColor =

(System.Drawing.Color)System.Drawing.Color.FromARGB((byte)255, (byte)128, (byte)128);

this.Text = "MSAGENT DEMO";

this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

this.WindowState = System.WinForms.FormWindowState.Maximized;

this.BackColor =

(System.Drawing.Color)System.Drawing.Color.FromARGB((byte)255, (byte)192, (byte)192);

this.ClientSize = new System.Drawing.Size(344, 301);

this.Controls.Add(button2);

this.Controls.Add(button1);

this.Controls.Add(textBox1);

this.Controls.Add(AxAgent);

button1.Click += new System.EventHandler(button1_Click);

AxAgent.EndInit();

}

protected void button2_Click(object sender, System.EventArgs e)

{

if(textBox1.Text.Length == 0)

return;

Character.Speak(textBox1.Text, null);

}

protected void button1_Click(object sender, System.EventArgs e)

{

OpenFileDialog openFileDialog = new OpenFileDialog();

openFileDialog.AddExtension = true;

openFileDialog.Filter = "Microsoft Agent Characters (*.acs)|*.acs";

openFileDialog.FilterIndex = 1 ;

openFileDialog.RestoreDirectory = true ;

if(openFileDialog.ShowDialog() != DialogResult.OK)

return;

try { AxAgent.Characters.Unload("CharacterID"); }

catch { }

AxAgent.Characters.Load("CharacterID", (object)openFileDialog.FileName);

Character = AxAgent.Characters["CharacterID"];

Character.LanguageID = 0x409;

Character.Show(null);

Character.Play ("announce");

Character.Speak ("welcome you sir",null);

} }


输出:


图2

结束语:

微软的Agent API提供了支持动画角色显示的服务,被配置为OLE Automation(COM)服务器时,它能够使多个被称为客户或客户端应用软件的应用程序同时托管或使用其动画、输入、输出服务。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表