2019-04-02 19:07:19 david_tym 阅读数 1269
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5927 人正在学习 去看看 杨波

春节后到现在近两个月了,没有更新博客,主要是因为工作的关注点正从传统语音(语音通信)转向智能语音(语音识别)。部门起了个新项目,要用到语音识别(准备基于Kaldi来做)。我们之前做的传统音频已基本成熟,就开始关注在语音识别上了。对于我们来说,这是个全新的领域(虽然都是语音相关的,但是语音通信偏信号处理,传统语音识别方法偏概率统计),需要学习的知识很多,所以这段时间主要是在学习新知识了,主要学习了数学(高数/线性代数/概率统计,这应该算复习)、机器学习基础知识、深度学习、语音识别传统方法等。由于刚开始学,还没实践,有的还是一知半解。学的过程中也要有输出(把自己学的知识讲给组内其他同学听,并一起讨论,让大家都快速入门),这也能促进把学的东西掌握的更好。我花了两周的时间学习了语音识别的传统方法(主要学习方式是看文档和博客),基本上掌握了其方法,也做了PPT给组内同学讲(做PPT时用了一些博客上的图,谢谢这些博主,这里就不一一列举了)。今天就把这个PPT share出来,给也想入门语音识别的朋友做个参考。由于还没实践,有什么不太准确或不准确的地方还请指出。

 

语音识别传统方法主要分两个阶段:训练和识别,训练阶段主要是生成声学模型和语言模型给识别阶段用。传统方法主要有五大模块组成,分别是特征提取(得到每帧的特征向量),声学模型(用GMM从帧的特征向量得到状态,再用HMM从状态得到音素)、发音字典(从音素得到单词)、语言模型(从单词得到句子)、搜索解码(根据声学模型、发音字典和语言模型得到最佳文本输出),即从帧得到特征向量(特征提取干的话),从特征向量得到状态(GMM干的话),从状态得到音素(HMM干的话),从音素得到单词(发音字典干的活),从单词得到句子(语言模型干的活)。传统方法除了在特征提取上用到信号处理知识,其余全都是概率统计等知识,所以说语音识别和语音通信是两个完全不同的领域。

 

经过近十年的发展,语音识别已经从传统方法演进到基于深度学习的方法,识别率也有了质的提升,而且还在快速的演变中,现在商用的语音识别系统都是基于深度学习实现的。对于传统方法而言,只会出现在文章教材中了,但作为新手,在入门时学习它还是很有必要的。只有了解了传统方法再去学习深度学习方法,才知道深度学习方法是怎么样基于传统方法一步步演变的。下面就是我的PPT。

 

 

 

 

 

2017-03-01 00:03:25 wr132 阅读数 10434
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5927 人正在学习 去看看 杨波

目前,语音识别,即将语音内容转换为文字的技术已经比较成熟,遥想当时锤子发布会上展示的讯飞输入法语音识别,着实让讯飞火了一把。由于此类语音识别需要采集大量的样本,才能达到一定的准确度,个人很难从零开始搭建。但是,许多拥有语音识别技术的公司,或多或少会提供一些API或者SDK供开发者使用,这样就把语音识别的门槛降到了一个很低的程度,只需几行代码即可实现。下面我介绍以下如何使用Python调用百度的REST API实现一个简单的语音识别。

注册账号,并成为开发者

打开 http://yuyin.baidu.com/ ,并且使用你的百度账号登陆,如果你不是开发者,系统会自动引导你申请成为开发者。

创建应用

打开 http://yuyin.baidu.com/app ,点击创建应用,应用名称自己取,选择合适的应用类型。下一步,服务类型选择语音识别,继续点击下一步,然后就可以关闭了。

刷新当前页面,你就可以看到自己创建的应用,点击查看key,这些是进行身份识别的关键信息。

代码编写

http://yuyin.baidu.com/docs/asr/54 可以查看官方文档,百度提供了两种方法:隐式发送是将音频数据打包转换成一个字符串,放到json数据包中来发送;显示发送则是直接发送语音数据。本代码使用隐式发送。

注意:使用前要将你的应用信息填入适当位置

#!/usr/bin/env python
# coding: utf-8
import urllib2
import json
import base64
import  os

#设置应用信息
baidu_server = "https://openapi.baidu.com/oauth/2.0/token?"
grant_type = "client_credentials"
client_id = "" #填写API Key
client_secret = "" #填写Secret Key

#合成请求token的URL
url = baidu_server+"grant_type="+grant_type+"&client_id="+client_id+"&client_secret="+client_secret

#获取token
res = urllib2.urlopen(url).read()
data = json.loads(res)
token = data["access_token"]
print token

#设置音频属性,根据百度的要求,采样率必须为8000,压缩格式支持pcm(不压缩)、wav、opus、speex、amr
VOICE_RATE = 8000
WAVE_FILE = "test.wav" #音频文件的路径
USER_ID = "hail_hydra" #用于标识的ID,可以随意设置
WAVE_TYPE = "wav"

#打开音频文件,并进行编码
f = open(WAVE_FILE, "r")
speech = base64.b64encode(f.read())
size = os.path.getsize(WAVE_FILE)
update = json.dumps({"format":WAVE_TYPE, "rate":VOICE_RATE, 'channel':1,'cuid':USER_ID,'token':token,'speech':speech,'len':size})
headers = { 'Content-Type' : 'application/json' } 
url = "http://vop.baidu.com/server_api"
req = urllib2.Request(url, update, headers)

r = urllib2.urlopen(req)


t = r.read()
result = json.loads(t)
print result
if result['err_msg']=='success.':
    word = result['result'][0].encode('utf-8')
    if word!='':
        if word[len(word)-3:len(word)]==',':
            print word[0:len(word)-3]
        else:
            print word
    else:
        print "音频文件不存在或格式错误"
else:
    print "错误"
2018-07-26 22:32:01 juwairen_yangfeng 阅读数 772
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5927 人正在学习 去看看 杨波

摘要:语音识别作为人工智能下很火爆的一门学科,是当下研究的一个重要领域。大多数的语音识别是基于市面上已有的语音识别模块,成本较高,本系统是孤立词语语音识别,考虑到成本以及可实现性,笔者选择了STM32F1系列MCU的最小系统,通过TFT彩屏实现人机交互,搭建音频采集模块,从而完成语音识别系统的硬件部分。软件设计采用A/D采样、预加重、加窗、端点检测、MFCC特征提取、特征匹配几个步骤,技术相对成熟,识别率较高。

主题词:孤立词语、音频采集模块、端点检测、MFCC特征提取、特征匹配

 

一、引言:语音识别的发展最早开始于上世纪50年代的贝尔实验室,Davis等科学家研究出可以识别出10个英文数字的实验装置。60年代的一系列数字信号处理方法推动了语音识别的发展,如FFT。同时,伴随着计算机技术的发展,语音识别逐渐从硬件工作转移到软件工作,这时的语音识别发展 很快,但人们很快就意识到语音识别的困难加深。此后,70年代日本学着提出的动态时间规整技术(DTW)解决不等长语音的对整匹配问题,以及80年代提出的隐马尔可夫模型法(HMM),都是现阶段语音识别的重要算法。

二、正文:

音频采集电路:首先是对于语音信号的采集,本系统使用电容式咪头采集音频,但MIC的输出电压只有几毫伏到十几毫伏,所以需要加放大电路,可采用三极管或者运放放大。本系统采用三极管阻容耦合二级放大电路,需要注意的是咪头需要一个工作电压,所以直接将VCC接到咪头的正极,然后第一级的耦合电容设置为10uf,这个对三极管基极充电时间有影响,它和集电极的电阻一同构成了RC充电电路,且10uf的电容会把音频信号耦合到基极上,咪头采集到的信号控制在3.3V以内。单片机是无法识别模拟电信号的,所以需要用到A/D采样;人说话的语音信号大多数有效信号集中在100HZ-3400HZ,所以根据香农采样定理,只要A/D采样频率大于等于6800HZ即可,这对于我们STM32F1系列单片机来说是完全可以实现的,接着考虑A/D精度,STM32F1ZET6拥有1~3个12 位逐次逼近型的模拟数字转换器,对于Vref=3.3v来说其最小误差为0.8mv,这是完全可以接受的,这就实现了语音模拟信号的采样量化。

高频补偿:经过研究,人的发生器官也相当于一个时变线性系统,在8000HZ以上频率时,会有大约6dB/倍频的频率衰减,所以为了平滑频率,需要对信号进行高频预加重,即 运用一个6dB/倍频的一阶数字滤波器。

语音信号的加窗处理:语音信号有一个很强的特性,那就是短时性,但从另一方面看,由于语音的形成过程是与发音器官的运动密切相关的,这种物理性的运动比起声音振动速度来说是缓慢的,所以在一个短时间范围内可以认为其变化很小,借此,我们对语音信号进行短时分析(分帧),一般语音信号在10ms-30ms之间保持稳定,我们去每帧长度为20ms,且为了使语音信号的连续性,每一帧之间混叠窗长的一半;窗函数的选择大致有矩形窗、汉宁窗、哈明窗等,而窗函数的选择要求一般包含两点:①尽量减少窗函数的旁瓣高度,使能量集中在主瓣②主瓣宽度尽量窄,以获得较陡的过渡带;介于以上条件,我们选择哈明窗。由于帧与帧连接处的信号因为加窗而弱化,如果没有帧移,这部分信息就丢失了。

端点检测:当系统接收到一段完整的语音信号时,去除语音段前后的噪声对于我们语音参数提取具有重要意义。经研究,当我们在发出语音时,清音和浊音会不断的出现,发现浊音的短时能量明显比环境噪声高,清音的短时平均过零率与环境噪声也有明显的区别,所以利用这个特性,设定短时能量和短时平均过零率的门限值,当某一帧的短时能量或短时平均过零率大于门限值,则可认为进入有效语音段,设定为语音起点,当某一帧的短时能量和短时平均过零率都小于门限值时,认为这是语音末点。

特征提取算法在语音识别系统中,模拟语音信号在完成 A/D 转换后成为数字信号。此时的语音信号为时域的信号,时域的信号难以进行分析和处理,而且数据量庞大。通常的做法是对时域信号进行变换,提取其中某种特定的参数,通过一些更加能反映语音本质特征的参数来进行语音识别。进过几十年的发展,语音特征提取算法大致有三类:

基于线性预测分析的提取方法 (LPCC)、基于频谱分析的提取方法(MFCC)、基于其它数字信号处理技术的特征分析方法,本系统采用基于频谱分析的提取方法,Mel频率倒谱频系数MFCC。

MFCC是Mel-Frequency Cepstral Coefficients的缩写,顾名思义MFCC特征提取包含两个关键步骤:转化到梅尔频率,然后进行倒谱分析。梅尔刻度是一种基于人耳对等距的音高(pitch)变化的感官判断而定的非线性频率刻度。和频率的赫兹的关系如下: M=2595log10(1+f/700)所以当在梅尔刻度上面上是均匀分度的话,对于的赫兹之间的距离将会越来越大。梅尔刻度的滤波器组在低频部分的分辨率高,高频部分分辨率低,这跟人耳的听觉特性是相符的。所以对于有效语音段,进行离散傅里叶变化(DFT),将频谱信号通过一组Mel尺度的三角形滤波器组,定义一个有M个滤波器的滤波器组,采用的滤波器为三角滤波器,中心频率为f(m),m=1,2,...,M。M通常取22-26。各f(m)之间在赫兹轴上的间隔随着m值的减小而缩小,随着m值的增大而增宽,但在梅尔刻度却是等距离。最后就是离散余弦变换,进行反傅里叶变换然后通过低通滤波器获得最后的低频信号,这样能量会集中在低频部分。每个三角滤波器会有一个输出,通过以上计算实现了每帧数据从N(FFT点数 )点到M点的降维,大大减小了计算量,减小了内存开销、缩减了运算时间。

特征匹配算法:现阶段,语音识别用到的模型匹配方法主要有动态时间规整(DTW)、隐马尔可夫模型(HMM)和人工神经网络。本系统用于孤立词识别,DTW 算法与 HMM 算法在相同的环境条件下,识别效果相差不大,但是 HMM 算法要复杂得多,这主要体现在HMM 算法在训练阶段需要提供大量的语音数据,通过反复计算才能得到模型参数,而 DTW 算法的训练中几乎不需要额外的计算。所以在孤立词语音识别中,DTW 算法得到更广泛的应用。笔者觉得,对于一个算法的理解,首先得从它的物理意义开始,在网上很多人的博客里都对这个算法有过通俗的解释,并配以实例,在这我就不多加说明了。主要步骤为初始化矩阵,计算每个数据之间的“距离”,计算累计匹配距离,匹配距离最小的特征模板与输入特征有最大的相似性。

单片机软件设计:首先,一段短时语音信号长度大约为2s以内,我们以8khz的ADC采用频率去采样得到的最大点数为16000,因为STM32F1为12位ADC,所以每个点的数据相当于两个字节,总的算来需要16000*2=32000字节,对于拥有64KB RAM的STM32F103ZET6来说在内存上是可以实现的。ST官方固件库提供的16位、1024点FFT用时2.138 ms,20ms为一帧,算下来总共有100帧,也就是100次1024点的FFT计算,总用时就是213.8ms,加上其他地方的指令、算法运算时间,识别一个指令应该在0.5s以内。至于每帧20ms,按照8khz的采样频率只能得到160个点,采用1024点FFT则需要在尾部补864个零,因为由公式(delta f)=fs/N 补零可以提高频率分辨率。且考虑到ADC采样次数比较多,所以采集到的数据采用DMA的方式传输到设定的数组,这样可以节省指令执行时间。从工程的初始化开始,代码如下……先是设定单片机运行频率(72MHZ),延时函数初始化(SysTick),ADC、DMA、按键函数部分以及需要用到的引脚的初始化,main()中的主要为一个按键函数来实现何时进行模板训练,何时进行语音识别。工程的主要部分为端点检测、MFCC语音特征提取、以及特征提算DTW的代码实现。想着重提出来说的是DTW算法,算法基于动态规划(DP)的思想,用于于长度不等的序列如何匹配。通俗理解也就是说怎么样的warping才是正确的?直观上理解,当然是warping一个序列后可以与另一个序列重合recover。这个时候两个序列中所有对应点的距离之和是最小的。所以从直观上理解,warping的正确性一般指“feature to feature”的对齐,我想这也是动态时间规整算法的核心。这个解释应该很宏观,理解了物理意义,这个算法也变的简单起来。

对于它的起源(DP)我们不去过多的诉说,而它广阔的应用前景,结合cpp面向对象的特性,我想我们可以把这个warping运用的很只能,就像对于人的情感、关系,将两个人综合特征的显现进行“匹配”,或是两代人之间的种种特征(貌似很像DNA检测,不过一个是唯物,一个是格物),这是对对象的一个小小改变。

2014-07-21 08:27:46 zpf8861 阅读数 4512
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5927 人正在学习 去看看 杨波

现在app的开发进程会集成一些语音识别功能,而一般开发者是不具备自己开发一套语音识别引擎的,因此大多数情况是选择一个已经成熟的语音识别引擎SDK集成到自己的app中。

通常情况下,这种集成分两种,一种是直接调用SDK为开发者设计好的弹出框,开发者不需要开发识别交互界面;还有一种是开发者只利用SDK提供的语音识别服务,自己开发一个属于自己的交互设计。

本文介绍最简单直接调起弹出框的方法。

首先,测试机需要安装如谷歌语音、百度语音、讯飞语音等产品的语音软件,这时可以在系统设置界面的语言与输入处找到相关的语音识别功能列表。然后就可以直接调用了。

下面是调用的步骤:

首先:在Activity中实例一个intent,intent的action设置为RecognizerIntent.ACTION_RECOGNIZE_SPEECH或者RecognizerIntent.ACTION_WEB_SEARCH,关于RecognizerIntent可以查看本博客之前的文章,然后调用一个带返回结果的操作

<pre name="code" class="java">@Override
        public void onClick(View v) {
           Intent intent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
	     //Intent intent=new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
           startActivityForResult(intent, 0);
        }




然后:在返回结果中取出携带字符串RecognizerIntent.EXTRA_RESULTS对应的结果,android语音识别服务统一将结果以ArrayList<String>形式返回,如下代码

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        ArrayList<String> results = data
                .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
        Log.i("zpf", results.get(0).toString());
    }

另外,需要在配置文件中添加:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />


2017-03-20 10:27:37 kiba_zwei 阅读数 4217
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5927 人正在学习 去看看 杨波
现今语音识别已经做的十分成熟,微软的Cortana,苹果的Siri,还有讯飞、百度语音等。但是说到不花钱,单机运行还是Microsoft的Speech_Note语音识别系统比较省事。项目原因,最近做了个小的语音识别软件,一路心酸记录下来,以资备用。
开发平台:Visual Studio 2015

下载相关SDK

首先,得下载两个包:
   1)SpeechSDK51.exe                   (67.0 MB)    
   2)SpeechSDK51LangPack.exe     (81.0 MB)
先安第一个,再安第二个

然后,配置时,一个speechlib在引用中直接导入C:\Windows\System32\Speech\Common\sapi.dll,然后system.speech在引用—>程序集中搜索“speech”。

配置好后,可以写一个小的用例来测试一下模块是否安装成功。(这段是网上其他朋友的博客里抄来的,具体出处忘了,知道的朋友可以给我留言一下,我标注个参考文献,谢谢~)
using System.Speech.Recognition;
private void Form1_Load(object sender, EventArgs e)
        {
            SRE.SetInputToDefaultAudioDevice();     //  <======= 默认的语音输入设备,你可以设定为去识别一个WAV文件。
            GrammarBuilder GB = new GrammarBuilder();

            GB.Append(new Choices(new string[] { "选择", "Choose" }));
            GB.Append(new Choices(new string[] { "Green", "红色", "绿色" }));

            Grammar G = new Grammar(GB);
            G.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(G_SpeechRecognized);
            SRE.LoadGrammar(G);
            SRE.RecognizeAsync(RecognizeMode.Multiple);//<======= 异步调用识别引擎,允许多次识别(否则程序只响应你的一句话)
        }
        void G_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            //Text = e.Result.Text;
            MessageBox.Show(e.Result.Text);
            switch (e.Result.Text)
            {
                case "选择红色":
                    BackColor = Color.Red;
                    break;
                case "选择绿色":
                    BackColor = Color.Green;
                    break;
                case "Choose Green":
                    BackColor = Color.Green;
                    break;
            }
        }

逐字识别

在开发过程中,发现Speech_Note模块可以有两种辨识模式,一种是单词辨识。也就是上文代码中的,首先给他初始化一个单词库,这样语音识别可以每个词逐字匹配,正确率挺高的。问题在于,初始化库比较烦人,其次要是想拼接短语得做多次GB.Append(new Choices(new string[] { "选择", "Choose" }))这种操作。自适应性不好,而且,辨识一整句话比较困难。   
解决初始化单词库的问题,我用的是将整篇英文文章导入到单词库中,这样就省的人工输入。话不多说,直接贴代码。
        /*处理文档,删掉标点符号*/
        private void btn_TextProcessing_Click(object sender, EventArgs e)
        {
            string t = tbx_Article.Text;
            if (t == null || t == "")
            {
                MessageBox.Show("文本不可为空,请重新输入。");
                return;
            }
            else
            {
                t = t.Replace(",", "");
                t = t.Replace(".", "");
                t = t.Replace(";", "");
                t = t.Replace(":", "");
                t = t.Replace("'", "");
                t = t.Replace("\"", "");
                t = t.Replace("?", "");
                t = t.Replace("<", "");
                t = t.Replace(">", "");
                t = t.Replace("/", "");
                t = t.Replace("|", "");
                t = t.Replace("[", ""); t = t.Replace("]", "");
                t = t.Replace("{", ""); t = t.Replace("}", "");
                t = t.Replace("-", ""); t = t.Replace("_", "");
                t = t.Replace("+", "");
                t = t.Replace("=", "");
                t = t.Replace("(", ""); t = t.Replace(")", "");
                t = t.Replace("$", "");
                t = t.Replace("!", "");
                t = t.Replace("@", "");
                t = t.Replace("#", "");
                t = t.Replace("%", ""); t = t.Replace("^", "");
                t = t.Replace("&", ""); t = t.Replace("*", "");
                t = t.Replace("\r", " ");
            }
            tbx_Article.Text = t;
        }
        /*将单词存入数据库中以资备用*/
        private void btn_InputDataBase_Click(object sender, EventArgs e)
        {
            string[] arr = tbx_Article.Text.Split(' ');
            foreach (string i in arr)
            {
                int ex;
                string cmd;
                if (i == ""|i==null) 
                { 
                    continue; 
                }
                cmd = "SELECT * FROM `keystb` WHERE `Keys`='" + i.ToLower() + "'";
                ex = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, "select * from keystb", null).Tables.Count;
                try 
                { 
                    cmd = "INSERT INTO keystb VALUES ('" + i.ToLower() + "')";
                    ex = MySqlHelper.ExecuteNonQuery(MySqlHelper.Conn, CommandType.Text, cmd, null);
                }
                catch { continue; }
            }
            Common.getKeys();

            Form_Keys d = new Form_Keys();
            d.Show();
        }

这块处理的比较笨,貌似可以用正则表达式处理这个问题,奈何不会,知道的朋友求指教。

整句识别

这块引用了网上的一个类,具体出处知情者麻烦告知哈。谢谢

    public class SRecognition
    {
        public SpeechRecognitionEngine recognizer = null;//语音识别引擎  
        public DictationGrammar dictationGrammar = null; //自然语法  
        public System.Windows.Forms.Control cDisplay; //显示控件  
        public SRecognition(string[] fg) //创建关键词语列表  
        {
            CultureInfo myCIintl = new CultureInfo("zh-CN");
            foreach (RecognizerInfo config in SpeechRecognitionEngine.InstalledRecognizers())//获取所有语音引擎  
            {
                if (config.Culture.Equals(myCIintl) && config.Id == "MS-2052-80-DESK")

                {
                    recognizer = new SpeechRecognitionEngine(config);
                    break;
                }//选择识别引擎
            }
            if (recognizer != null)
            {
                InitializeSpeechRecognitionEngine(fg);//初始化语音识别引擎  
                dictationGrammar = new DictationGrammar();
            }
            else
            {
                MessageBox.Show("创建语音识别失败");
            }
        }
        public SRecognition(string[] fg,int i) //创建关键词语列表  
        {
            CultureInfo myCIintl = new CultureInfo("en-US");
            foreach (RecognizerInfo config in SpeechRecognitionEngine.InstalledRecognizers())//获取所有语音引擎  
            {
                if (config.Culture.Equals(myCIintl))
                {
                    recognizer = new SpeechRecognitionEngine(config);
                    break;
                }//选择识别引擎
            }
            if (recognizer != null)
            {
                InitializeSpeechRecognitionEngine(fg);//初始化语音识别引擎  
                dictationGrammar = new DictationGrammar();
            }
            else
            {
                MessageBox.Show("创建语音识别失败");
            }
        }
        private void InitializeSpeechRecognitionEngine(string[] fg)
        {
            recognizer.SetInputToDefaultAudioDevice();//选择默认的音频输入设备  
            Grammar customGrammar = CreateCustomGrammar(fg);
            //根据关键字数组建立语法  
            recognizer.UnloadAllGrammars();
            recognizer.LoadGrammar(customGrammar);
            //加载语法  
            recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);
            //recognizer.SpeechHypothesized += new EventHandler <SpeechHypothesizedEventArgs>(recognizer_SpeechHypothesized);  
        }
        public void BeginRec(Control tbResult)//关联窗口控件  
        {
            TurnSpeechRecognitionOn();
            TurnDictationOn();
            cDisplay = tbResult;
        }
        public void over()//停止语音识别引擎  
        {
            TurnSpeechRecognitionOff();
        }
        public virtual Grammar CreateCustomGrammar(string[] fg) //创造自定义语法  
        {
            GrammarBuilder grammarBuilder = new GrammarBuilder();
            grammarBuilder.Append(new Choices(fg));
            return new Grammar(grammarBuilder);
        }
        private void TurnSpeechRecognitionOn()//启动语音识别函数  
        {
            if (recognizer != null)
            {
                recognizer.RecognizeAsync(RecognizeMode.Multiple);
                //识别模式为连续识别  
            }
            else
            {
                MessageBox.Show("创建语音识别失败");
            }
        }
        private void TurnSpeechRecognitionOff()//关闭语音识别函数  
        {
            if (recognizer != null)
            {
                recognizer.RecognizeAsyncStop();
                TurnDictationOff();
            }
            else
            {
                MessageBox.Show("创建语音识别失败");
            }
        }
        private void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            TimeSpan ts= System.DateTime.Now.Subtract(System.DateTime.Now);
            //识别出结果完成的动作,通常把识别结果传给某一个控件  
            if (Common.t.Equals(new DateTime(2000, 1, 1, 21, 21, 21)))
            {
                Common.t = System.DateTime.Now;
            }
            else
            {
                ts = System.DateTime.Now.Subtract(Common.t);
            }
            //MessageBox.Show(ts.TotalSeconds.ToString());
            string text = e.Result.Text;
            //根据时间填入相应的标点
            if (ts.TotalSeconds < 5)
            {
                text += " ";
            }
            else if (ts.TotalSeconds < 10)
            {
                text += ", ";
            }
            else
            {
                text += ". ";
            }
            cDisplay.Text += text;
        }
        private void TurnDictationOn()
        {
            if (recognizer != null)
            {
                recognizer.LoadGrammar(dictationGrammar);
                //加载自然语法  
            }
            else
            {
                MessageBox.Show("创建语音识别失败");
            }
        }
        private void TurnDictationOff()
        {
            if (dictationGrammar != null)
            {
                recognizer.UnloadGrammar(dictationGrammar);
                //卸载自然语法  
            }
            else
            {
                MessageBox.Show("创建语音识别失败");
            }
        }
    }

具体引用过程是这样的~其中button1是开始,button2是结束。

private SRecognition sr;
private void button1_Click(object sender, EventArgs e)
        {
            sr.BeginRec(textBox1);
            button1.Enabled = false;
            button2.Enabled = true;

        }

        private void button2_Click(object sender, EventArgs e)
        {
            sr.over();
            button1.Enabled = true;
            button2.Enabled = false;
        }

这样可以大概完成一句话的辨识,但是从类的定义中 CultureInfo myCIintl = new CultureInfo(“zh-CN”);这句话可以看出,他是分语言的,所以要保证有行营的微软语音库,我这边说是中文系统的原因,只有中文的语音库,英文的库需要有英文的系统,这块我还没舍得卸了系统重新装。所以就先放下了。

整个项目完成,基本上功能大概如此。还是开篇一句,记录一下,以资备用。

没有更多推荐了,返回首页