2017-02-03 19:22:38 c910511 阅读数 1580
  • 2019年C语言基础教程【源码,笔记软件,案例】

    C语言概述 什么是C语言 一提到语言这个词语,自然会想到的是像英语、汉语等这样的自然语言,因为它是人和人交换信息不可缺少的工具。 而今天计算机遍布了我们生活的每一个角落,除了人和人的相互交流之外,我们必须和计算机角落。

    10669 人正在学习 去看看 传智

不久前开发过讯飞语音识别和小程序结合的系统,发表了一篇配置记录,有一些同学问一下问题,我再把我但是自己做的另外一篇记录发出来,给需要的同行参考一下。上一篇文章的地址:http://blog.csdn.net/c910511/article/details/54839160


1、添加jar
在项目的lib里面添加下面两个jar包即可

【本来打算上传到csdn的,突然上传不了,这个是讯飞的包,下载即可】


2、添加动态库


【本来打算上传到csdn的,突然上传不了,这个是讯飞的包,下载即可】

①、WIndow系统里面的动态库为dll,设置方法为以下三种,选择其中一种即可:
1,应用的当前运行目录;
2,由系统环境参数 Path 指定的目录;
3,System32 目录;
其中 1、应用的当前运行目录 设置的截图为


libmscxx是在linux系统里面用到的,macxx是在window系统用到的,后面的数字代表系统位数


②Linux系统的设置方法为
1,LD_LIBRARY_PATH指定的目录【设置没有成功过】;
2,/lib/ 和 /lib64/ 目录【设置成功】;


3、开发过程中遇到的错误和解决办法
a、java.lang.Unsatisfie.lang.UnsatisfiedLinkError no injava.library.path,或报20021的错误
解决办法:动态库libmsc64.so没有配置或者生效,需要配置

b、在错误中出现i386的错,但是你的系统是64位的系统,错误例如:The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/packages/lib/i386:/lib:/usr/lib
原因:jdk版本安装错误,系统是64位的系统,但是jdk装了32位的,动态库又用的是libmsc64.so,所以会出现这个问题,要把jdk安装为64位的jdk



2016-06-27 21:00:59 lw_power 阅读数 18648
  • 2019年C语言基础教程【源码,笔记软件,案例】

    C语言概述 什么是C语言 一提到语言这个词语,自然会想到的是像英语、汉语等这样的自然语言,因为它是人和人交换信息不可缺少的工具。 而今天计算机遍布了我们生活的每一个角落,除了人和人的相互交流之外,我们必须和计算机角落。

    10669 人正在学习 去看看 传智

在以前的项目中用到了百度语音识别服务,在这里做一个笔记。这里还是要和大家强调一下,最好的学习资料就是官网网站。我这里只是一个笔记,一方面整理了思路,另一方面方便以后我再次用到的时候可以快速回忆起来。

百度语音识别服务是什么?

百度语音识别服务能将语音文件(指定格式,不是所有格式都可以)识别成文本。语音识别我们都接触过,手机输入法里就有语音识别服务。

什么是百度语音识别的 REST API?

按照官网的说法

行业率先推出语音识别REST API,采用HTTP方式请求,可适用于任何平台的语音识别,给你最大的自由度!

简单说来,就是无须在开发者的项目中写入代码,或引入 jar 包 。 REST API 就是将音频文件转换成某种特定格式,通过 http 请求发送给百度语音识别的服务器,由百度语音识别的服务器进行语音识别,最后返回识别出的文本。

在我看来,她好在可以很方便的调用,我们自己不用去维护语音识别部分的代码,接入也十分简单,关键是她是免费的

使用的方式简单说来是
1、根据百度语音识别官方网站提供的
App ID 和 API Key 获取 accessToken。
2、根据上一步的 accessToken 连同其它请求参数一起向百度语音识别网关发出请求,获得识别的文本。

是不是觉得和微信公众平台的开发有点像?的确是这样的。微信公众平台的开发的确也是先获取 token,再通过 token 去请求其它数据。

集成步骤

本集成步骤参考了《Baidu_Voice_REST_API_Manual》。建议各位朋友先下载该资料学习。

第 1 步:注册成为百度开发者,创建应用,得到 API KeySecret Key

这一步非常简单,在官网上也有操作提示,这里就不多介绍了。
这里写图片描述

这里写图片描述

第 2 步:开通语音识别服务

开通语音识别服务的步骤也非常简单,大家可以自行操作或者参考官方文档。这里要注意:“ 语音识别” 服务初次开通成功后即可获得 50000 次/ 日 的在线调用次数配额。

如果我们每天调用的次数大于 50000 次,可以向百度申请提高次数,据说也是免费的,大赞。

以下的步骤就很关键了,因为我们要开始写代码了。

第 3 步:获取 Access Token

简而言之,就是向百度 OAuth2.0 授权服务的网关发出请求,将返回的数据(一般是字符串)进行解析,解析出我们想要的 Access Token。下面的图片截取自官网文档,写得非常详细了。

这里写图片描述

说明:其实就是使用 API KeySecret Key 和一个固定值的参数向百度 OAuth2.0 授权服务的网关发出 POST 请求,如果请求成功,则解析返回的字符串,从中解析出 access token 待用。

为了方便说明问题,下面代码没有应用良好格式,仅仅只是测试的方法,不建议直接应用于生产环境。

本例使用 HttpClient 框架发送 post 请求,HttpClient 的 Gradle 依赖为:

compile "org.apache.httpcomponents:httpclient:4.5.2"

示例代码:

/**
 * 获取 token,推荐用 POST 方法
 */
@Test
public void test01(){
    try {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost("https://openapi.baidu.com/oauth/2.0/token");
        List<NameValuePair> nvps = new ArrayList<>();
        nvps.add(new BasicNameValuePair("grant_type","client_credentials"));
        nvps.add(new BasicNameValuePair("client_id",apiKey));
        nvps.add(new BasicNameValuePair("client_secret",secretKey));
        httpPost.setEntity(new UrlEncodedFormEntity(nvps));
        ResponseHandler<String> responseHandler = new ResponseHandler(){

            @Override
            public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
                int status = response.getStatusLine().getStatusCode();
                if (status >= 200 && status < 300) {
                    HttpEntity entity = response.getEntity();
                    try {
                        return entity != null ? EntityUtils.toString(entity) : null;
                    } catch (ParseException ex) {
                        throw new ClientProtocolException(ex);
                    }
                } else {
                    throw new ClientProtocolException("Unexpected response status: " + status);
                }
            }
        };
        String responseBody = httpClient.execute(httpPost,responseHandler);
        System.out.println(responseBody);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

返回数据:

{"access_token":"24.463f2a9f7ce6721fe4d15568f812c086.2592000.1469627568.282335-7038695","session_key":"9mzdDxLM148MA1QmcNNrxGfLYBU9VokNbUY\/8WsJ1r4rUSev1bjP9GTKP6L6SVDnjx4BZxE5ZpJoqztA2K7O0MM9l0Z4","scope":"public audio_voice_assistant_get wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian","refresh_token":"25.f77abdb8f638404747dd969615c7b557.315360000.1782395568.282335-7038695","session_secret":"3efb3872a362beacab28879eed85497b","expires_in":2592000}

格式化以后:
这里写图片描述

我们须要从中解析出 access_token , json 字符串解析的框架有很多 fastjson、Jackson、json-lib、gson,这里就不多做介绍了。

另外还是要说明一下,因为 access_token 的有效时间是 2592000 (秒),即 30 × 24 × 60 × 60 (秒), 30 天,所以没有必要每一次请求都去获取 access_token ,建议把 access_token 放在应用的缓存里,如果失效了,再去获取,可以提高应用的效率,这一点和微信公众平台开发是一样的。

第 4 步:根据 Access Token 调用语音识别接口(隐式发送)

说明:我们这里采用的是隐式发送,即不发送真实的音频文件,而是发送音频文件转换而成的字节数组。这里一定要看官网说明,严格调用,才会识别出理想的结果。难点是音频格式的转换。

我是看了官网说明文档和示例代码,经过反复调试才得以调用成功的。鉴于这里篇幅的限制,请大家先看官网说明文档,我这里就不复制了。

这里为了方便说明,先上示例代码,同样地该代码只是为了便于说明问题,不建议在生产环境中直接使用:

/**
 * 识别英文
 */
@Test
public void test02(){
    recognize("voice_en.wav","en");
}

上面的测试方法调用了语音识别的方法,该方法传递两个参数,一个是文件的全路径,另一个是中文或者英文的参数。

下面

/**
  * 请求语音识别的时候使用
  */
 private static final String speech_recognition_url = "http://vop.baidu.com/server_api";
private void recognize(String wavName,String language){
    File wavFile = new File(wavName);
    HttpPost httpPost = null;
    CloseableHttpResponse response = null;
    CloseableHttpClient httpClient = HttpClients.createDefault();
    httpPost = new HttpPost(speech_recognition_url);
    SpeechRecognitionRequestEntity requestEntity = new SpeechRecognitionRequestEntity();
    // 语音压缩的格式:请按照官网文档填写 pcm(不压缩)、wav、opus、speex、amr、x-flac 之一,不区分大小写
    requestEntity.setFormat("wav");
    // 声道数,仅支持单声道,请填写 1
    requestEntity.setChannel("1");
    // 采样率,支持 8000 或者 16000 (这个类型是 int ,不能设置为 String 类型,关于采样率如何转换,请见下文)
    requestEntity.setRate(16000);
    // todo 这里应判断 AccessToken 是否过期,处理异常,如果过期了,应该重新获取 accessToken
    requestEntity.setToken("24.463f2a9f7ce6721fe4d15568f812c086.2592000.1469627568.282335-7038695");
    // Cuid 貌似可以随意填写
    requestEntity.setCuid("goodluck");

    requestEntity.setLen(wavFile.length());
    // 官网说: speech 要传递真实的语音数据,需要进行 base64 编码
    // 重点关注:请见后面封装的方法,就是把一个文件转换成为指定格式的字节数组
    requestEntity.setSpeech(handlerWavFile(wavFile));
    // 语种选择,中文=zh、粤语=ct、英文=en,不区分大小写,默认中文
    requestEntity.setLan(language);
    // 关键点 1 :将请求参数转换为 json 格式
    String requestEntityJson = JSON.toJSONString(requestEntity);
    // 关键点 2 :封装 StringEntity ,为解决中文乱码问题,应该设置编码
    StringEntity entity = new StringEntity(requestEntityJson.toString(), "UTF-8");
    entity.setContentEncoding("UTF-8");
    // 关键点 3 :设置 StringEntity 的 ContentType
    entity.setContentType("application/json");
    httpPost.setEntity(entity);
    ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
        @Override
        public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
            String resData = null;
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode >= 200 && statusCode < 300) {
                HttpEntity httpEntity = response.getEntity();
                resData = EntityUtils.toString(httpEntity,"utf-8");
                EntityUtils.consume(httpEntity);
            }
            return resData;
        }
    };
    try {
        String responseStr = httpClient.execute(httpPost,responseHandler);
        System.out.println(responseStr);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

SpeechRecognitionRequestEntity 类(省略了 get 和 set 方法):

public class SpeechRecognitionRequestEntity {

    // 语音压缩的格式
    private String format;

    /**
     * 注意,采样率的数据类型一定是 int,不能是 String
     */
    // 采样率,支持 8000 或者 16000,在我们的项目中,写 16000
    private int rate;
    // 声道数,仅支持单声道,请填写 1
    private String channel;
    // 开发者身份验证密钥
    private String token;
    // 用户 ID,推荐使用设备 mac 地址 手机 IMEI 等设备唯一性参数
    // todo 貌似可以随意填写,唯一即可
    private String cuid;

    /**
     * 注意:这里填写的是原始语音的长度,不是使用 base64 编码的语音长度
     */
    // 原始语音长度,单位字节
    private long len;
    // 真实的语音数据,需要进行 base64 编码
    private String speech;
    // 语种选择,中文=zh、粤语=ct、英文=en,不区分大小写,默认中文
    private String lan;
}

这部分代码摘抄自官网示例代码:

private byte[] loadFile(File file) throws IOException {
    InputStream is = new FileInputStream(file);
    long length = file.length();
    byte[] bytes = new byte[(int) length];
    int offset = 0;
    int numRead = 0;
    while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
        offset += numRead;
    }
    if (offset < bytes.length) {
        is.close();
        throw new IOException("Could not completely read file " + file.getName());
    }
    is.close();
    return bytes;
}

返回结果:

{"corpus_no":"6300874524819907792","err_msg":"success.","err_no":0,"result":["one day in the cage club got bad news, ","one day in the case club got bad news, ","one day in that case club got bad news, ","one day in the cage club got the bad news, ","one day in the case club got the bad news, "],"sn":"843115237281467036671"}

格式化以后:
这里写图片描述

以上介绍了代码如何编写。但是在开发中,我遇到了一个难题,要将音频文件转换成百度语音识别能够识别的格式。请看官方文档说明。

这里写图片描述

于是,为了测试,我使用格式工厂软件进行格式转化。以下是格式转换的参数。
这里写图片描述
很高兴的是,经过格式工厂软件转换以后的音频文件能够被百度语音识别 REST 服务识别,识别度还不错,这是令人兴奋的。

但是,我又遇到了另一个问题,在服务器上总不能每个从客户端传来的音频文件都用格式工厂转换吧。于是,我找到了 Linux 平台上一款很好用的软件 sox。使用 sox 命令进行格式转换的命令格式:

sox 原始文件名全路径 -r 16000 -c1 生成的文件名全路径

接下来,我又继续查找资料,在 Linux 上调用 Linux 平台上的服务可以使用Java 中的 Runtime 和 Process 类运行外部程序。
参考代码:

String[] cmdStrings = new String[] { "/usr/bin/sox", tempWavFileName, "-r", "16000", "-c1", soundFileName_16000 };
Process psProcess = Runtime.getRuntime().exec(cmdStrings);
psProcess.waitFor();

到这里,语音识别开发的难点都攻克了。现在总结下来,真的是收获了不少。在这里先做个记录,有些知识点的掌握我还不是很透彻,后续还要再完善一下。

2018-03-19 17:37:22 pelhans 阅读数 4585
  • 2019年C语言基础教程【源码,笔记软件,案例】

    C语言概述 什么是C语言 一提到语言这个词语,自然会想到的是像英语、汉语等这样的自然语言,因为它是人和人交换信息不可缺少的工具。 而今天计算机遍布了我们生活的每一个角落,除了人和人的相互交流之外,我们必须和计算机角落。

    10669 人正在学习 去看看 传智

欢迎大家关注我的博客 http://pelhans.com/ ,所有文章都会第一时间发布在那里~

尽管基于GMM-HMM的语音识别模型已基本被神经网络所取代,但其背后的思想和处理方式仍需要我们仔细学习。

第四讲

自动语音识别(automaic speech recognition)就是建立一个将声学信号转化为文字的系统,而自动语言理解则更进一步,它需要对句子的含义进行理解.

一个性能良好的ASR系统面临如下挑战:

1) 语音识别任务中存在大量的词汇.

2) 语音的连续性,流畅性,通用性.

3) 信号道以及噪音问题.

4) 说话者的口音.

因此在本讲及下讲我们讲介绍一个简单的大尺量ASR系统(LVCSR).

语音识别系统的结构

噪声道模型

基于HMM的语音识别系统讲语音识别任务看做”噪声道模型”.即若我们知道噪声是如何扰乱源信号的话,我们就能通过尝试每个可能句子来找到正确的源句子对应的波形,而后判断其与输出的匹配程度.下图为噪声道模型的图示.


假如最终我们采用概率来评估结果的好坏,那么就讲语音识别问题转化为贝叶斯推断的特例.同事由于英语中的状态空间会很大,因此我们不能完全对其遍历.这也就带来了解码的问题.幸好随着技术的发展,我们可以使用Viterbi算法来方便的进行解码.

语音识别中的基本公式

为了表明问题,我们先定义一些变量.

1) 声学输入O定义为HMM中的可观测量.通常来讲,它是通过对波形文件进行分帧处理得到的声学特征向量.

O=o1,o2,o3,,ot

2)句子是由一系列的单词w组成的:

W=w1,w2,w3,,wn

有了以上的定义,根据ASR的任务要求,我们要在给定声学输入O的情况下找出最有可能的字符串输出W,用公式表达为:

Wmax=argmaxWLP(W|O)

因此我们要计算P(W|O),利用贝叶斯公式得:

Wmax=argmaxWLP(W|W)P(W)P(O)

由于我们要针对W进行优化,而输入O是不变的,因此公式简化为:

Wmax=argmaxWLP(O|W)P(W)

在上式中,
P(O|W)成为观察序列的似然值(Likelihood),由声学模型(Acoustic Model, AM)提供,P(W)称为先验概率,由语言模型(Language model, LM)提供.

对于LM的获得由多种途径,LM的形式也多种多样,一般情况下我们采用N-gram作为我们的语言模型,N取值在3-5之间.之前我使用的百度Deepspeech框架和谷歌Wavenet框架的语言模型都是通过Kenlm获取的N-gram语言模型.

语音识别框架

下图给出语音识别系统的三个步骤:


  • 第1阶段为特征抽取阶段或称之为信号处理阶段.在该阶段我们先将声学波形文件按时间切分为一帧一帧的片段,一般以10/15/20 毫秒为一帧时间.在分为帧后我们通过变化将其转化为特征频谱,对于每帧我们用39个特征向量来表示它.(在采用MFCC时是13*3=39个特征,后面会讲到).

  • 第二阶段是声学模型建立或音素识别阶段.在该阶段我们对特征向量计算似然值,如采用高斯混合模型(Gaussian Mixture Model, GMM)来计算HMM的隐态q(对应于音素或子音素)的似然值P(o|q).

  • 第三阶段是解码阶段,我们将声学模型和HMM的单词发音词典和语言模型结合来得到最优可能 的文本序列.之前大部分的ASR系统都是用Viterbi算法进行解码(真的很好用…).

HMM在语音识别中的应用

在语音识别任务中,隐藏状态q对应于音素,部分音素或单词.可观察量是波形文件帧的频谱和能量信息.解码过程就是将声学信息映射到音素和单词.

下图给出基本的HMM音素状态结构概览,例子中的单词是”six”:


这个单词由四个音素组成(emitting states),加上开始和终止状态.转移概率A表示状态间的转移,观察概率B表示每个音素的似然度.需要注意的是除初始和终止状态外,音素状态可以向下一个音素状态转移,也可以转移到自身.但不能向前一个状态转移,这种从左到右的HMM结构叫做Bakis网络.状态循环回自身允许模拟单因素持续时间较长的情况.

为了捕捉音素在时间长度上的非均匀性,在LVCSR中我们通常将一个音素用多个HMM状态来表示.其中最常用的是采用开始(beginning),中间(middle),结束(end)状态.因此每个音素都对应与HMM的三个状态(对于单个词还会有开始和结束状态).下图给出5状态的HMM音素模型事例.此时我们要想建立一个基于子音素的声学模型,我们只需讲之前的单音素换成HMM的3音素状态,讲讲开始和结束状态换成上下链接的音素状态,最终一句中只保留一个开始和一个结束状态即可.图9.8给出了样例.




综上所述,对于HMM在ASR的应用中,我们得到了如下对应关系:

1) Q=q1,q2,qN   表示子音素对应的状态,HMM中的隐态.

2) A=a01a02an1ann   表示转移概率矩阵A,矩阵中的每个元素aij表示子音素转移到下一个子音素或回到自身的概率.

3) B=bi(ot)   可观测态的似然值.也叫发射概率.表示由子音素状态i生成倒谱特征向量ot的概率.

建立声学模型

经过上面的介绍后,我们现在将给出:给定HMM状态时的输入特征向量似然度,bt(i).

高斯密度函数(Gaussian PDFs)

在很久之前,人们会使用矢量化(Vector quantization, VQ)来计算声学模型,但对于变化多端的语音信号来对,小规模的codewords不足以充分表达这种变化,因此人们采用直接计算连续特征向量输入来得到声学模型.这种声学模型基于连续空间中的概率密度函数(Pribability density function, PDF).其中最常用的就是GMM PDFs啦,虽然其他的如SVMs,CRFS也在用但是最常用的还是它.

单变量高斯分布的定义及均值方差的公式这里就不多写,大家应该都知道.这里直奔主题.

我们采用单变量高斯密度函数来估计一个特定的HMM状态j生成的一维特征向量ot,这里假设ot满足正态分布.通俗一点表达就是我们用一个高斯函数来表示可观察变量的似然函数bj(ot).赢公式表达就是:

bj(ot)=12πσj2exp((otμj)22σj2)

好了,定义完b后我们就可以采用Baum-Welch算法来训练HMM啦~.根据该算法,我们首先计算ξt(i),然后计算均值μσ:

μi=t=1Tξt(i)ott=1Tξt(i)

σi2=t=1Tξt(i)(otμi)t=1Tξt(i)

这样我们根据EM算法进行迭代就好啦~

多元高斯函数

由于一个可观察特征向量有39个特征,因此单变量高斯分布并不能满足我们的要求.于是很自然的我们想用一个D=39维的多元高斯分布来搞事情.多元高斯函分布的公式为:


对应的协方差期望为:


因此,我们可以得出多元高斯分布的bj(ot):


对于实际应用中来说,尽管一个完全的协方差矩阵Σ可能更有利于对声学模型建模,但会增加计算消耗和太多的参数.因此我们讲采用对角协方差矩阵来代替完全协方差矩阵.这样我们就可以对上式进行简化:


这样在获得了b后我们同样采用Baum-Welch算法等进行迭代.

高斯混合模型

上面的模型看起来虽然很好,但它的前提假设是每个特征是正态分布的,这对于实际中的特征来说假设太强了,因此在实际应用中我们往往一个加权的混合多变量高斯分布.我么称之为高斯混合模型或GMM.下面给出该分布的定义式以及对应的输出似然函数bj(ot):




好了,按照惯例,我们知道了b又要用Baum-Welch算法了…(真的很简单粗暴直接有效…竟然可以从数据中自动习得那个观察量来自哪个组分….)


上式就是在Baum-Welch算法中的ξt定义, 需要注意的是这里的ξ下角标和公式中的对应部分下角标多个一个m表示第m个混合组分.得到ξ后再对下面三个值进行更新就OK啦~


需要提一句的是,在实际应用中,为了减少计算量,往往会采用概率的对数来进行计算.这样上面的公式都会对应的有一些变形,但其主要思想并没有变.

字典和语言模型

字典是指包含大量词汇的列表,同时在每个词后还带有音素级的发音.语言模型现在常用的就是N-gram语言模型,可以采用的工具很多,百度采用的是Kenlm语言模型,它是一个基于C++的N-gram语言模型,输入是分好词的文本,输出就是语言模型了,同时还可以将语言模型存为二进制文件方便存储调用.

絮叨

昨天一口气把Speech and language processing 中的语音识别那章看完了,但今天打算总结的时候发现内容蛮碎的,写在一个里面太多了,斯坦福那面也是拆开讲的,因此本讲为GMM-HMM的第一部分,下一讲将会有MFCC特征提取,搜索-解码,Embedding training哦~

2018-11-11 22:05:57 qq_38292541 阅读数 244
  • 2019年C语言基础教程【源码,笔记软件,案例】

    C语言概述 什么是C语言 一提到语言这个词语,自然会想到的是像英语、汉语等这样的自然语言,因为它是人和人交换信息不可缺少的工具。 而今天计算机遍布了我们生活的每一个角落,除了人和人的相互交流之外,我们必须和计算机角落。

    10669 人正在学习 去看看 传智

语音识别方法

基于参数模型的隐马尔科夫模型(HMM)的方法和基于非参数模型的矢量量化(VQ)的方法。

基于人工神经网络(ANN)的语音识别方法。

传统的会与动态时间规划的算法(DTW),在连续语音识别中仍然是主流方法。同时,在小词汇量、孤立字识别系统中,也已有许多改进的DTW算法被提出。提高系统的识别性能,利用概率尺寸的DTW算法进行孤立字识别的方法,取得较好的识别效果。

在语音识别中,一般采用K平均最临近(K-NN)准则来进行决策。因此选择适当的各种距离测度是问题的关系。往往需要通过实验多次调整这些门限值才能得到满意的识别结果。

 

HMM模型的不足,特征矢量的输出概率计算以及输入语音和语音模型的匹配搜索将占用很大的时间。

 

语音识别系统的基本数据库

语音识别系统中包含了大量的控制参数信息,这些参数以数据库的形式存储在计算机中,构成了语音识别系统的基本数据库。包括词汇表、语音声学模型、语音模型参数等。它们是通过“训练”的方法,从单讲话者或多讲话者的多次重复发音的语音参数以及大量的语法规则中,经过长时间的训练而聚类得到的。在汉语语音识别尤其是汉语连续语音识别中,必须零这些文本等信息才能提高识别精度。

  1. 单词词典和语法
  2. 词典编辑、文本开发和工具
  3. API

 

语音识别原理和识别系统的组成

  1. 预处理和参数分析
  2. 抗噪声
  3. 语音区间的端点检测

目的:从包含语音的一段信号中确定语音的起点和终点。有效的端点检测不仅能使处理时间减到最小,而且能排除无声段的噪声干扰,从而使识别系统 具有良好的识别性能。

  1. 语音参数分析

目的:抽取语音特征,以使在语音识别时类内距离尽量减小,类间距离尽量大。特征参数选择的好坏直接影响语音识别的精度。

 

动态时间规整

不能简单地将输入参数序列和相应参数模板直接做比较,因为语音信号具有相当大的随机性。在进行模板匹配时,这些时间长度的变化会影响测度的估计,从而使识别率降低,因此时间规整处理是必不可少的。

一种简单的方法是采用对未知语音信号线性地伸长或缩短直至它与参数模板的长度相一致。然而这种仅仅利用亚扩时间轴的方法不足以实现精确的对正。研究表明,这种简单方法在大部分识别系统中不能有效地提高识别率。

DTW不断计算两矢量之间的距离以寻找最优的匹配路径,所以得到的两矢量匹配时累计距离最小的规整函数,保证了他们之间存在最大的声学相似特性。

 

孤立字识别系统

顾名思义是识别孤立发音的字或词。由于在孤立字(词)识别中,单词之间有停顿,可使识别问题简化;单词之间的端点检测比较容易。

识别方法:

  1. 采用判别函数或准则的方法。贝叶斯准则,概率统计的方法。
  2. 采用DTW的方法,字音的起始点相应于路径的起始点。最优路径起点至终点的距离即为待识别语音与模板语音之间的距离。运算量大,但技术上简单,识别正确率也较高。
  3. 再用矢量量化的方法。矢量量化技术在语音识别的应用方面,尤其是在孤立字语音识别系统中得到了很好的应用。
  4. 采用HMM技术的方法。HMM的各状态输出概率密度函数即可能用离散概率分布函数表示,也可以用连续概率函数。一般连续隐马尔科夫模型要比离散隐马尔科夫模型 计算量大,但识别正确率高。
  5. 人工神经网络
  6. 采用混合技术的方法。为了弥补单一方法的局限性,采用把几种方法组合起来的办法。

在语音识别中,孤立单词识别时基础。词汇量的扩大、识别精度的提高和计算发咋的的降低是孤立字识别的3个主要目标。关键问题是特征的选择和提取、失真测度的选择以及匹配算法的有效性。矢量量化技术则为特征参数提取和匹配算法提供了一个很好的降低运算复杂度的方法。

 

连接语音识别系统系统的性能评测

1.连续语音识别系统的评测方法以及系统发展性和识别能力的测度

评测比较重使用的标准系统的一般配置是:使用LPCMCC(LPC美尔倒谱系数)或者MFCC特征参数、Bi-Gram语音模型以及2段DP匹配法(由基元模型联结得到最佳单词序列)等。

系统识别性能的评价测度主要由系统识别率、信息损失度、使系统的识别率和人的听取率相当而应附加给系统的噪声级别大小。

粗略地评估某个系统,可以从两个方面去考虑:

  1. 系统识别任务的难易程度及复杂化性
  2. 采用该系统该系统的识别方法对该难度的识别任务的识别效果即识别精确性。

一、评价连续语音识别系统性能的系统识别率等测度

二、评价系统识别任务复杂性的测度

表示在语言模型规定下的系统识别任务复杂性的测度主要由系统静态分支度和平均输出度、系统识别任务的熵和识别单位的分支度。

2018-11-20 08:18:49 qq_35401219 阅读数 39
  • 2019年C语言基础教程【源码,笔记软件,案例】

    C语言概述 什么是C语言 一提到语言这个词语,自然会想到的是像英语、汉语等这样的自然语言,因为它是人和人交换信息不可缺少的工具。 而今天计算机遍布了我们生活的每一个角落,除了人和人的相互交流之外,我们必须和计算机角落。

    10669 人正在学习 去看看 传智

语音识别数学表示:argmax p(W|O)=argmax p(O|W)p(W)
W:输出的文本序列
O:输入的语音波形序列
语音识别两大组成部分:
1:p(O|W),在给定的文本序列下,模型生成语音波形序列的概率
称为声学模型(Acoustic Model) 占据主要的计算任务
2:p(W),表示输出W文本序列的概率
称为语言模型(Language Model)

语音识别的过程:
声波:

预处理(前端处理):
1,首尾端静音切除,减少对后续操作的干扰
2,降噪
3,分帧,一般取20-30MS,分帧后的稳态信息才可以进行信号处理。
在这里插入图片描述
移动窗口实现,每次往前移动10MS进行分帧,交替部分为了保持语音信息的上下文联系

声学特征提取(语音特征):
理解:语音的波形在一维时间上无法进行描述,不能作为输入在模型中进行训练,所以要进行波形的变换(FFT快速傅里叶变换),将其他的参数作为语音特征。

目前最常用的语音特征:MFCC(梅尔倒谱系数)
梅尔频率倒谱系数:将线性频谱映射到基于听觉感知的Mel非线性频谱中,再进行倒谱分析得到特征参数。
过程:
在这里插入图片描述
将普通频率转化到Mel频率的公式:
在这里插入图片描述

Mel滤波:将不统一的频率转化成统一的频率,如果两端语音的Mel频率相差两倍,那么人耳听起来的音调也相差两倍。
在这里插入图片描述
倒谱分析:取对数加逆变换(DCT离散余弦变换),得到一组系数(12个),这组MFCC就是这帧语音的特征,对于一段划分为N帧的语音,那么输入矩阵的大小就是12*N。

神经网络:
RNN模型(循环神经网络recurrent neural network):
处理序列数据,即数据在时间或者次序上具有前后联系,很明显语音信号是具有强烈的前后联系的。
在这里插入图片描述

RNN的正向传播:
在这里插入图片描述

模型的参数训练:反向传播梯度下降算法。
目前使用较多的两种RNN的变形:
LSTM模型(长短时记忆网络),解决RNN前后文关联序列距离太长时引起的梯度消失问题
改进处:增加了3个门运算,“遗忘门”,“输入门”,“输出门”
每个LSTM单元都包括三个输入:上一时刻的单元状态Ct-1、上一时刻的单元输出ht-1,以及当前时刻的输入Xt
在这里插入图片描述
处理机制:
遗忘门:主要计算需要丢弃哪些信息
在这里插入图片描述
在这里插入图片描述
输入门:用于计算哪些信息保存在状态单元中
在这里插入图片描述

在这里插入图片描述
最后由之前得到的遗忘门的输出ft以及上一时刻状态Ct-1的积加上输入门两部分的乘积得到当前时刻的单元状态Ct

在这里插入图片描述
输出门:通过sigmoid函数计算需要输出哪些信息,与当前的状态Ct经过tanh函数后进行乘积得到当前的输出
在这里插入图片描述

总结:从LSTM的网络模型可以看出来,其实LSTM实际上是通过多次累加运算,使得在梯度下降求解时,不会因为链式法则的求导连乘而导致经过sigmoid函数的输出值越来越小直至趋向于0,导致梯度消失的情况。
例如RNN神经网络,他的当前状态计算公式是St=f(Xt,St-1),如果关系距离过远,会导致梯度消失的问题。

GRU模型(门控制循环单元):属于LSTM的一个变形,基于LSTM较为复杂的门结构,改为了只有两个门运算,
分别为更新门和重置门,原理差不多。

损失函数:CTC loss function(Connectionist temporal classification)。。。。。。。??

语言模型:自然语言处理,根据声学模型的输出,给出最大概率的文本输出。
N-gram。。。。?基于RNN的语言模型。。。??

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