首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

用C#能不能做语音识别程序?解决方案

2012-01-13 
用C#能不能做语音识别程序?如题:C#能不能做到语音识别?就是某个人说句话,根据这人说话的特征来判断他的身

用C#能不能做语音识别程序?
如题:C#能不能做到语音识别?
就是某个人说句话,根据这人说话的特征来判断他的身份?
C#能做到吗?要哪些技术?

[解决办法]
在.net中,对英文语音有较好的支持,但是对中文语音的支持还没有加入进来,我们要想实现中文发音或中文语音识别,必需先安装微软的Speech Application SDK(SASDK),它的最新版本是 SAPI 5.1 他能够识别中、日、英三种语言,你可以在这里下载:http://www.microsoft.com/speech/download/sdk51/,需要安装这两个文件Speech SDK 5.1和5.1 Language Pack,其中5.1 Language Pack可以选择安装支持的语言。 

   安装好以后,我们就可以开始进行语音程序的开发了,当然,在这之前我们需要把SAPI.dll通过如下图所示添加到引用中 



   下面我们设计一个能够朗读中英文混合语言的类: 

   我们将用单例模式实现该类,类的代码如下,我们将详细解释: 

public class Speach 

  private static Speach _Instance = null ; 
  private SpeechLib.SpVoiceClass voice =null; 
  private Speach() 
  { 
   BuildSpeach() ; 
  } 

public static Speach instance() 

  if (_Instance == null) 
   _Instance = new Speach() ; 
   return _Instance ; 


private void SetChinaVoice() 

  voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(0) ; 


private void SetEnglishVoice() 

  voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(1) ; 


private void SpeakChina(string strSpeak) 

  SetChinaVoice() ; 
  Speak(strSpeak) ; 


private void SpeakEnglishi(string strSpeak) 

  SetEnglishVoice() ; 
  Speak(strSpeak) ; 


public void AnalyseSpeak(string strSpeak) 

  int iCbeg = 0 ; 
  int iEbeg = 0 ; 
  bool IsChina = true ; 
  for(int i=0;i   { 
   char chr = strSpeak[i] ; 
   if (IsChina) 
   { 
    if (chr<=122&&chr>=65) 
    { 
     int iLen = i - iCbeg ; 
     string strValue = strSpeak.Substring(iCbeg,iLen) ; 
     SpeakChina(strValue) ; 
     iEbeg = i ; 
     IsChina = false ; 
    } 
   } 
   else 
   { 
    if (chr>122||chr<65) 
    { 
     int iLen = i - iEbeg ; 
     string strValue = strSpeak.Substring(iEbeg,iLen) ; 
     this.SpeakEnglishi(strValue) ; 
     iCbeg = i ; 
     IsChina = true ; 
    } 
   } 
  }//end for 
  if (IsChina) 
  { 
   int iLen = strSpeak.Length - iCbeg ; 
   string strValue = strSpeak.Substring(iCbeg,iLen) ; 
   SpeakChina(strValue) ; 
  } 
  else 
  { 
   int iLen = strSpeak.Length - iEbeg ; 
   string strValue = strSpeak.Substring(iEbeg,iLen) ; 
   SpeakEnglishi(strValue) ; 
  } 


private void BuildSpeach() 

  if (voice == null) 
   voice = new SpVoiceClass() ; 


public int Volume 

  get 
  { 
   return voice.Volume ; 
  } 
  set 
  { 
   voice.SetVolume((ushort)(value)) ; 
  } 


public int Rate 

  get 
  { 
   return voice.Rate ; 
  } 
  set 
  { 
   voice.SetRate(value) ; 
  } 


private void Speak(string strSpeack) 

  try 
  { 
   voice.Speak(strSpeack,SpeechVoiceSpeakFlags.SVSFlagsAsync) ; 
  } 
  catch(Exception err) 
  { 
   throw(new Exception("发生一个错误:"+err.Message)) ; 
  } 




public void Stop() 

  voice.Speak(string.Empty,SpeechLib.SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak) ; 


public void Pause() 

  voice.Pause() ; 


public void Continue() 

  voice.Resume() ; 


}//end class 

 

   在 private SpeechLib.SpVoiceClass voice =null;这里,我们定义个一个用来发音的类,并且在第一次调用该类时,对它用BuildSpeach方法进行了初始化。 

   我们还定义了两个属性Volume和Rate,能够设置音量和语速。 

   我们知道,SpVoiceClass 有一个Speak方法,我们发音主要就是给他传递一个字符串,它负责读出该字符串,如下所示。 

private void Speak(string strSpeack) 

  try 
  { 
   voice.Speak(strSpeack,SpeechVoiceSpeakFlags.SVSFlagsAsync) ; 
  } 
  catch(Exception err) 
  { 
   throw(new Exception("发生一个错误:"+err.Message)) ; 
  } 

 

   其中SpeechVoiceSpeakFlags.SVSFlagsAsync表示异步发音。 

[解决办法]
没做过,mark
[解决办法]
关注+学习!!
帮你顶!!
[解决办法]
这个 需要进行 频谱分析 

微软的SPEECH SDK 只是识别语音命令 合 文本朗读

换个思路 每人定义一个命令 (各不相同) 通过命令的识别 来确认身份?
[解决办法]
貌似满复杂的
[解决办法]
建议楼主看下录音的软件,都会有音频波形图
分辨的话只能对比波形图了,手工写吧,这种东西有组件也是第三方收费的
[解决办法]
C#有那么强大吗?那C++用于做什么呢??
[解决办法]

探讨
现在问题是要确认的人的身份是不固定的,而且说什么也不固定的.

[解决办法]
真的只有靠频谱分析了
[解决办法]
关注
[解决办法]
我想应该可以的,之前查过
用Vista里的语音识别感觉很有意思,所以一直也想开发这样的东东
[解决办法]
语音特征实体类
数据库支持

提取语音特征算法自己实现
[解决办法]
关注!
[解决办法]
声音做不到吧,我感冒了声音就变了
用指纹甚至瞳孔识别

.NET Q群:2514097
[解决办法]
频谱分析~~~
[解决办法]
这个好难的.你试试把分提高点再问下吧.问这难的问题才出20分LZ真小气.
[解决办法]
应该是可以的,需要采样,比较吧
[解决办法]
肯定是根据字体的发音的 A,B 就是两个不同的音
[解决办法]
mark
[解决办法]
关注下 帮顶

我还以为要靠分析任务管理器里面的进程呢...


我是小菜鸟! 说的不好清见谅, 希望能够帮到你!
[解决办法]
可以给每个人定义一个特定的一句话来分析,如果波形一样,就通过认证,例如登录.
个人想法,希望对LZ有启发.呵
[解决办法]
声纹识别...这个不是C#问题...而是高等数学问题...


[解决办法]
可以研究下声音识谎的工作原理,肯能会有点帮助吧
[解决办法]

探讨
关注+学习!!
帮你顶!!

[解决办法]
友情UP
[解决办法]
技术问题,有可能...
[解决办法]
UP...
[解决办法]
看来需要一个可以将语音信号分析成声波频谱数据的接口,然后分析出关键的几个数据(可能存在这样的数据),再存放到数据库里
[解决办法]
mark
[解决办法]
通过频率和幅度去区分吧,傅立叶变换.
[解决办法]
指纹还没普及,你就来开发声纹了。
你丫是帮中国特工对做程序吧。
[解决办法]
了解一下不错
不过这个东西要做到质量高可能不容易吧?虽然像手机里也有这样的功能,但是估计是不精确的
中国科技大学好像在这方面比较有点名气吧?
记得好像以前IBM的比较厉害

估计这个东西自己一个人搞估计比较困难,得一个团体才行也才能得到学习提升,估计
[解决办法]
(一)声纹特征提取 
声纹特征提取即提取声音信号中表征人的基本特征,该特征能有效地区分不同的说话人,且对同一说话人的变化保持相对稳定。考虑到特征的可量化性、训练样本的数量和声纹识别系统性能的评价问题。目前主要对较低层次的声学特征进行识别。说话人特征大体归为以下几类: 
1.基音轮廓、共振峰频率带宽及其轨迹。基于发声器官生理结构提取的特征参数。 
2.谱包络参数。声音通过滤波器组输出,并以合适的速率对输出抽样作为声纹识别特征。 
3,听觉特性参数。模拟人耳对声音频率感知特性而提出的,如美倒谱系数、感知线性预测等。 
4.线性预测系数。线性预测与声道参数模型相符合,由它导出的各种参数,如反射系数、自相关系数、线性预测系数等作为识别特征,效果较好。 

(二)声纹模式匹配 
1.矢量量化。通过把每个人的特定文本编成码本,识别时将测试文本按此码本进行编码,以量化产生的失真度作为判决标准。其识别精度较高,判断速度较快。 
2.概率统计。考虑到短时间内声音信息相对平稳,通过对稳态特征如基音、声门增益、低队反射系数的统计分析,利用均值、方差等统计量和概率密度函数进行判决。其优点是不用对特征参量在时域上进行规整,适合文本无关的说话人识别。 
3.动态时间规整。说话人声音信息既有稳定的因素如发声习惯、发声器官结构,又有时变的因素如请速、语调、重音、韵律等。将识别模板与参考模板进行时间对比,并按照某种距离测定得出两模板间的相似程度。常用方法是基于最近邻原则的动态对间规整DTW。 
4.人工神经网络。这种分布式并行处理结构的网络模型在某种程度上模拟生物感知特性,具有自组织和自学习能力、很强的复杂分类边界区分能力,及对不完全信息的鲁棒性,其性能近似理想的分类器。缺点是训练时间长、动态时间规整能力弱,且网络规模可能随说话人数目增加到难以训练的程度。 
5.隐马尔可夫模型。这种基于转移概率和传输概率的随机模型,最早被美国的IBM公司用于声音识别。它把声音看成由可观察到的符号序列组成的随机过程,该序列是发声系统状态序列的输出。识别时,为每个说话人建立发声模型,通过训练得到状态转移概率矩阵和符号输出概率矩阵。具体应用时,计算未知声音在状态转移过程中最大概率,根据最大概率对应的模型进行判决。它不需时间规整,可节约判决的计算时间和存储量。这是目前广泛采用的一种技术,其缺点是训练时的计算量较大。
[解决办法]
蛮复杂的工程
[解决办法]
学习
[解决办法]
只知道我以前用的 Moto的手机是可以识别声音直接进行拨号的,没接触过。学习。
[解决办法]
感觉好难··
并且不是一般的难···
帮顶··
[解决办法]
应该可以做到
[解决办法]
以前查过资料
有个声纹技术
好像已经申请专利了

[解决办法]
http://www.d-ear.com/index.asp

他提供了一些开发包
[解决办法]
探讨
了解一下不错
不过这个东西要做到质量高可能不容易吧?虽然像手机里也有这样的功能,但是估计是不精确的
中国科技大学好像在这方面比较有点名气吧?
记得好像以前IBM的比较厉害

估计这个东西自己一个人搞估计比较困难,得一个团体才行也才能得到学习提升,估计

[解决办法]
帮顶,,是个好东西,要是以后开发了 也是个见证 嘿嘿


[解决办法]
帮顶,,
[解决办法]
应该是类似音频波形识别之类的把。
[解决办法]
关注
[解决办法]
楼主强人,声纹识别这个工程很大的噢~先需要有人的声纹标准采集的,然后按频率,生成特征库,不过,现在有什么变声器之类的,声纹好像不是太安全噢~全当研究了,帮楼主顶~
[解决办法]
我觉得关键是硬件设备
[解决办法]
能,其他语言能写的基本上C#都可以写.....
[解决办法]
MARK
[解决办法]
太有才了。
[解决办法]
应该不是用什么语言的问题:
只要你用的语言能过调用外界提供的语音信息识别数据,什么语言都能实现.
虽然没做过,但是可以想象,提起个人语音(或具体词汇)的发音规律,分析出数据,提供调用

C# code
public 语音参数数据类型 获取发音信号信息(){...return 语音参数数据类型 XX} public bool 常用词汇获取方法(数据类型 语音频率信号参数){...}public bool  获取个人发音规律方法(数据类型 个人语音信息参数){}main(){数据类型 发音=获取发音信号信息();if(常用词汇获取方法(发音)){   输出:说的话就是数据库保存的这个词}else{   输出:奶奶的,你说话没对呢!}if(获取个人发音规律方法(发音)){   输出:哈哈是这个娃儿对我说话了;}else{   输出: 龟儿子的,你说错了 ;// 注明:我不是四川人}}
[解决办法]
学习,关注。。。
[解决办法]
'==========================================================================
' Name : CommandPC.VBS
' AUTHOR : HUAYING
' DATE : 2005-1-31
'==========================================================================
Dim CommandDictionary '命令字典对象
Dim WshShell 'WshShell对象提供对本地Windows程序的访问。
Dim ScriptComplete '程序结束标志
Dim SR '语音识别(Speech Recognition)对象
Dim Grammar '语音识别的命令语法对象
 
'初始化命令字典对象,可根据自己的需要添加命令
Set CommandDictionary = CreateObject("Scripting.Dictionary")
CommandDictionary.Add "上网", "C:\Program Files\Mozilla Firefox\firefox.exe" '注意双引号的数目
CommandDictionary.Add "计算器", "calc"
CommandDictionary.Add "记事本", "notepad"
CommandDictionary.Add "空当接龙", "freecell"
 
Set WshShell = CreateObject("WScript.Shell") '创建WshShell对象
 
ScriptComplete = False '初始化程序结束标志
 
'创建语音识别对象,调用由"Command.XML"所定义的语法,并启动语音识别引擎
Set SR = WScript.CreateObject("SAPI.SpSharedRecoContext", "RecoContext_")
Set Grammar = SR.CreateGrammar
Grammar.CmdLoadFromFile "COMMAND.XML", SLODynamic
Grammar.CmdSetRuleIdState 0, 1
 
MsgBox "你好,主人,请吩咐。"
 
'等候你的语音命令(需要安装麦克风)
'当识别出"命令结束"命令时程序结束
Do
WScript.Sleep 1000
Loop Until ScriptComplete 
 
MsgBox "欢迎再跟我说话,再见!" 
 
'你的语音命令被识别
Sub RecoContext_Recognition(ByVal StreamNumber, ByVal StreamPosition, ByVal RecognitionType, ByVal Result ) 
Text = Result.PhraseInfo.GetText '获取语音识别引擎所识别的命令
If Text <> "命令结束" Then
WshShell.Run CommandDictionary.Item(Text) '由WshShell对象Run方法执行你的命令
Else
ScriptComplete = true '程序结束标志
End If 
End Sub


<?xml version="1.0" encoding="gb2312" ?>
<GRAMMAR LANGID="804">
 <RULE NAME="命令" TOPLEVEL="ACTIVE">
<L>
<P>上网</P>
<P>计算器</P>
<P>记事本</P>
<P>空当接龙</P>


<P>命令结束</P>
</L>
 </RULE>
</GRAMMAR>

[解决办法]
关注,这个还是蛮好玩的。
[解决办法]
知道不?唐俊刚开始就是做这个的,卡拉OK语音打分系统就是他弄的,之后去了美国进了微软!
[解决办法]
mark!

热点排行