C#语言实现Windows系统下语音播报及语音识别

C#语言实现Windows系统下语音播报及语音识别

  • 一、语音播报
  • 二、语音识别
  • 三、安装在win7系统Debug
  • 参考文档

一、语音播报

语音播报可以使用System.Speech或Microsoft.Speech库文件来实现,但在Windows XP系统下运行时发现,调用System.Speech会报错,所以这里使用Microsoft.Speech来实现语音播报。
要实现语音播报还需要安装语音库(包括运行SDK和语音库),下载链接如下:
Microsoft Speech Platform SDK 11
zh-CN HuiHui中文
示例代码如下:

using Microsoft.Speech.Synthesis;
...
private SpeechSynthesizer speechSyn = new SpeechSynthesizer();
public void PlayAsync(string word)
{
   var currentSpokenPrompt = speechSyn.GetCurrentlySpokenPrompt();
   var speechSynthesizer = new SpeechSynthesizer();
   var voices = speechSynthesizer.GetInstalledVoices(CultureInfo.CurrentCulture).Select(x => x.VoiceInfo.Name).ToList();//获取安装的语音库
   speechSyn.SelectVoice(voices[0]);
   speechSyn.Rate = -1;//设置语音播报速率,越大速度越快
   if (currentSpokenPrompt != null)
   {
      speechSyn.SpeakAsyncCancel(currentSpokenPrompt);
   }
   speechSyn.SetOutputToDefaultAudioDevice();//设置默认语音播放设备
   speechSyn.SpeakAsync(word);//语音播报word变量
}

二、语音识别

与语音播报类似,在Windows下要实现语音播报功能可以使用System.Speech与Microsoft.Speech两个dll,两者都属于微软语音API,Microsoft.Speech适用于服务器,用于识别低质量的音频,而System.Speech适用于桌面计算机,用于识别更高质量的音频,识别率较Microsoft.Speech更高,因此本文使用System.Speech进行语音识别,示例代码如下:

using System.Speech.Recognition;
...
SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("zh-CN"));//初始化中文引擎
Choices conmmonds = new Choices();
conmmonds.Add(new string[] { "红灯", "绿灯", "开灯", "关灯" });//添加词条
GrammarBuilder gBuilder = new GrammarBuilder();
gBuilder.Append(conmmonds);
Grammar grammar = new Grammar(gBuilder);
recognizer.LoadGrammar(grammar);
recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(Deal_SpeechRecongized);
recognizer.SetInputToDefaultAudioDevice();//设置默认输入设备
recognizer.RecognizeAsync(RecognizeMode.Multiple);//开始监控设备输入准备识别

static void Deal_SpeechRecongized(object sender,SpeechRecognizedEventArgs e) //处理识别结果
{
   Console.WriteLine("识别结果:"+e.Result.Text);
}

三、安装在win7系统Debug

软件发布后在Windows7系统下安装试用,爆出检索COM类工厂中CLSID为{D9F6EE60-58C9-458B-88E1-2F908FD7F87C}的组件失败,原因是出现以下错误:8007007e找不到指定的模块错误:
C#语言实现Windows系统下语音播报及语音识别_第1张图片

通过查阅资料:
1、注册使用的dll文件,打开运行窗口,输入”regsvr32 需要注册的dll路径“,提示已加载,但找不到入口点,问题未能解决。
2、可能是由于软件运行权限问题,但选中程序右键——选择管理员模式运行,依然提示该错误。
3、在项目引用中选中System.Speech,右键打开属性,将嵌入互操作类型及特定版本选为False,如下图所示:
C#语言实现Windows系统下语音播报及语音识别_第2张图片
结果程序发布安装后问题依旧。
后通过在注册表中搜索{D9F6EE60-58C9-458B-88E1-2F908FD7F87C}发现指向的是**%SystemRoot%\System32\Speech\Common\sapi.dll**
通过搜索发现,一部分Windows7系统可能由于安装系统时去除了一部分包括语音识别功能组件,导致sapi.dll文件不存在,所以就会爆出上述错误。
缺乏语音识别组件的直观表现为打开控制面板,切换为大图标,正常会看到语音识别图标,而功能缺乏的系统会找不到语音识别。
这时需要下载win7系统TTS修复软件,重新安装语音识别组件,修复软件链接如下:
Win7系统TTS修复-采用原生Win7提取绿色修复
需要注意的是即使下载修复软件进行修复后,控制面板中出现了语音识别图标,但运行语音识别软件后,但可能会爆出“无法创建所需的引擎ID”类似错误,这时需要将麦克风插入计算机中,然后重启软件,如果依然存在问题,说明修复未成功,Debug失败。

参考文档

What is the difference between System.Speech.Recognition and Microsoft.Speech.Recognition
关于.net:我找不到System.speech
Error loading Microsoft Speech SDK v11
C# 调用微软自带的语音识别
C# 语音合成
C#调用window语音识别

你可能感兴趣的:(机器视觉,离线语音识别,System.Speech,MicrosoftSpeech,语音播报,tts)