Windows Phone 8 app提供了新的API可以使用语音输入和输出。
对用户进行通信:语音合成 API
计算机生成的语音输出分别调用文本到语音 (TTS) 或语音合成
语音合成的简单示例代码示例:
- // 创建语音识别
- private SpeechSynthesizer speechOutput =
- new SpeechSynthesizer();
- private async void GetNewMemoByVoice()
- {
- await speechOutput.SpeakTextAsync("你们尹成大哥是微软全球最有价值专家");//语音播放
- }
当用户点击麦克风按钮时,就会听到语音播放。在下面的部分我会扩展此示例通过添加代码,以接受用户的输入使用语音识别。
TTS 功能先进的方案严重依赖语音输出的应用程序可能使用的情况下,需要更改音量、 音调或在致辞中的讲率输出。有两种方法:SpeakSsmlAsync 和 SpeakSsmlFromUriAsync。
语音输入:语音识别 API
语音识别应用程序中的使用案例两大类是文本输入和命令和控制。在第一个使用案例,文本输入的 app 只是捕获用户的话语作为文本 ; 这是有用的当用户可以说几乎所有东西,如"新"备注示例代码的功能。
在第二个使用案例、 指挥和控制,用户操作 app 口语话语而不是通过点击按钮或跨手机的脸上滑动手指。此使用案例是无手驾驶或烹饪等的方案中尤其有用。
语音识别的简单示例关于语音识别应用程序中的功能的详细信息之前,让我们看看最简单的例子:文本输入几行代码。
图 1 显示 GetNewMemoByVoice 方法显示较早前,但添加初始化一个识别器对象,该对象的行数与启动识别会话和处理结果。
图 1 初始化一个识别器对象、 启动识别会话及处理结果
- private SpeechRecognizerUI speechInput =
- new SpeechRecognizerUI();
- // 设置识别对象
- speechInput.Settings.ExampleText =
- "语音对象: \"百度一下尹成微软\"";
- speechInput.Settings.ListenText = "请领导指示";
- private async void GetNewMemoByVoice()
- {
- await speechOutput.SpeakTextAsync("请领导指示");
- var recoResult =
- await speechInput.RecognizeWithUIAsync();
- // 设置语音识别语法
- Memo_TB.Text =
- recoResult.RecognitionResult.Text; // 显示识别结果处理之
- }
当然,在实际代码中就永远不会这样,一样简单,如果你看魔术备注示例中,您将看到一个 try/catch 块,并检查成功识别。
如果您尝试此示例应用程序中通过点击麦克风图标,您会发现你说的话,您的备忘录后,出现"思维"屏幕,其次是 UI,确认后的结果在备注文本框中插入。幕后的很多事情上,最重要的是要识别语音的远程服务器上的"语法"的使用。语法是基本上是一套规则,指定哪些词汇条目 ("字"),引擎需要认识到并以何种顺序。下一节将探讨语音识别 API 和与识别语法如何使用它。
语音识别 API 的概述我进入语音识别编码的细节之前,让我们看高级别看 API 和他们的角色中的类别。图 2 显示 API 的基本布局。您会注意到的第一件是两个框有语音在名称中的识别器。
图 2 语音识别 API 设计概述
如果您的应用程序不需要显示 UI 与语音识别,或者如果您想要显示您自己的自定义 UI,您应实例化示的左侧中部的 SpeechRecognizer 类的副本图 2。此对象看作是此 API 中的语音识别的基本业务单位。这是该应用程序中添加了任何语法它需要。初始化后,调用 RecognizeAsync 来做实际的承认。由于 SpeechRecognizer 实现 IAsyncOperation <SpeechRecognitionResult>,状态和结果对象是已完成回调函数中可用。因此,没有任何单独的事件,识别完成或拒绝与其他托管语音的 Api。
顾名思义,*的 SpeechRecognizerUI 类提供了语音识别的默认 GUI,与手机的全球语音用户界面反馈、 消歧和确认是一致的。与全球语音用户界面保持兼容性,并简化编码,大多数应用程序应使用此类,而不是前面提到的非 UI 类。当你实例化一个 SpeechRecognizerUI 对象时,它附带的两个重要的对象:设置对象,设置要显示给用户 ; 的 UI 文本的位置 和一个 SpeechRecognizer 对象,使您可以指定语法,如以下各节中所述。初始化后,您应该调用父 SpeechRecognizerUI 对象要启动识别会话的 RecognizeWithUIAsync。如果您在子 SpeechRecognizer 对象上使用 RecognizeAsync,它将识别好像 SpeechRecognizer 对象正在使用的独立,就没有 UI。此后,术语 SpeechRecognizer 和承认异步应理解为泛型对象和方法有和无的 UI,酌情参考文件。
使用语音识别步骤有了 Windows Phone 8 应用程序中使用语音识别的四个基本步骤:
- 创建要在 (不需要如果使用预定义的语法) 的识别过程中使用的语法。
- 通过设置属性,并根据需要添加语法初始化的 SpeechRecognizer 对象。
- 通过调用语音启动识别会话Recognizer.RecognizeAsync 或 SpeechRecognizer-UI。RecognizeWithUIAsync。
- 进程识别结果和采取适当的行动。
图 1 显示了所有这些步骤除号1、 创建语法。预定义的听写语法,是默认语法,因此,不需要创建或将其添加到集合中的语法。
很大程度上实现这些步骤的代码取决于在语音识别中使用的语法的类型。下一节中介绍的概念和使用的 Windows Phone 8 的语音识别语法。
语音识别语法简介
现代语音识别引擎所有使用语法来抑制的短语的识别引擎必须通过该搜索 (以下简称"搜索空间") 的一组以查找到用户的话语,匹配,从而提高识别的准确性。语法规则可能允许短语的识别号码的列表作为简单或复杂作为一般会话文本。
在 Windows Phone 8 语音 API,您可以指定语法以三种方式,如以下各节中所述。每种情况,您将添加到语法上的 SpeechRecognizer 对象的集合语法。
简单列表语法最简单的方法来指定自定义的语法,为应用程序提供的识别器应该听简单的字符串数组中的所有短语的列表。这些列表语法是由设备上语音识别引擎处理的。创建和添加列表语法的代码可以简单的按钮名称,承认对静态列表如下所示:
- commandReco.Recognizer.Grammars.AddGrammarFromList(
- "mainPageCommands", new string[] { "尹成", "微软", "专家" });
魔术备注示例没有一点更复杂的工具:它建立的短语列表通过查找页面上的所有按钮控件的内容属性并向字符串列表中添加的内容的文本。请参阅 MainPage.xaml.cs 中的 InitCommandGrammar 方法,获得详细信息。
要处理使用列表语法识别会话的结果,你如果使用的版本没有 UI,读取 SpeechRecognitionUIResult (或 SpeechRecognitionResult) 上的文本属性。你可以这样做,例如,在 switch 语句,如中所示图 3。
图 3 加工识别会话的结果
- switch (result.RecognitionResult.Text.ToLower())
- {
- case "cancel":
- break;
- case "save":
- break;
- case "quit":
- break;
- default:
- break;
- }
更详细的示例是在 MainPage.xaml.cs 中的 CommandCompleted 回调中找到的。
预定义的语法上 Windows Phone 8 语音 API 提供了两个预定义的语法:听写和粘性。听写也被称为短消息听写和雇用作为在内置短信应用程序中使用相同的语法。相比之下,粘性被优化,可用于在线搜索的短语。内置的查找/搜索命令将使用相同的粘性语法。
这两个预定义的语法的搜索空间是巨大的需要通过使用 Microsoft 语音的 Web 服务的远程语音识别可用的处理能力。一般这些语法不适合于指挥和控制由于识的可能性和范围广泛的可能的结果。
预定义语法的一个主要优点是它们很容易在应用程序中实现。例如,若要使用的粘性语法,而不是默认听写语法中的图 1,您只需添加此线前对 RecognizeWithUIAsync 的调用:
- speechInput.Recognizer.Grammars.AddGrammarFromPredefinedType(
- "webSearch", SpeechPredefinedGrammar.WebSearch);
处理从预定义的语法识别结果通过访问结果文本属性,如中所示图 1。
若要添加自力更生团体语法,您引用的 URI 的语法文件在应用程序的安装路径,如下:
- commandReco.Recognizer.Grammars.AddGrammarFromUri(
- "srgsCommands", new Uri("ms-appx:///ViewMemos.grxml"));
自力更生团体语法的一个主要优点是它们允许您指定要简化处理广泛的用户响应,而无需访问的公认的话语 (这是与往常一样上的 RecognitionResult.Text 属性,可用) 的语义值。
自力更生团体语义是对象 (这在实践中往往是字符串) 您赋给变量中使用 <tag> 你自力更生团体语法 元素和 ECMAScript 的一个子集。他们有两个直接使用识别的文本优点:
- 简化的处理:不解析已识别的文本,可能需要在多个窗体的含义相同的情况下,您可以确定用户的意图。例如,使用语义,您可以映射意味着肯定的所有话语 — —"是,""啊,""肯定,""OK"或"雅"— — 为单个的语义值"yes"。
- 本地化的易用性:您可以使用相同的代码隐藏进程中的任何受支持语言的话语,如果您跨所有语言使用一套统一的语义值。
为了说明这些概念,魔术备注示例使用一个简单的文法 ViewMemos.grxml 控制的 ViewMemos.xaml 页 ; 这与语义标记的语法文件的摘录所示图 4。在 ViewMemos.xaml.cs 中的函数 micImage_Tap (摘录在图 5) 演示了如何使用映射到的操作的用户的话语中的语义值。
图 4 从 ViewMemos.grxml SRGS 语法的摘录
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE grammar PUBLIC "-//W3C//DTD GRAMMAR 1.0//EN" "http://www.w3.org/TR/speech-grammar/grammar.dtd"> <!-- the default grammar language is US English --> <grammar xmlns="http://www.w3.org/2001/06/grammar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/06/grammar http://www.w3.org/TR/speech-grammar/grammar.xsd" xml:lang="en-US" version="1.0" tag-format="semantics/1.0" root="buttons"> <rule id="buttons" scope="public"> <one-of> <!--The 'process' semantic can be one of 'clear', 'save', 'new', or 'select'--> <item> <!--Reference to the internal rule "scope" below--> Clear <ruleref uri="#scope" type="application/srgs+xml"/> <tag>out.process="clear";out.
num = rules.latest();</tag> </item> <item> Save <item repeat="0-1">changes</item> <tag>out.process="save";</tag> </item> <item> Enter new <tag>out.process="new";</tag> </item> <item> Select <item repeat="0-1">memo</item> <!-- Optional words --> <item repeat="0-1">number</item> <!--Reference to the internal rule "number" below --> <ruleref uri="#number" type="application/srgs+xml"/> <tag>out.process="select";out.
num = rules.latest();</tag> </item> </one-of> </rule> <rule id="scope" scope="private"> <one-of> <!-- Can be "all", "selected" or a number from the 'number' rule --> <item> all <tag>out.scope="all";</tag> </item> <item> selected <tag>out.scope="selected";</tag> </item> <item> <item repeat="0-1">memo</item> <!-- Optional words --> <item repeat="0-1">number</item> <ruleref uri="#number" type="application/srgs+xml"/> </item> </one-of> </rule> <rule id="number" scope="public"> <item> 1 </item> <!-- See ViewMemos.grxml for the remainder of the items in this block --> </rule> </grammar>
图 5 处理使用语义属性识别结果
- private async void micImage_Tap(object sender, GestureEventArgs e)
- {
- var commandResult = await commandReco.RecognizeWithUIAsync();
- if (commandResult.ResultStatus ==
- SpeechRecognitionUIStatus.Succeeded)
- {
- var commandSemantics = commandResult.RecognitionResult.Semantics;
- SemanticProperty process = null;
- if (commandSemantics.TryGetValue("process", out process))
- {
- // In general a seman
- switch (process.Value as string)
- {
- case "select":
- break;
- case "clear":
- break;
- case "save":
- break;
- case "new":
- break;
- default:
- break;
- }
- }
- }
- }
通过导航到 ViewMemos 页面,并点击麦克风图标,您可以尝试此魔术备注示例中的语法。ViewMemos.xaml.cs 文件具有代码隐藏,包括根据代码 # 定义您可以激活的部分 (使用 # 定义 SemanticsDebug) 来显示和调试上识别结果返回的语义值。
识别器在同一对象上使用多个语法一个自然的问题要问此时是 SpeechRecognizer 对象上是否可以使用多个语法。答案是肯定的有一些限制条件。这里是一些准则和编码技术为使用多个语法:
- 如果您添加预定义的语法,您不能添加任何其他语法。此外,您不能禁用某个预定义的语法 ; 它是一个和只有其生存期内关联到识别器对象的语法。
-
您可以为单个识别器对象添加多个自定义语法 (列表语法和自力更生团体语法) 和启用或禁用语法根据需要为您的应用程序中的不同情形:
- 若要访问某个特定的语法,请使用语法名称 (字符串参数传递给 AddGrammar 方法调用中) 作为语法集合上的某个键。
-
若要启用或禁用某个特定的语法,设置其启用布尔值为 true 或 false。例如,以下语句将禁用命名为"按钮"的语法:
myRecognizer.Grammars["按钮"]。启用 = false ;
- 当您调用 AddGrammar 方法中的任何时,语法放在队列中等待处理,但并不是分析或加载。语法是编译和加载或可选调用预紧上第一次调用 RecognizeAsyncGrammarsAsync。实际使用可以减少从 RecognizeAsync 返回结果的滞后时间,并因此为大多数使用情况下,建议之前调用这后一种方法。
语音功能的 Windows Phone 8 代表,当中所有的智能手机产品,语音特色这两个设备上和远程识别服务的第一功能齐全的开发者平台上的应用程序。使用声音命令和应用程序可以成功实现siri的功能。
代码下载
http://download.csdn.net/detail/yincheng01/4991405