700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > WPF--使用windows语音合成与语音识别

WPF--使用windows语音合成与语音识别

时间:2021-01-01 09:15:22

相关推荐

WPF--使用windows语音合成与语音识别

C# 语音开发

近些年来,Microsoft 越来越注重将语音技术投入于主流使用,从而促生了一些产品,例如,Speech Server(用于实现启用语音的电话系统)和 Voice Command(使用户能够使用语音命令控制 Windows Mobile® 设备)。因此可想而知,Microsoft 的语音小组在 Windows Vista® 的开发中一定是始终忙个不停。将强大的语音技术与强大的 API 联合起来,这一策略始终是正确的,直到 Windows Vista 都是如此。

System.Speech.Synthesis

让我们看一下关于如何从托管应用程序使用语音合成的示例。作为最典型的一个 UI 输出示例,我将从只说出“Hello, world”的应用程序开始,如下代码所示。

using System;

using System.Speech.Synthesis;

namespace TTS_Console_Sample_1

{

class Program

{

static void Main(string[] args)

{

SpeechSynthesizer synth = new SpeechSynthesizer();

synth.SpeakText("Hello, world!");

}

}

}

该示例是一个明显的控制台应用程序,是最近使用 Visual C#® 创建的,其中添加了三行代码。所添加的第一行只引入 System.Speech.Synthesis 命名空间。第二行声明并实例化 SpeechSynthesizer 的实例,它准确表示了其名称的含意:语音合成器。所添加的第三行是对 SpeakText 的调用。这是调用合成器所需的全部。

默认情况下,SpeechSynthesizer 类使用 Speech 控件面板中默认推荐的合成器。但是它可以使用任何与 SAPI DDI 兼容的合成器。

下一个示例:

SpeechSynthesizer synth = new SpeechSynthesizer();

synth.SelectVoice("Microsoft Sam");

synth.SpeakText("I'm Sam.");

synth.SpeakText("You may have heard me speaking to you in Windows XP.");

synth.SpeakText("Anna will make me redundant.");

synth.SelectVoice("Microsoft Anna");

synth.SpeakText("I am the new voice in Windows.");

synth.SpeakText("Sam belongs to a previous generation.");

synth.SpeakText("I sound great.");

synth.SelectVoice("Microsoft Lili");

synth.SpeakText("我是在北京被研究开发的 我使用了专业播音员的声音。每

个听到过我说话的人都说我是中文语音合成中最棒的!"); // Requires MS Mincho and SimSun fonts to view

/* "I was developed in Beijing, using recordings of a professional news reader.

Everybody who hears me talk says that I am the best synthesized Chinese

voice they have ever heard!" */

显示如何进行此操作,该操作使用 Windows 2000 和 Windows XP 的旧式 Sam 语音,以及新 Anna 和 Windows Vista 的 Microsoft® Lili 语音。(请注意,该示例以及其他所有 System.Speech.Synthesis 示例都使用和第一个示例相同的代码框架,并替换 Main 的主体。)该示例显示了使用所需合成器名称的 SelectVoice 方法的三个实例。它还演示了 Windows Vista Chinese 合成器(即 Lili)的用法。另外,Lili 也可以很好地说英语。

在这两个示例中,我使用合成 API 的方式非常类似于我使用控制台 API 的方式:应用程序只发送字符,然后这些字符立即串联呈现。但是对于更复杂的输出,更容易将合成看作文档呈现的等价物,其中合成器的输入是一个文档,该文档不仅包含要呈现的内容,还包括要在该内容的特定点应用的不同效果和设置。

SpeechSynthesizer 类可以使用名为语音合成标记语言(Speech Synthesis Markup Language,SSML)的 XML 文档格式,这非常类似于描述要应用到 Web 页特定内容片段中的呈现风格和结构的 XHTML 文档。W3C SSML 推荐 (/TR/speech-synthesis) 非常具有可读性,因此在本文中,我不打算深入描述SSML。可以肯定地说,应用程序可以简单地将 SSML 文档直接加载到合成器并使之呈现出来。以下是一个加载并呈现 SSML 文件的示例:

SpeechSynthesizer synth = new SpeechSynthesizer();

PromptBuilder savedPrompt = new PromptBuilder();

savedPrompt.AppendSsml("c:\\prompt.ssml");

synth.Speak(SavedPrompt);

编写 SSML 文件的另一个简便方法是在 System.Speech.Synthesis 中使用 PromptBuilder 类。PromptBuilder 几乎可以表示 SSML 文档可以表示的任何内容,而且更容易使用。用于创建复杂合成的通用模型首先使用 PromptBuilder 以您希望的方式生成提示符,然后使用合成器的 Speak 或 SpeakAsync 方法呈现它。

下列代码:

//This prompt is quite complicated

//So I'm going to build it first, and then render it.

PromptBuilder myPrompt = new PromptBuilder();

//Start the main speaking style

PromptStyle mainStyle = new PromptStyle();

mainStyle.Rate = PromptRate.Medium;

mainStyle.Volume = PromptVolume.Loud;

myPrompt.StartStyle(MainStyle);

//Alert the listener

myPrompt.AppendAudio(new Uri(

"file://c:\\windows\\media\\notify.wav"), "Attention!");

myPrompt.AppendText("Here are some important messages.");

//Here's the first important message

myPrompt.AppendTextWithPronunciation("WinFX", "wɪnɛfɛks");

myPrompt.AppendText("is a great platform.");

//And the second one

myPrompt.AppendTextWithHint("ASP", SayAs.Acronym);

myPrompt.AppendText(

"is an acronym for Active Server Pages. Whereas an ASP is a snake.");

myPrompt.AppendBreak();

//Let's emphasise how important these messages are

PromptStyle interimStyle = new PromptStyle();

interimStyle.Emphasis = PromptEmphasis.Strong;

myPrompt.StartStyle(interimStyle);

myPrompt.AppendText("Please remember these two things.");

myPrompt.EndStyle();

//Then we can revert to the main speaking style

myPrompt.AppendBreak();

myPrompt.AppendText("Thank you");

myPrompt.EndStyle();

//Now let's get the synthesizer to render this message

SpeechSynthesizer synth = new SpeechSynthesizer();

synth.Speak(myPrompt);

阐释 PromptBuilder 的大量强大功能。需要指出的首要一点是,它生成一个带有分层结构的文档。该示例使用的说话风格嵌套在另一个中。在该文档的开头,我使用了将在整个文档中使用的风格。然后在文档进行到一半的时候,我使用了另一种风格以示重点。当我结束这种风格时,文档又自动转换为以前的风格。

该示例也显示了其他很多方便的功能。AppendAudio 功能使 WAV 文件与输出结合,如果未找到 WAV 文件,可以使用一个等效文本文件。AppendTextWithPronunciation 功能允许您指定单词的正确发音。通过联合使用用于推导出未知单词发音的词典和算法,语音合成引擎已经知道如何对一种语言中的多数常用单词进行发音。但这并不对所有单词都奏效,例如,某些专用术语或商标名称。例如,“WinFX”将可能发音为“winfeks”。相反,我使用 International Phonetic Alphabet 将“WinFX”描述为“w?n?f?ks”,其中字母“?”是 Unicode 字符 0x026A(“i”的发音同“fish”中的“i”,不同于“five”中的“i”),而字母“?”是 Unicode character 0x025B(通用美语中“e”的发音同“bed”中的“e”)。

通常,合成引擎可以区分缩写和大写单词。但偶尔有些时候,您会发现一个缩写词由引擎的试探法错误地演绎为一个单词。因此,您可以使用 AppendTextWithHint 功能为缩写词作标记。对于 PromptBuilder 而言有很多细微差别。我的示例虽然不太全面,但非常具有说明性。

将内容规范从运行时呈现中分离出来的另一个好处是,之后您可以随意将应用程序从它呈现的特定内容分离出来。您可以利用 PromptBuilder 使其提示符作为 SSML 由该应用程序的另一部分或一个完全不同的应用程序加载。以下代码使用 PromptBuilder 写入一个 SSML 文件:

using(StreamWriter promptWriter = new StreamWriter("c:\\prompt.ssml"))

{

promptWriter.Write(myPrompt.ToXml());

}

分离内容片段的另一个方法是将整个提示符呈现给一个音频文件以用于稍后重播:

SpeechSynthesizer synth = new SpeechSynthesizer();

synth.SetOutputToWaveFile("c:\\message.wav");

synth.Speak(myPrompt);

synth.SetOutputToNull();

使用 SSML 标记还是使用 PromptBuilder 类,可能取决于您偏好的风格。您应该使用自己觉得更舒服的那个。

对于 SSML 和 PromptBuilder,需要注意的最后一点是,每个合成器的功能将稍有不同。因此,对于使用这两种机制中的任一种请求的特定行为,如果该引擎有能力采取该行为,则应该将这些行为认为是该引擎将采用的建议性请求

windows vista 和windows 7语音识别功能相关简介:

相信用过windows vista 和windows 7的人都知道或者了解过里面的语音识别功能。它可以使用声音命令来控制电脑,实现更方便的人机互动,还可以通过声音控制窗口、启动程序、在窗口之间切换,使用菜单和单击按钮等功能。利用声音让计算机听写文本,只要大声的朗读字词,就可以创建文本文档,也可在文档中进行修改或更正错误。但此项技术并不是很成熟,存在文本识别率不高,许多非微软的程序不支持Windows的语音命令等缺陷。

那么在我们的WPF程序中,该如何利用此功能呢?(目前使用改技术意义不大,但是在将来,我相信会有很大的发展,在此,而且是新手,我只是以玩的心态做这些,希望大家不要笑 :)

在语音合成和语音识别上,微软提供 Speech SDK 开发包,那么在我们的WPF程序中,我们怎么使用呢?

其实很简单,我们主要用到了

.NET Framework 类库中

在System.Speech.Synthesis命名空间下

程序集:System.Speech(在 System.Speech.dll 中) 的

SpeechSynthesizer 类此类中的成员包括如下: 构造函数 页首方法 页首属性 页首事件 了解了以上相关知识,我们就开始来做今天的小程序啦,实现一个能根据你提问:“现在几点了?”,然后 计算机将获取当前时间,在界面上显示时间的同时,以语音报时。。。。实在是有点简单,嘿嘿。。 首先新建一个WPF Application ; 然后在通过设计视窗在界面上拖拽两个Lable控件和一个Button控件,结果就变成下面这个样子了:怎么Button不见了?嘿嘿,被我给隐藏了,把Opcity属性设置了0,我们使用这个Button主要是为了让它获得焦点, 并且触发它的Click事件,但是,我们现在是懒得动手去按了,话说我们今天要说说话去命令它。然后触发这个事件,得到当前时间,并做出相关反应。 整个过程就这样简单。所以,为了产生神秘感,就把Button给隐藏了 :) 说了这么多,接下来看代码吧: MainWindow.xaml

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。