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 推荐 (www.w3.org/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 类
  
此类中的成员包括如下:
 构造函数

  名称 说明
SpeechSynthesizer Creates a new instance of SpeechSynthesizer.

页首

 方法
  名称 说明
AddLexicon
Dispose
Equals 确定指定的 Object 是否等于当前的 Object。 (继承自 Object。)
Finalize 允许 Object 在“垃圾回收”回收 Object 之前尝试释放资源并执行其他清理操作。 (继承自 Object。)
GetCurrentlySpokenPrompt
GetHashCode 用作特定类型的哈希函数。 (继承自 Object。)
GetInstalledVoices 已重载。 Returns the collection of installed TTS voices.
GetType 获取当前实例的 Type。 (继承自 Object。)
MemberwiseClone 创建当前 Object 的浅表副本。 (继承自 Object。)
Pause Pauses the synthesizer.
RemoveLexicon
Resume
SelectVoice Selects a specific voice.
SelectVoiceByHints 已重载。 Selects a voice with specific voice characteristics.
SetOutputToAudioStream
SetOutputToDefaultAudioDevice
SetOutputToNull
SetOutputToWaveFile 已重载。
SetOutputToWaveStream
Speak 已重载。 Speaks a prompt.
SpeakAsync 已重载。 Speaks asynchronously.
SpeakAsyncCancel Cancels asynchronous speaking of the specified prompt.
SpeakAsyncCancelAll Cancels asynchronous speaking of all queued prompts.
SpeakSsml Speaks the specified SSML string.
SpeakSsmlAsync Speaks the specified text string asynchronously.
ToString 返回表示当前 Object 的 String。 (继承自 Object。)

页首

 属性
  名称 说明
Rate Gets the speaking rate of the SpeechSynthesizer.
State Gets the speaking state of the SpeechSynthesizer.
Voice Gets the voice of the SpeechSynthesizer.
Volume Gets the speaking volume of the SpeechSynthesizer.

页首

 事件
  名称 说明
BookmarkReached Raised when a bookmark is reached.
PhonemeReached Raised when a phoneme is reached.
SpeakCompleted Raised when the SpeechSynthesizer completes the speaking of a prompt.
SpeakProgress
SpeakStarted Raised when the SpeechSynthesizer begins the speaking of a prompt.
StateChanged Raised when the state of the SpeechSynthesizer changes.
VisemeReached Raised when a viseme is reached.
VoiceChange Raised when the voice of the SpeechSynthesizer changes.

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

WPF--使用windows语音合成与语音识别相关推荐

  1. python合成语音_MicroPython动手做(25)——语音合成与语音识别

    6.AB按键切换语言合成项目 [mw_shl_code=python,true]#MicroPython动手做(25)--语音合成与语音识别 #AB按键切换语言合成项目 from mpython im ...

  2. WPF、Windows Forms和Silverlight区别

    转自:https://blog.csdn.net/bitfan/article/details/6128391 WPF.Windows Forms和Silverlight间的联系和区别 收到了一封学生 ...

  3. WPF(Windows Presentation Foundation)用户界面框架

    WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分.它提供了统一的编程模 ...

  4. Python人工智能第一篇:语音合成和语音识别

    Python人工智能第一篇:语音合成和语音识别 ​此篇是人工智能应用的重点,只用现成的技术不做底层算法,也是让初级程序员快速进入人工智能行业的捷径.目前市面上主流的AI技术提供公司有很多,比如百度,阿 ...

  5. 2021年1~12月语音合成和语音识别论文月报

    ​ 论文统计每月更新一次,主要跟踪语音合成和语音识别的发展状况(很多文章都是在会议后才发出,但不影响统计.统计过程难免存在疏漏,因此统计结果仅供参考.所有文章语音合成领域统计列表请访问http://y ...

  6. 2021年10月语音合成和语音识别论文月报

    ​ 论文统计每月更新一次,主要跟踪语音合成和语音识别的发展状况(很多文章都是在会议后才发出,但不影响统计.统计过程难免存在疏漏,因此统计结果仅供参考.所有文章语音合成领域统计列表请访问http://y ...

  7. 2021年1~11月语音合成和语音识别论文月报

    论文统计每月更新一次,主要跟踪语音合成和语音识别的发展状况(很多文章都是在会议后才发出,但不影响统计.统计过程难免存在疏漏,因此统计结果仅供参考.所有文章语音合成领域统计列表请访问http://yql ...

  8. 语音合成和语音识别资料查询说明

    文章转载请标明出处:微信公众号 低调奋进 个人网站http://yqli.tech/本来整理语音合成相关的文章.数据以及相关的开源工具​等等.现在,我对资料进行整理,添加了语音识别模块,在这里分享给大 ...

  9. Windows下编译语音识别引擎Wenet

    Windows下编译语音识别引擎Wenet 一.Wenet简介 二.Wenet首次编译过程 2.1下载第三方库源码 2.2替换软链接 2.3下载gRPC的third_party 三.Wenet第二次编 ...

最新文章

  1. python3数据库表关联_Django中数据库操作|python3教程|python入门|python教程
  2. InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析
  3. 杂项:TMT(数字媒体产业)
  4. readonly 与 const 区别
  5. 重构图书馆惊魂夜(理解模型,关注设计)
  6. 还在迷茫于前端如何入门和进阶?万字指南让你不再迷茫!
  7. 【3】数据筛选3 - BeautifulSoup4
  8. linux的网卡部分
  9. linux live cd 定制,如何创建定制的Ubuntu Live CD或者USB的简易方式
  10. linux下无法执行PHP命令,错误 php: command not found
  11. 【leetcode】排序题(python)
  12. 唐诗三百首加密软件如何使用_绿盾加密软件如何设置邮件白名单
  13. warning: Pulling without specifying how to reconcile divergent branches is discouraged. You can sque
  14. 【目标检测】YOLOV2详解
  15. 如何成为一名卓越的程序员
  16. PHP 对接阿里云短信接口
  17. (专升本)Excel(自动填充数据)
  18. 迪文屏幕的学习和开发
  19. 健身为什么要吃肌酸!肌酸四大作用
  20. 职称计算机 2007 还是2003,职称计算机考试, PPT2003和2007 区别大吗?哪个版本更容易。...

热门文章

  1. 论文导读 | 基于注意力机制对齐增强预训练语言模型
  2. Ubuntu下的docker搭建及基础使用
  3. 软件测试计划模板(增强版)
  4. 后疫情时代,空气净化行业如何将危机转为市场新动能?
  5. 段落标签p与换行br标签的区别
  6. Neutron 理解 (6): Neutron 是怎么实现虚拟三层网络的 [How Neutron implements virtual L3 network]
  7. SQL Server 2008R2 18456错误解决方案
  8. 什么叫锭材综合成材率?如何计算?
  9. 警察叔叔顺着网线是怎么找到你的?计算机网络(四)之网络层未完待续
  10. Linux系统常用命令汇总(含例图)