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