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

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

    11650 人正在学习 去看看 传智

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

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

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

什么是百度语音识别的 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();

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

2020-03-22 11:25:13 idl1ng 阅读数 13
  • 2019年C语言基础教程【源码,笔记软件,案例】

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

    11650 人正在学习 去看看 传智

语音识别(笔记)

自动语音识别的定义:
语音识别技术,也被称为自动语音识别Automatic Speech Recognition,(ASR),其目标是将人类的语音中的词汇内容转换为计算机可读的输入,例如按键、二进制编码或者字符序列。
语音识别只有一个核心任务:
搜狗百科

将人类的语音转成文字

语言由单词组成

单词由音素组成

机器要做的就是:

1. 将一段声波按帧切开

2. 用帧组成状态

3. 用状态组成音素

4. 再将音素合成单词

语音就变成了文字

graph LR
语音识别应用-->声纹识别
语音识别应用-->语音合成
声纹识别-->智能音箱
语音合成-->智能音箱
声纹识别-->车载设备
语音合成-->车载设备

声纹识别:即识别说话者是谁

语音合成:即将文字信转换成人类听得懂的语音


影响语音识别的原因很简单

口音、距离、噪音都会影响语音识别的准确度

最好选个安静的环境

视频链接

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

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

    11650 人正在学习 去看看 传智

欢迎大家关注我的博客 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 阅读数 310
  • 2019年C语言基础教程【源码,笔记软件,案例】

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

    11650 人正在学习 去看看 传智

语音识别方法

基于参数模型的隐马尔科夫模型(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-06-19 19:44:30 greenqingqingws 阅读数 1199
  • 2019年C语言基础教程【源码,笔记软件,案例】

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

    11650 人正在学习 去看看 传智

商业银行智能语音识别技术

一、语音识别技术概述

基础概念

  • 自动语音识别ASR
  • 语音到文本STT
  • 精准识别和翻译语音信息

1、语音识别技术发展

  • 基于深度神经网络模型进行建模

2、语音识别的分类

  • 根据说话人的不同
    • 特定人语音识别
    • 用来对特定人的说话内容进行识别,同时基于说话人的声纹信息,应用声纹鉴别技术,实现基于声音的身份识别
    • 非特定人语音识别
    • 通过采集大量语音数据来进行训练建模,实现非特定人的语音识别,可以被任何说话人使用,更符合实际需要,通常要难于针对特定人的语音识别任务。
  • 根据识别词汇对象的不同
    • 孤立词识别
    • 识别事先已知的词语,可应用到自动控制领域
    • 连续语音识别
    • 识别自然交流的连续语音,可应用于语音输入系统
    • 关键词识别
    • 从连续语音中检测出特定关键词出现的位置,而不需要识别出整个句子,可应用于语音监听任务。
  • 根据识别服务的实现方式
    • 云端方式
    • 依赖网络并依托强大的后台模型,识别更准确,例如基于云端的语音助手工具
    • 离线方式
    • 不依赖于网络,应用场景更灵活,但识别精确度受到计算资源的限制,一般离线识别会结合专用芯片,通过压缩模型规模,将计算量控制在合理的水平。

3、语音识别技术原理

  • (1)预处理
    • 主要包括对输入的原始语音信号进行采样,去除个体发音差异以及设备环境等引起的背景噪声,通过分帧将语音信号切分为短片段,并运用端点检测技术确定出语音的起点和终点。
  • (2)特征提取
    • 主要包括从预处理过的语音信号中,抽取出反映语音本质的特征参数,形成特征矢量序列。通常由频谱衍生出频率倒谱系数(MFCC),使用长度为10ms的帧分割语音波形,然后从每帧中提取出特征向量。
  • (3)声学模型训练
    • 基于语音数据库进行训练,通过计算语音特征和发音模板的相似度,为每个声学单元建立模型参数,识别时将待识别的语音特征参数与训练得到的声学模型进行匹配,获得识别结果。传统语音识别系统大多采用GMM-HMM进行声学模型建模。
  • (4)语音模型训练
    • 根据语言的语法规则,对训练文本数据库进行语法、语义分析,建立描述给定词序列在语言中出现的概率分布,在给定若干个词的情境下能够判定下一个最可能出现的词语,缩小搜索范围,进而提高语音识别性能以及准确率。
  • (5)语音解码
    • 语音解码指语音技术中的识别过程,针对输入的原始语音信号,经预处理和特征提取后,结合训练得到的声学模型、语言模型以及发音字典建立一个识别网络,运用搜索算法寻找到最佳路径,进而获取该语音信号对应的最优词串。

4、深度学习和语音识别技术

  • 深度学习
    • 深层结构化学习,是一种基于学习数据表征的机器学习方法,通过构建多隐藏层神经网络,组合低层特征形成更加抽象的高层表示特征,以此提升分类或预测的准确性。
  • 语音信号
    • 一种非平稳的随机信号,人脑对其感知的过程是一个复杂的信号处理过程,深度学习可通过模仿人脑对语音信号的处理方式,以层次化的方式进行处理,因此比传统的模型更适合于语音信号处理。
  • 深度学习优化版
    • 级联系统
    • 运用深度神经网络DNN进行特征提取,优于使用传统特征训练的GMM-HMM识别系统。
    • 可以联合特征的上下文信息形成长时特征矢量
    • 具有深层次的非线性变换能力
    • 能从有限的数据中挖掘出更多的信息
    • 混合系统
    • 在GMM-HMM声学模型基础上,用DNN替换高斯混合模型(GMM)来计算输出概率密度函数,其中的DNN可替换为其他的深度学习架构,比如循环神经网络RNN、卷积神经网络CNN等,不需要重新设计整个传统声学模型系统。
    • 端到端模型
    • 基于深度神经网络完成从输入特征向量到输出结果的整个过程,声学模型和语言模型通过后端解码进行融合,与传统识别过程相比,不需要进行分帧以及帧级别的标注操作。
    • 实现方法
      • 方法一:采用连续时序分类CTC和长短记忆网络LSTM结合的声学模型,对语音的音素序列和对应的语音特征序列进行序列层面建模
      • 方法二:基于编码解码模型以及注意力模型,直接实现从语音声学特征序列到最终词序列的输出。

二、智能语音识别技术在商业银行中的应用

4I应用架构

  • 1、Input信息输入:听得见
    • 语音识别的主要应用
    • 应用场景:将语音数据自动转换为文本数据,实现自动信息输入。
    • 主要功能
    • 1、将音频数据转换为文本数据
    • 2、为进一步开展智能文本挖掘和自然语言处理积累大量文本信息语料。
    • 商业银行运营环境的应用点
    • 简化柜台人员业务操作流程
    • 实现客户经理拜访客户后的报告口述撰写等场景
    • 案例
    • 柜台操作简化流程
      • 通过引入语音识别系统,可以将客户需求直接转化为系统可识别的文本内容,柜台人员仅需针对录入的信息进行复核校验,减少客户填写各种凭证的时间以及运营人员录入信息的时间,从而减少客户等待时间,提升服务效率。
    • 银行一线人员走出网点 对客户进行拜访流程
      • 应用语音识别技术可直接将客户经理的口述转换为文字报告,不需要撰写访谈报告对客户情况及交谈内容进行记录,提升工作效率。
  • 2、Inspection实时监察:听得懂
    • 应用场景
    • 需要在银行服务人员与客户交流过程中实时识别出客户需求点及业务风险点,支持更精准地对客户提供个性化服务,同时保证业务合规性。
    • 功能
    • 通过在语音识别技术的基础上架构索引机制、引入文本挖掘和自然语言处理技术支持,对实时“听”到的文字在“关注”字词库里进行搜索。
    • 应用点
    • 当客户在柜台办理业务时,通过对客户与窗口人员的交谈内容进行实时监察。
      • 一、可以及时识别银行员工话术的合规性。当业务人员出现不当销售、违规引导时,系统及时跳出提醒标识对银行人员进行警示,尽可能避免对客户和银行权益造成损害。
      • 二、银行可以实时发现客户的业务需求,并及时让窗口人员予以相关产品的推介。当客户的需求与本行产品及服务核心关键词相匹配时,系统展示产品信息及相关话术对业务人员进行提示,进一步提升销售成功率。
      • 三、通过对客户语言文本的分析,及时发现客户是否存在负面情绪,辅助业务人员减少不当处理,及时调节、化解业务办理中可能发生的客户纠纷。
  • 3、Interaction沟通交互:有交互
    • 应用场景
    • 自助机具操作
    • 电话银行自动应答
    • 银行呼叫中心自动回访
    • 厅堂机器人服务交互
    • 外籍客户服务提升
      • 同声传译
    • 手机银行
    • 微信银行
    • 功能
    • 通过语音合成、声向定位、语义理解、机器翻译技术结合
    • 识别语音中的要求、请求、命令或询问来做出正确的响应
  • 4、Identification身份验证:认得出
    • 通过声纹识别实现客户身份验证
    • 通过每个人独特的声音直接辨识客户,无需设定、记住和键入密码等操作。
    • 基于语音的身份验证
    • 非接触
    • 非侵入
    • 易用性强
    • 通过建立客户声纹库并对语音中的声纹鉴别,银行可有效对客户进行识别、历史档案查询、信息检索与推荐。)
没有更多推荐了,返回首页