当前位置:首页 > 代码 > 正文

语音识别源代码(语音识别开源项目)

admin 发布:2022-12-19 14:53 136


今天给各位分享语音识别源代码的知识,其中也会对语音识别开源项目进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

求语音识别的源代码,要求是用C#或C语言编写,能够识别一些基本的汉语发音

首先你要引用 DotNetSpeech

然后

创建SpeechRecognitionEngine 对象

下面的代码可以让系统获取语音并且识别

SRE = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("zh-CN"));//中文

SRE.LoadGrammar(new DictationGrammar());//所有语言

SRE.SpeechRecognized += new EventHandlerSpeechRecognizedEventArgs(SRE_SpeechRecognized);//系统接受后的事件

SRE.SetInputToDefaultAudioDevice();//设置默认输入设备

微软MSDN里面有详细的介绍,望采纳。

高分求助:C#.NET中实现语音(英文)的对比.

参考一下 :speechlib语音识别

C# 实现中文发音或中文语音识别 2008-10-18 07:44在.net中,对英文语音有较好的支持,但是对中文语音的支持还没有加入进来,我们要想实现中文发音或中文语音识别,必需先安装微软的Speech Application SDK(SASDK),它的最新版本是 SAPI 5.1 他能够识别中、日、英三种语言,你可以在这里下载:,需要安装这两个文件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;istrSpeak.Length;i++)

{

char chr = strSpeak ;

if (IsChina)

{

if (chr=122chr=65)

{

int iLen = i - iCbeg ;

string strValue = strSpeak.Substring(iCbeg,iLen) ;

SpeakChina(strValue) ;

iEbeg = i ;

IsChina = false ;

}

}

else

{

if (chr122||chr65)

{

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表示异步发音。

接上篇《中文语音识别技术在c#中的应用(一)》………但是,这个方法本身并不知道你给的字符串是什么语言,所以需要我们它这个字符串用什么语言读出。SpVoiceClass 类的Voice 属性就是用来设置语种的,我们可以通过SpVoiceClass 的GetVoices方法得到所有的语种列表,然后在根据参数选择相应的语种,比如设置语种为汉语如下所示:

private void SetChinaVoice()

{

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

}

0表示是汉用,1234都表示英语,就是口音不同。

这样,我们就设置了语种,如果结合发音方法,我们就可以设计出一个只发汉语语音的方法。

private void SpeakChina(string strSpeak)

{

SetChinaVoice() ;

Speak(strSpeak) ;

}

只发英语语音的方法也是类似的,上面程序里有。

对于一段中英文混合的语言,我们让程序读出混合语音的方法就是:编程把这段语言的中英文分开,对于中文调用SpeakChina方法,英文调用SpeakEnglishi方法;至于怎样判断一个字符是英文还是中文,我采用的是判断asc码的方法,具体的类方法是通过AnalyseSpeak实现的。

这样,对于一段中英文混合文字,我们只需把它作为参数传递给AnalyseSpeak就可以了,他能够完成中英文的混合发音。

当然,对于发音的暂定、继续、停止等操作,上面也给出了简单的方法调用,很容易明白。

下面简单介绍一下中文语音识别的方法:

先把该语音识别的类源代码贴在下面,然后再做说明:

public class SpRecognition

{

private static SpRecognition _Instance = null ;

private SpeechLib.ISpeechRecoGrammar isrg ;

private SpeechLib.SpSharedRecoContextClass ssrContex =null;

private System.Windows.Forms.Control cDisplay ;

private SpRecognition()

{

ssrContex = new SpSharedRecoContextClass() ;

isrg = ssrContex.CreateGrammar(1) ;

SpeechLib._ISpeechRecoContextEvents_RecognitionEventHandler recHandle =

new _ISpeechRecoContextEvents_RecognitionEventHandler(ContexRecognition) ;

ssrContex.Recognition += recHandle ;

}

public void BeginRec(Control tbResult)

{

isrg.DictationSetState(SpeechRuleState.SGDSActive) ;

cDisplay = tbResult ;

}

public static SpRecognition instance()

{

if (_Instance == null)

_Instance = new SpRecognition() ;

return _Instance ;

}

public void CloseRec()

{

isrg.DictationSetState(SpeechRuleState.SGDSInactive) ;

}

private void ContexRecognition(int iIndex,object obj,SpeechLib.SpeechRecognitionType type,SpeechLib.ISpeechRecoResult result)

{

cDisplay.Text += result.PhraseInfo.GetText(0,-1,true) ;

}

}

我们定义了ssrContex 和isrg为语音识别的上下文和语法,通过设置isrg的DictationSetState方法,我们可以开始或结束识别,在上面的程序中是BeginRec和CloseRec方法。cDisplay 是我们用来输出识别结果的地方,为了能够在大部分控件上都可以显示结果,我用了一个Control 类来定义它。当然,每次语音识别后都会触发ISpeechRecoContextEvents_RecognitionEventHandler 事件,我们定义了一个这样的方法ContexRecognition来响应事件,并且在这个方法里输出识别结果。

这样,中文语音处理的一些最基本的问题就有了一个简单的解决方法,当然,这种方法还有很多不完善的地方,希望大家多提出批评意见,共同提高。

语音识别中拼接wav文件的C语言源程序

wav文件整合,指的是前后wav文件相连接还是其他意思?

语音识别不需要拼接wav文件的。可能你们老师只是出个题目让你们练练语音信号的编程基本功吧

如何用神经网络进行语音识别的matlab代码

给你一个实例,希望通过该例子对实现神经网络应用有一定的了解。

%x,y分别为输入和目标向量

x=1:5;

y=[639 646 642 624 652];

%创建一个前馈网络

net=newff(minmax(x),[20,1],{'tansig','purelin'});

%仿真未经训练的网络net并画图

y1=sim(net,x);plot(x,y1,':');

%采用L-M优化算法

net.trainFcn='trainlm';

%设置训练算法

net.trainParam.epochs=500;net.trainParam.goal=10^(-6);

%调用相应算法训练BP网络

[net,tr,yy]=train(net,x,y);

%对BP网络进行仿真

y1=sim(net,x);

%计算仿真误差

E=y-y1;MSE=mse(E)

hold on

%绘制匹配结果曲线

figure;

plot(x,y1,'r*',x,y,'b--')

研一刚接触语音识别,怎么运用kaldi工具箱做一个baseline

语音识别开发平台有很多,具体总结如下:(更详细的介绍参见本人的博文:几个常见的语音交互平台的简介和比较)

1.商业化的语音交互平台

1)微软Speech API

微软的Speech API(简称为SAPI)是微软推出的包含语音识别(SR)和语音合成(SS)引擎的应用编程接口(API),在Windows下应用 广泛。目前,微软已发布了多个SAPI版本(最新的是SAPI 5.4版),这些版本要么作为于Speech SDK开发包发布,要么直接被包含在windows 操作系统中发布。SAPI支持多种语言的识别和朗读,包括英文、中文、日文等。

2).IBM viaVoice

IBM是较早开始语音识别方面的研究的机构之一,早在20世纪50年代末期,IBM就开始了语音识别的研究,计算机被设计用来检测特定的语言 模式并得出声音和它对应的文字之间的统计相关性。1999年,IBM发布了VoiceType的一个版。2003年,IBM授权ScanSoft公司拥有基于ViaVoice的桌面产品的全球独家经销权,随后ScanSoft与Nuance合并,如今viaVoice早已淡出人们的视线,取而代之的是Nuance。

3)Nuance

Nuance通讯是一家跨国计算机软件技术公司,总部设在美国马萨诸塞州伯灵顿,主要提供语音和图像方面的解决方案和应用。目前的业务集中 在服务器和嵌入式语音识别,电话转向系统,自动电话目录服务等。Nuance语音技术除了语音识别技术外,还包扩语音合成、声纹识别等技术。世界语音技术市场,有超过80%的语音识别是采用Nuance识别引擎技术, 其名下有超过1000个专利技术,公司研发的语音产品可以支持超过50种语言,在全球拥有超过20亿用户。苹果的iPhone 4S的Siri语音识别中就应用了Nuance的语音识别服务。

4)科大讯飞

科大讯飞作为中国最大的智能语音技术提供商,在智能语音技术领域有着长期的研究积累,并在中文语音合成、语音识别、口语评测等多项 技术上拥有国际领先的成果。占有中文语音技术市场60%以上市场份额,语音合成产品市场份额达到70%以上。

5)其他

其他的影响力较大商用语音交互平台有谷歌的语音搜索(Google Voice Search),百度和搜狗的语音输入法等等。

2.开源的语音交互平台

1)CMU-Sphinx

CMU-Sphinx也简称为Sphinx(狮身人面像),是卡内基 - 梅隆大学( Carnegie Mellon University,CMU)开发的一款开源的语音识别系统, 它包括一系列的语音识别器和声学模型训练工具。最早的Sphinx-I 由@李开复 (Kai-Fu Lee)于1987年左右开发,使用了固定的HMM模型(含3个大小为256的codebook),它被号称为第一个高性能的连续语音识别 系统(在Resource Management数据库上准确率达到了90%+)。 最新的Sphinx语音识别系统包含如下软件包:

 Pocketsphinx — recognizer library written in C.

 Sphinxbase — support library required by Pocketsphinx

 Sphinx4 — adjustable, modifiable recognizer written in Java

 CMUclmtk — language model tools

 Sphinxtrain — acoustic model training tools

这些软件包的可执行文件和源代码在sourceforge上都可以下载得到。

2)HTK

HTK是Hidden Markov Model Toolkit(隐马尔科夫模型工具包)的简称,HTK主要用于语音识别研究,最初是由剑桥大学工程学院(Cambridge University Engineering Department ,CUED)的机器智能实验室(前语音视觉及机器人组) 于1989年开发的,它被用来构建CUED的大词汇量的语音识别系统。HTK的最新版本是09年发布的3.4.1版,关于HTK的实现原理和各个工具的使用方法可以参看HTK的文档HTKBook。

3)Julius

Julius是一个高性能、双通道的大词汇量连续语音识别(large vocabulary continues speech recognition,LVCSR)的开源项目, 适合于广大的研究人员和开发人员。它使用3-gram及上下文相关的HMM,在当前的PC机上能够实现实时的语音识别,单词量达到60k个。

4)RWTH ASR

该工具箱包含最新的自动语音识别技术的算法实现,它由 RWTH Aachen 大学的Human Language Technology and Pattern Recognition Group 开发。RWTH ASR工具箱包括声学模型的构建、解析器等重要部分,还包括说话人自适应组件、说话人自适应训练组件、非监督训练组件、个性化 训练和单词词根处理组件等。

5)其他

上面提到的开源工具箱主要都是用于语音识别的,其他的开源语音识别项目还有Kaldi 、simon 、iATROS-speech 、SHoUT 、 Zanzibar OpenIVR 等。

求助语音识别代码的注释,要每一句都写明意思,谢谢

这个是完整的代码,我自己的账号发不了这么长,希望好心人帮忙注释啊,非常感谢!!!

(1)端点检测部分(vad):

function [x1,x2] = vad(x)

%语音信号x幅度归一化到[-1,1]

x = double(x);

x = x / max(abs(x));

%常数设置

FrameLen = 240; %帧长度为240

FrameInc = 80; %帧移为80

amp1 = 10; %短时能量高门限10

amp2 = 2; %短时能量低门限为2

zcr1 = 10; %短时过零率高门限为10

zcr2 = 5; %短时过零率低门限为5

maxsilence =3;%静音时间门限3*10ms= 30ms

minlen= 15;%最小语音时间长度15*10ms = 150ms

status= 0; %

count= 0; %语音时间累计

silence = 0; %静音时间累计

%计算过零率

tmp1= enframe(x(1:end-1), FrameLen, FrameInc);

tmp2= enframe(x(2:end), FrameLen, FrameInc);

signs =(tmp1.*tmp2)0;%符号数组,用于存储相邻两个采样点符号是否相同,即是否穿越0电平

diffs = (tmp1-tmp2)0.02;%度量相邻两个采样点之间距离,如果大于门限0.02(经验值),则1,否则0

zcr = sum(signs.*diffs,2);%过零率

%计算短时能量

amp =sum(abs(enframe(filter([1 -0.9375], 1, x), FrameLen, FrameInc)), 2);

%调整能量门限

amp1 = min(amp1,max(amp)/4);

amp2 = min(amp2,max(amp)/8);

%开始端点检测

x1 = 0;

x2 = 0;

for n=1:length(zcr)

goto = 0;

switch status

case {0,1}% 0 =静音, 1 =可能开始

if amp(n) amp1%确信进入语音段

x1 = max(n-count-1,1);

status= 2;

silence = 0;

count= count + 1;

elseif amp(n) amp2 || ... %可能处于语音段

zcr(n) zcr2

status = 1;

count= count + 1;

else%静音状态

status= 0;

count= 0;

end

case 2,% 2 =语音段

if amp(n) amp2 || ...%保持在语音段

zcr(n) zcr2

count = count + 1;

else%语音将结束

silence = silence+1;

if silence maxsilence %静音还不够长,尚未结束

count= count + 1;

elseif count minlen%语音长度太短,认为是噪声

status= 0;

silence = 0;

count= 0;

else%语音结束

status= 3;

end

end

case 3,

break;

end

end

count = count-silence/2;

x2 = x1 + count -1;

subplot(311)

plot(x)

axis([1 length(x) -1 1])

xlabel('语音信号');

line([x1*FrameIncx1*FrameInc ],[-1,1],'Color','red');

line([x2*FrameIncx2*FrameInc ],[-1,1],'Color','red');

subplot(312)

plot(amp);

axis([1 length(amp) 0max(amp)])

xlabel('短时能量');

line([x1,x1],[min(amp),max(amp)],'Color','red');

line([x2,x2],[min(amp),max(amp)],'Color','red');

subplot(313)

plot(zcr);

axis([1 length(zcr) 0max(zcr)])

xlabel('过零率');

line([x1,x1],[min(zcr),max(zcr)],'Color','red');

line([x2,x2],[min(zcr),max(zcr)],'Color','red');

(2)MFCC部分:

function ccc = mfcc(x)

%归一化mel滤波器组系数

bank=melbankm(24,256,8000,0,0.5,'m');%24滤波器个数,8000采样频率

bank=full(bank);

bank=bank/max(bank(:));

% DCT系数,12*24

for k=1:12

n=0:23;

dctcoef(k,:)=cos((2*n+1)*k*pi/(2*24));

end

%归一化倒谱提升窗口

w = 1 + 6 * sin(pi *(1:12) ./ 12);

w = w/max(w);

%预加重滤波器

xx=double(x);

xx=filter([1-0.9375],1,xx);

%语音信号分帧,xx是输入语音信号;256是帧长;80是帧移

xx=enframe(xx,256,80);

%计算每帧的MFCC参数

for i=1:size(xx,1)

y = xx(i,:);

s = y' .* hamming(256);%加汉明窗

t = abs(fft(s));%fft变换

t = t.^2;

c1=dctcoef * log(bank * t(1:129));

c2 = c1.*w';

m(i,:)=c2';

end

%差分系数

dtm = zeros(size(m));

for i=3:size(m,1)-2

dtm(i,:) = -2*m(i-2,:) - m(i-1,:) + m(i+1,:)+ 2*m(i+2,:);

end

dtm = dtm / 3;

%合并mfcc参数和一阶差分mfcc参数

ccc = [m dtm];

%去除首尾两帧,因为这两帧的一阶差分参数为0

ccc =ccc(3:size(m,1)-2,:);

(3)dtw计算部分:

function dist = dtw2(test, ref)

global x y_min y_max

global t r

global D d

global m n

t = test;

r = ref;

n = size(t,1);

m = size(r,1);

d = zeros(m,1);

D =ones(m,1) *realmax;

D(1) = 0;

%如果两个模板长度相差过多,匹配失败

if (2*m-n3) || (2*n-m2)

dist =realmax;

return

end

%计算匹配区域

xa = round((2*m-n)/3);

xb = round((2*n-m)*2/3);

if xbxa

%xbxa,按下面三个区域匹配

%1:xa

%xa+1:xb

%xb+1:N

for x =1:xa

y_max= 2*x;

y_min= round(0.5*x);

warp

end

for x =(xa+1):xb

y_max= round(0.5*(x-n)+m);

y_min= round(0.5*x);

warp

end

for x =(xb+1):n

y_max= round(0.5*(x-n)+m);

y_min= round(2*(x-n)+m);

warp

end

elseif xaxb

%xaxb,按下面三个区域匹配

%0:xb

%xb+1:xa

%xa+1:N

for x =1:xb

y_max= 2*x;

y_min= round(0.5*x);

warp

end

for x =(xb+1):xa

y_max= 2*x;

y_min= round(2*(x-n)+m);

warp

end

for x =(xa+1):n

y_max= round(0.5*(x-n)+m);

y_min= round(2*(x-n)+m);

warp

end

elseif xa==xb

%xa=xb,按下面两个区域匹配

%0:xa

%xa+1:N

for x =1:xa

y_max= 2*x;

y_min= round(0.5*x);

warp

end

for x =(xa+1):n

y_max= round(0.5*(x-n)+m);

y_min= round(2*(x-n)+m);

warp

end

end

%返回匹配分数

dist = D(m);

function warp

global x y_min y_max

global t r

global D d

global m n

d = D;

for y = y_min:y_max

D1 = D(y);

if y1

D2= D(y-1);

else

D2 =realmax;

end

if y2

D3= D(y-2);

else

D3 = realmax;

end

d(y) =sum((t(x,:)-r(y,:)).^2) + min([D1,D2,D3]);

end

D = d;

(4)测试函数testdtw部分;

disp('正在计算参考模板的参数...')

for i=1:10

fname = sprintf('G:\\石东东\\语音\\%da.wav',i-1);

x = wavread(fname);

[x1 x2] = vad(x);

m = mfcc(x);

m = m(x1-2:x2-2,:);

ref(i).mfcc = m;

end

disp('正在计算测试模板的参数...')

for i=1:10

fname = sprintf('G:\\石东东\\语音\\%db.wav',i-1);

x = wavread(fname);

[x1 x2] = vad(x);

m = mfcc(x);

m = m(x1-2:x2-2,:);

test(i).mfcc = m;

end

disp('正在进行模板匹配...')

dist = zeros(10,10);

for i=1:10

for j=1:10

dist(i,j) = dtw2(test(i).mfcc, ref(j).mfcc);

end

end

disp('正在计算匹配结果...')

for i=1:10

[d,j] = min(dist(i,:));

fprintf('测试模板%d的识别结果为:%d\n', i-1, j-1);

end

语音识别源代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于语音识别开源项目、语音识别源代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/9662.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载