2019-04-23 09:36:24 qq_44944990 阅读数 514
  • C++语音识别开篇

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

    5927 人正在学习 去看看 杨波
                     

introduction

word-spotting,audio indexing,spoken term detection
输出的是word lattice,根据lattice计算关键词的后验概率。

ATWV=mean(N correct (s)N true (s) βN spurious (s)TN true (s) ) ATWV=mean(Ncorrect(s)Ntrue(s)−βNspurious(s)T−Ntrue(s))
的后验概率和,乘以一个term无关的系数。


problems

out-of-vocabulary word
online systerm for real-time task


reference

rapid and accurate spoken term detection
kaldi keyword search code

           
2019-06-27 14:10:49 sinat_39291423 阅读数 2371
  • C++语音识别开篇

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

    5927 人正在学习 去看看 杨波

现在语音识别已经被广泛的应用到各个领域中,在Unity开发中,语音识别也非常受欢迎。大部分人都会选择科大讯飞的语音识别功能,但是在一些小的项目中,使用科大讯飞的就有点大材小用了。今天就介绍一下Unity自带的语音识别功能。说是语音识别,其实unity本身还是做不到的,Unity自带的语音识别功能其实是关键字识别。比如我在Unity中设定好一句话汇总的几个关键词。当我再说这句话的时候就会和识别到。经过测试发现当一句话中有八个关键字,这句话就会非常好的被识别出来。
接下来就一起来实现一下:
首先贴一张效果图:
在这里插入图片描述
场景我们沿用的是音频可视化那篇文章里用到的场景。这里就不多做介绍了。Unity自带的语音识别功能官方有API供参考,地址在这里(戳这里
在这里插入图片描述
这里大家可以自行去看一下。下面开始介绍一下我们要实现的功能:
想要识别语音识别功能我们首先由先引用个命名空间

using UnityEngine.Windows.Speech;//引入命名空间

然后定义一个string类型数组,这个数组就是存放那些我们要识别关键字。

	 // 关键字
    public string[] keywords = { "你好", "开始","停止" };

紧接着我们要在start方法中先创建一个语音识别器,这样才能够进行语音识别

	//创建一个识别器
	m_PhraseRecognizer = new KeywordRecognizer(keywords, m_confidenceLevel);
	//通过注册监听的方法
	m_PhraseRecognizer.OnPhraseRecognized += M_PhraseRecognizer_OnPhraseRecognized;
	//开启识别器
	m_PhraseRecognizer.Start();

接着是一个方法,这个方法主要就是用于识别到关键字后要做的事情

	 /// <summary>
    ///  当识别到关键字时,会调用这个方法
    /// </summary>
    /// <param name="args"></param>
    private void M_PhraseRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
    {
        print(args.text);
    }

这样基本上重要的部分就完成。下面是全部的代码,在底部还有一个小Demo,感兴趣的可以下载下来自行体验一下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Windows.Speech;//引入命名空间  利用

/// <summary>
/// 语音识别(主要是别关键字)
/// </summary>
public class speechKey : MonoBehaviour
{
    // 短语识别器
    private PhraseRecognizer m_PhraseRecognizer;
    // 关键字
    public string[] keywords = { "你好", "开始","停止" };
    // 可信度
    public ConfidenceLevel m_confidenceLevel = ConfidenceLevel.Medium;

    // Use this for initialization
    void Start()
    {
        if (m_PhraseRecognizer == null)
        {
            //创建一个识别器
            m_PhraseRecognizer = new KeywordRecognizer(keywords, m_confidenceLevel);
            //通过注册监听的方法
            m_PhraseRecognizer.OnPhraseRecognized += M_PhraseRecognizer_OnPhraseRecognized;
            //开启识别器
            m_PhraseRecognizer.Start();
          
            Debug.Log("创建识别器成功");
        }
    }

    /// <summary>
    ///  当识别到关键字时,会调用这个方法
    /// </summary>
    /// <param name="args"></param>
    private void M_PhraseRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
    {
        SpeechRecognition();
        print(args.text);
    }
    private void OnDestroy()
    {
        //判断场景中是否存在语音识别器,如果有,释放
        if (m_PhraseRecognizer != null)
        {
            //用完应该释放,否则会带来额外的开销
            m_PhraseRecognizer.Dispose();
        }

    }
    // Update is called once per frame
    void Update()
    {

    }
    /// <summary>
    /// 识别到语音的操作
    /// </summary>
    void SpeechRecognition()
    {
       
    }  
}

Demo下载地址:https://github.com/ShuxinWen/AutomaticSpeechRecognition-ASR-

2019-08-29 14:45:38 a18612039484 阅读数 238
  • C++语音识别开篇

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

    5927 人正在学习 去看看 杨波

语音识别相关API

语音识别关键概念:声音的本质是震动,震动的本质是位移关于时间的函数,波形文件(.wav)中记录了不同采样时刻的位移。
通过傅里叶变换,可以将时间域的声音函数分解为一系列不同频率的正弦函数的叠加,通过频率谱线的特殊分布,建立音频内容和文本的对应关系,以此作为模型训练的基础。

梅尔频率倒谱系数(mfcc)

主要思想:提取13个特征,生成梅尔频率倒谱系数矩阵。
API:

import scipy.io.wavfile as wf
import python_speech_features as sf

# 提取采样率,特征
sample_rate,sigs = wf.read('xxx.wav')
# 生成mfcc矩阵
mfcc = sf.mfcc(sigs,sample_rate)

声音合成

案例:

import json
import numpy as np
import scipy.io.wavfile as wf
# 读取存有音频信息的json文件
with open('../data/12.json', 'r') as f:
    freqs = json.loads(f.read())

tones = [
('G5', 1.5),
('A5', 0.5),
('G5', 1.5),
('E5', 0.5),
('D5', 0.5),
('E5', 0.25),
('D5', 0.25),
('C5', 0.5),
('A4', 0.5),
('C5', 0.75)]

# 设置采样率
sample_rate = 44100
# 创建一个空数组储存合成音频信息
music = np.empty(shape=1)

for tone, duration in tones:
    times = np.linspace(0, duration, duration * sample_rate)
    sound = np.sin(2 * np.pi * freqs[tone] * times)
    music = np.append(music, sound)
music *= 2 ** 15
music = music.astype(np.int16)
wf.write('music.wav', sample_rate, music)

语音识别

基本步骤: 提取声音信息(采样率,特征),生成梅尔频率倒谱系数矩阵(mfcc),训练隐马尔科夫模型,做最后的识别。
API:

import numpy as np
import scipy.io.wavfile as wf
import python_speech_features as sf
import hmmlearn.hmm as hl

# 提取样本信息
train_x,train_y = [],[]
mfccs = np.array([])
for sound_files in files_list:
    for sound_file in sound_files:
        sample_rate,sigs = wf.read(sound_file)
        mfcc = sf.mfcc(sigs,sample_rate)
        # 将mfcc矩阵添加到mfccs中
        if len(mfccs) == 0:
            mfccs == mfcc
        else:
            mfccs = np.append(mfccs,mfcc)
    # 将mfccs矩阵列表添加到训练集中  
    train_x.append(mfccs)
# 最终的train_x len(sound_files)个特征的矩阵
# train_y存的是特征标签,比如:apple,banana,pear

# 构建并训练隐马模型
models = {}
for mfccs,label in zip(train_x,train_y):
    model = hl.GaussianHMM(
        n_components = 4, covariance_type = 'diag',
        n_iter = 1000
    )
    models[label] = model.fit(mfccs)

# 同样方法获取测试集数据
# 测试
pred_y = []
for mfccs in test_x: 
    # 验证每个模型对当前mfcc的匹配度得分
    best_score, best_label = None, None
    for label, model in models.items():
        score = model.score(mfccs)
        if (best_score is None) or (best_score < score):
            best_score = score
            best_label = label
    pred_y.append(best_label)

print(test_y)
print(pred_y)
2015-01-05 16:56:22 u012637501 阅读数 17964
  • C++语音识别开篇

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

    5927 人正在学习 去看看 杨波
一、语音识别技术
转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空)
    语音识别技术,广泛来说是指语意识别和声纹识别;从狭义上来说指语音语义的理解识别,也称为自动语音识别(ASR)。其关键技术包括选择识别单元、语音端点检测、特征参数提取、声学模型及语音模型的建立。语音识别技术目前在桌面系统、智能手机、导航设备等嵌入式领域均有一定程度的应用。其主要技术难题是识别系统的适应性较差、受背景噪声影响较大,未来的发展方向应是无限词汇量连续语音非特定人语音识别系统。
(1)信号处理及特征提取模块
    该模块的主要任务是从输入信号中提取特征,供声学模型处理。同时,它一般也包括了一些信号处理技术,以尽可能降低环境噪声、信道、说话人等因素对特征造成的影响。
(2)统计声学模型
    典型系统多采用基于一阶隐马尔科夫模型进行建模。
(3)发音词典
    发音词典包含系统所能处理的词汇集及其发音。发音词典实际提供了声学模型建模单元与语言模型建模单元间的映射。
(4)语言模型
    语言模型对系统所针对的语言进行建模。理论上,包括正则语言,上下文无关文法在内的各种语言模型都可以作为语言模型,但目前各种系统普遍采用的还是基于统计的N元文法及其变体。
(5)解码器
    解码器是语音识别系统的核心之一,其任务是对输入的信号,根据声学、语言模型及词典,寻找能够以最大概率输出该信号的词串,从数学角度可以更加清楚的了解上述模块之间的关系。
    当今语音识别技术的主流算法,主要有基于动态时间规整(DTW)算法、基于非参数模型的矢量量化(VQ)方法、基于参数模型的隐马尔可夫模型(HMM)的方法、基于人工神经网络(ANN)和支持向量机等语音识别方法.

二、非特定人、大词汇量、连续语音识别系统
       连续数字语音识别系统经过训练和识别两个部分。此训练可以看作是对 HMM 建立模型的过程。通过对参数重新评估,调整模型的各种参数,得到具有较好鲁棒性的模型。对基本模型进行改进和优化,可以有效提高精确度,获得更好的识别率。识别过程则可以认为是使用现有的 HMM 模型库、数据字典和语法控制组成识别网络,运用搜索算法寻找最佳匹配过程。 首先对等待识别的语音信号进行采样,然后通过转换变成电信号。预处理这 些电信号,也就是对信号进行增加预重、帧数分离、检测端点等操作。处理过后,对语音信号提炼生成特征的矢量数据。按识别模块中的 HMM 模型和词典要求组合,形成合词模型后完成识别,将结果和语言模型进行匹配,淘汰那些不符合语法限制的句子和词组,最后输出符合规范的识别的过程,就是语音识别的全过程。特征值、HMM 模 型、语法和数据字典都是影响识别率高低的重要因素。
    语音识别过程通常包括"前段"和"后端"两部分:“前端”模块 主要的作用是进行端点检测(去除多余的静音和非说话声)、降噪、 特征提取等;“后端”模块的作用是利用训练好的声学模型和语言模型对用户说话的特征向量进行统计模式识别(又称解码),得到其包含的文字信息,此外,后端模块还存在一个自适应的反馈模块,可以对用户的语音进行自学习,从而对声学模型和语音模型进行必要的校正,进一步提高识别的准确率。一个完整的非特定人大词汇量连续语音识别系统可大致分为三部分:语音信号预处理与特征提取、声学模型训练、语言模型训练、搜索算法与识别。
0.识别单元的选择

   选择识别单元是语音识别研究的第一步,分为单词、音节、音素。

(1)单词单元:广泛应用于中小词汇语音识别系统,但不适合大词汇系统,原因在于模型库太庞大,训练模型任务繁重、模型匹配算法复杂,难以满足实时性要求。

(2)音节单元:多见于汉语语音识别,主要因为汉语是单音节结构的语言,而英语是多音节。虽然汉语大约有1300个音节,但若不考了声调只有约408个无调音节。

(3)音素单元:目前广泛被应用到大词汇量语音识别系统中,原因是在于汉语音节仅有声明和韵母构成,并且声明和韵母的声学特性相差很大。

    总结,对大词汇量语音识别系统来说,通常识别单元越小,则计算量也越小,所需的模型存储量也小,要求的训练数量也少,但对应语音段的定位和分割较困难,因此识别模型规则也变得更复杂。

1、预处理模块

       对输入的原始语音信号进行处理(输入的语言信号首先要进行反混叠滤波 采样 A/D 转换 等过程进行数字化, 之后要进行预处理, 包括预加重 加窗和 分帧 端点检测等。),滤除掉其中的不重要的信息以及背景噪声,并进行语音信号的端点检测(找出语音信号的始末)、语音分帧(近似认为在10-30ms内是语音信号是短时平稳的,将语音信号分割为一段一段进行分析)以及预加重(提升高频部分)等处理。

目前主流的语音信号端点检测方法:

(1)短时能量En:反应语音振幅或能量随着事件缓慢变化的规律;

(2)短时平均过零率Zn:对于离散信号而言,是样本改变符号的次数,可以粗略分别清音和浊音;

(3)双门限端点检测:短时平均能量和过零率两者结合可以起到区分语音信号中的静音与语音信息的作 用,完成端点检测。一段完整的语音信号的可以分为三段:静音段、过渡段、语音段。 在静音段,过零率或能量越过了低门限,进入过渡段。在过渡段,过零率或能量都降低至低门限以下,则恢复到静音态;过零率或能量中的其中一个越过了高门限,则为进入了语音段。在低噪声情况下,双门限端点检测简单可靠。但在噪声较大的情况下,该方法失去判断能力,所以此方法的抗噪能力较差。 

2、声学特征提取

       语音信号是一种典型的时变信号,然而如果把音频的参考时间控制在几十毫 秒以内,则得到一段基本稳定的信号。去除语音信号中对于语音识别无用的冗余信息,保留能够反映语音本质特征的信息,并用一定的形式表示出来。也就是提取出反映语音信号特征的关键特征参数形成特征矢量序去掉那些相对无关的信息如背景噪声、信道失真等,以便用于后续处理目前的较常用的提取特征的方法还是比较多的,不过这些提取方法都是由频谱衍生出来的。

目前主流的语音信号特征提取方法:

(1)线性预测系数(LPCC):很好的模拟语音信号,语音信号是由声带振动发出的, 声带可以不振动也可以有周期的振动,分别对应清音(consonants)和浊音(vowels),每一段声管则对应一个 LPC 模型的极点。通常极点个数在 12-16 个左右,即可清晰地描述信号的特征了。

(2)Mel频率倒谱系数(MFCC)参数

   人的听觉系统却是一种特殊的非线性系 统,它对不同频率信号的响应灵敏度有较大区别。 MFCC参数比 LPC 参数更能够充分利用人耳的感知特性提高系统的识别性能因其良好的抗噪性和鲁棒性而应用广泛。MFCC的计算首先用FFT将时域信号转化成频域,之后对其对数能量谱用依照Mel刻度分布的三角滤波器组进行卷积,最后对各个滤波器的输出构成的向量进行离散余弦变换DCT,取前N个系数。在sphinx中也是用MFCC特征的,用帧frames去分割语音波形,每帧大概10ms,然后每帧提取可以代表该帧语音的39个数字,这39个数字也就是该帧语音的MFCC特征,用特征向量来表示

(3)小波分析

3、声学模型训练(模版匹配方法)

      声学模型的训练,即为建模过程。声学模型是识别系统的底层模型,是语音识别系统中最关键的部分。声学模型表示一种语言的发音声音,可以通过训练来识别某个特定用户的语音模式和发音环境的特征。根据训练语音库的特征参数训练出声学模型参数,在识别时可以将待识别的语音的特征参数同声学模型进行匹配与比较,得到最佳识别结果。

目前主流的声学模型训练方法

(1)动态时间规整(DTW):现实生活中语音信号的 随机性较强,就是同一人说的话,也不太可能说出一句一模一样的话来。就算字词都一样,发音的时间长短也可能不一样。因此,需要寻找一种变换关系来削除这种时间上的距离偏差,这种结合时间变换关系求特征序列之间距离的技术算法 称为动态时间规整算法(DTW:DynamicTimeWarping)。动态时间规整(DTW)算法 的算法的思想,就是将待识别的语音信号均匀的升长或缩短,使其与参考模板的长度一致。同时,使语音信号的时间轴进行不均匀的扭曲和弯折,最终达到与模板的特征对齐。DTW 是较早的一种模式匹配和模型训练技术, 它把整个单词作为识别单元,在训练阶段将词汇表中每个词的特征矢量序列作为模板存入模板库,在识别阶段将待识别语音的特征矢量序列依次与库中的每个模板进行相似度比较,将相似度最高者作为识别结果输出。DTW 应用动态规划方法成功解决了语音信号特征参数序列比较时时长不等的难题,在小词汇量、孤立词语音识别中获得了良好性能。但因其不适合连续语音大词汇量语音识别系统, 目前已逐渐被 HMM 和 ANN模型替代。
(2)矢量量化(VQ)技术
    矢量量化(VectorQuantization)是一种适用于小词汇量、孤立词的语音识别的 信号压缩方法 。矢量量化器的设计其核心思想是:为某一个特定的信源设计一 个优化的码书,那么来自同一个信息源所产生的信号与该码书的平均量化失真就应远远小于他与其他信息的信号与该码书的平均量化失真,也就是说编码器本身存在一定的区分能力。 
(3)隐马尔可夫模型HMM 

     HMM是对语音信号的时间序列结构建立统计模型,将其看作一个数学上的双重随机过程:一个是用具有有限状态数的Markov链来模拟语音信号统计特性变化的隐含(马尔可夫模型的内部状态外界不可见)的随机过程,另一个是与Markov链的每一个状态相关联的外界可见的观测序列(通常就是从各个帧计算而得的声学特征)的随机过程。

    HMM 模型是语音信号时变特征的有参表示法。它由相 互关联的两个随机过程共同描述信号的统计特性,其中一个 是隐蔽的 (不可观测的) 具有有限状态的 Markor 链, 另一个是 与 Markor 链的每一状态相关联的观察矢量的随机过程 (可观测的) 。HMM 很好的模拟了人得语言过程, 目前应用十分广泛。目前的主流语音识别系统多采用隐马尔可夫模型HMM进行声学模型建模。声学模型的建模单元,可以是音素,音节,词等各个层次。对于小词汇量的语音识别系统,可以直接采用音节进行建模。而对于词汇量偏大的识别系统,一般选取音素,即声母,韵母进行建模。识别规模越大,识别单元选取的越小。 

        人的言语过程实际上就是一个双重随机过程,语音信号本身是一个可观测的时变序列,是由大脑根据语法知识和言语需要(不可观测的状态)发出的音素的参数流(发出的声音)。HMM合理地模仿了这一过程,是较为理想的一种语音模型。用HMM刻画语音信号需作出两个假设,一是内部状态的转移只与上一状态有关,另一是输出值只与当前状态(或当前的状态转移)有关,这两个假设大大降低了模型的复杂度。所以 HMM 可以 非常精确地描述语音信号的产生过程。 

       语音识别中使用HMM通常是用从左向右单向、带自环、带跨越的拓扑结构来对识别基元建模,一个音素就是一个三至五状态的HMM,一个词就是构成词的多个音素的HMM串行起来构成的HMM,而连续语音识别的整个模型就是词和静音组合起来的HMM。总之 HMM 模型较为完整的表达了语音的声学模型,采用统计的训练方法将 上层的语言模型和底层的声学模型融入统一的语音识别搜索算法中,并获得更好 的效果。

(4)人工神经网络模型(ANN)

     神经网络是由许多被称为节点的简单非线性模拟处理要素密集互连配置而成的,是 一种模仿了生物神经元的系统模型。网络通过令每一个节点的输出与一些其他的节点输入连接形成,类似于真实神经元的突触连接。每个神经元表达了一种特定的输出函数,称为激励函数,每两个神经元之间的连接都包含一个连接强度,也就是作用于通过该连接的信号的加权值。经过训练之后的神经网络,具有信息特征抽取、知识概括和学习记忆的能力,而模型学习到的信息或知识则储存在每个单元节点之间的连接矩阵上。一个神经网络的表现是由节点定义,拓扑结构以及学习算法这三个特征组成的集体性质决定的。 

   ANN本质上是一个自适应非线性动力学系统,是由结点互连组成的计算网络, (优点)人工神经网络(ANN) 基本上能够模拟人类神经的活动原理,具有学习特性、容错性、并行性、自适应性和鲁棒性,是一个自适应非线性动力学系统,且具有较强的分类能力和输入输出映射能力。这些能力是 HMM 模型不具备的, 可用于处理一些环境信息十分复杂, 背景知识不清楚, 推理规则不明确的问题, 允许样品有较大的缺损、 畸变, 因此对于噪声环境下非特定人的语音识别问题来说是一种很好的解决方案。(缺点)由于语音训练和识别时间太长,实现和应用较难等不利因素,所以到目前为止该方法停留在实验阶段,目前大部分应用神经网络的语音识别系统都采用了 BP 网并取得了较好的识别效果.将 ANN 与 HMM 结合分别利用各自优点进行识别将是今后的一条研究途径。ANN 具有 较好的区分复杂分类边界的能力,显然它十分有助于模式识别。在这些研究中,大部分 

采用基于反向传播算法(BP 算法)的多层感知网络。 

a.BP神经网络:BP 神经网络在训练的时候,正向传播之后输出层没有得到期望输出,则采用反向传 播算法,提高网络系统对样本的似然度(Likelihood)。将样本的实际输出与期望输出之间的差值即误差信号,并在逐层反向传播的过程中由误差反馈不断调整网络的权值。网络学习效果的提升可以由增加隐藏层层数实现。 在诸多神经网络中,BP 是应用较多的一种,用于语音识别时也具有较好的效果,这 是由于 BP 神经网络具有许多独特的优点:(1)它可以联想模式对,将复杂的声学信号映射为不同级别的语音学和音韵学的表示;(2)可以通过插值进行归纳,因此相关特征 

可通过训练获取(3)对不同的类,他可以在超平面中形成不相交的区域,很适合捕捉细微的规律;(4)输入可以是二值或连续值,也可以是声学属性或语音特征的任意组合; (5)对数据的分布不做先验假设,对模型使用全局约束,因此能构造光滑的类边界, 识别精度好。虽然 BP 神经网络具有强大的计算能力,能够好的应用于语音识别,但随着对识别 性能要求的提高,网络本身仍有一些问题逐渐暴露出来,以下方面亟待改进: 

(1)局部极小值问题; 

(2)增加神经网络的可理解性。人们暂时仍然无法直接理解网络学习存储在连接矩阵上的知识; 

(3)加快神经网络学习速度。目前大部分神经网络算法都无法回避的一个部分就是迭代问题,为了获得好的学习效果,迭代需要大的计算开销。 

b.神经网络训练

    神经网络的学习也称为训练,是指通过神经网络所在环境的刺激作用,调整神经网 络的自由参数。能够从环境中学习和在学习中获得系统工作效果提升,是神经网络最有意义的性质。在神经网络中,一般有两类训练算法。 

(1)有监督学习算法。不但需要训练用的输入信号,同时需要与输入相对应的表示所需输出的目标信号。网络通过计算实际输出与每组输入对应的目标输出之间的差值来调整权值,做出正确反应。 

(2)无监督学习算法。不要求有目标输出,算法提供一个关于网络学习表示方法质量的测量尺度,根据尺度将自由参数最优化,当网络与输入数据统计规律性一致,就能形成内部表示方法记忆输入特征,由此进行类别识别。 

4、语言模型训练

       语音识别中的语言模型主要解决两个问题一是如何使用数学模型来描述语音中词的语音结构二是如何结合给定的语言结构和模式识别器形成识别算法。语言模型是用来计算一个句子出现概率的概率模型。它主要用于决定哪个词序列的可能性更大,或者在出现了几个词的情况下预测下一个即将出现的词语的内容。换一个说法说,语言模型是用来约束单词搜索的。它定义了哪些词能跟在上一个已经识别的词的后面(匹配是一个顺序的处理过程),这样就可以为匹配过程排除一些不可能的单词。语言模型一般指在匹配搜索时用于字词和路径约束的语言规 则,它包括由识别语音命令构成的语法网络或由统计方法构成的语言模型, 语言处理则可以进行语法、 语义分析.

       语言建模能够有效的结合汉语语法和语义的知识,描述词之间的内在关系,从而提高识别率,减少搜索范围。语言模型分为三个层次:字典知识,语法知识,句法知识。

         对训练文本数据库进行语法、语义分析,经过基于统计模型训练得到语言模型。

目前主流的语言建模方法

(1)基于规则模型
(2)基于统计模型

    统计语言模型是用概率统计的方法来揭示语言单位内在的统计规律,其中N-Gram模型简单有效,被广泛使用。它包含了单词序列的统计。N-Gram模型基于这样一种假设,第n个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积(即根据前面N-1个词汇的历史来决定下一个词可能出现的概率)。这些概率可以通过直接从语料中统计N个词同时出现的次数得到常用的是二元的Bi-Gram和三元的Tri-Gram。

         Sphinx中是采用二元语法和三元语法的统计语言概率模型,也就是通过前一个或两个单词来判定当前单词出现的概率P(w2| w1),P(w3| w2, w1)。

5、语音解码和搜索算法

       解码器:即指语音技术中的识别过程。针对输入的语音信号,根据己经训练好的HMM声学模型、语言模型及字典建立一个识别网络,根据搜索算法在该网络(识别网络)中寻找最佳的一条路径,这个路径就是能够以最大概率输出该语音信号的词串,这样就确定这个语音样本所包含的文字了。所以解码操作即指搜索算法是指在解码端通过搜索技术寻找最优词串的方法。连续语音识别中的搜索,就是寻找一个词模型序列以描述输入语音信号,从而得到词解码序列。搜索所依据的是对公式中的声学模型打分和语言模型打分。在实际使用中,往往要依据经验给语言模型加上一个高权重,并设置一个长词惩罚分数。当今的主流解码技术都是基于Viterbi搜索算法的,Sphinx也是。模型参数得到后可以用 Viterbi 算法来确定与观察序列对 应的最佳的状态序列。建好模型后,在识别阶段就是要计算每个模型产生观察符号序列的输出概率,输出概率最大的模型所表示的词就是我们的识别结果。

    基于动态规划的Viterbi算法在每个时间点上的各个状态,计算解码状态序列对观察序列的后验概率,保留概率最大的路径,并在每个节点记录下相应的状态信息以便最后反向获取词解码序列。Viterbi算法本质上是一种动态规划算法,该算法遍历HMM状态网络并保留每一帧语音在某个状态的最优路径得分。

    连续语音识别系统的识别结果是一个词序列。解码实际上是对词表的所有词反复搜索。词表中词的排列方式会影响搜索的速度,而词的排列方式就是字典的表示形式。Sphinx系统中采用音素作为声学训练单元,通常字典就用来记录每个单词由哪些个音素组成,也可以理解为对每个词的发音进行标注。

     N-best搜索和多遍搜索:为在搜索中利用各种知识源,通常要进行多遍搜索,第一遍使用代价低的知识源(如声学模型、语言模型和音标词典),产生一个候选列表或词候选网格,在此基础上进行使用代价高的知识源(如4阶或5阶的N-Gram、4阶或更高的上下文相关模型)的第二遍搜索得到最佳路径。



2018-05-04 07:47:07 qq_34231800 阅读数 15490
  • C++语音识别开篇

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

    5927 人正在学习 去看看 杨波

  论语音识别三大关键技术

                                       

   李万鸿

        语音识别已经成为人工智能应用的一个重点,通过语音控制设备简单方便,在各个领域兴起了研究应用的热潮。数据、算法及芯片是语音识别技术的3个关键,大量优质的数据、精准快速的算法和高性能语音识别芯片是提升语音识别的核心。语音是人工智能产品的主要入口,乃兵家必争之地也。相关算法研究日新月异,CNN RNN CLRNN HMM LACE等模型都尤其优势,将多种算法综合运用修改更佳。这里对语音识别的技术做个综述。

一、应用场景

    目前语音识别在智能家居、智能车载、智能客服机器人方面有广泛的应用,未来将会深入到学习、生活、工作的各个环节。国内外许多大公司都在倾力研究此技术,并不断推出实际产品。比如科大讯飞的翻译器译呗,可实现汉语与各种语言之间的互译,效果不错。 

    百度借助自己的人工智能生态平台,推出了智能行车助手CoDriver。科大讯飞与奇瑞等汽车制造商合作,推出了飞鱼汽车助理,推进车联网进程。搜狗与四维图新合作推出了飞歌导航。云知声、思必驰在导航、平视显示器等车载应用方面推出了多款智能语控车载产品。出门问问则基于自己的问问魔镜进入到智能车载市场。

    在语音识别的商业化落地中,需要内容、算法等各个方面的协同支撑,但是良好的用户体验是商业应用的第一要素,而识别算法是提升用户体验的核心因素。下文将从语音识别的算法发展路径、算法发展现状及前沿算法研究三个方面来探讨语音识别技术。

 

二、算法

   对于语音识别系统而言,第一步要检测是否有语音输入,即,语音激活检测(VAD)。在低功耗设计中,相比于语音识别的其它部分,VAD采用always on的工作机制。当VAD检测到有语音输入之后,VAD便会唤醒后续的识别系统。识别系统总体流程如图2所示,主要包括特征提取、识别建模及模型训练、解码得到结果几个步骤。

                   

 

语音识别系统

 

首先,我们知道声音实际上是一种波。常见的mp3等格式都是压缩格式,必须转成非压缩的纯波形文件来处理,比如Windows PCM文件,也就是俗称的wav文件。wav文件里存储的除了一个文件头以外,就是声音波形的一个个点了。



在开始语音识别之前,有时需要把首尾端的静音切除,降低对后续步骤造成的干扰。这个静音切除的操作一般称为VAD,需要用到信号处理的一些技术。

要对声音进行分析,需要对声音分帧,也就是把声音切开成一小段一小段,每小段称为一帧。分帧操作一般不是简单的切开,而是使用移动窗函数来实现,这里不详述。帧与帧之间一般是有交叠的,就像下图这样:

图中,每帧的长度为25毫秒,每两帧之间有25-10=15毫秒的交叠。我们称为以帧长25ms、帧移10ms分帧。

分帧后,语音就变成了很多小段。但波形在时域上几乎没有描述能力,因此必须将波形作变换。常见的一种变换方法是提取MFCC特征,根据人耳的生理特性,把每一帧波形变成一个多维向量,可以简单地理解为这个向量包含了这帧语音的内容信息。这个过程叫做声学特征提取。实际应用中,这一步有很多细节,声学特征也不止有MFCC这一种。

至此,声音就成了一个12行(假设声学特征是12维)、N列的一个矩阵,称之为观察序列,这里N为总帧数。观察序每一帧都用一个12维的向量表示,色块的颜色深浅表示向量值的大小。
接下来就要介绍怎样把这个矩阵变成文本了。首先要介绍两个概念:

1.    音素:单词的发音由音素构成。对英语,一种常用的音素集是卡内基梅隆大学的一套由39个音素构成的音素集,参见The CMU Pronouncing Dictionary。汉语一般直接用全部声母和韵母作为音素集,另外汉语识别还分有调无调,不详述。

2.    状态:这里理解成比音素更细致的语音单位就行啦。通常把一个音素划分成3个状态。



语音识别是怎么工作的呢?实际上一点都不神秘,无非是:
把帧识别成状态(难点)。
把状态组合成音素。
把音素组合成单词。

如下图所示:

图中,每个小竖条代表一帧,若干帧语音对应一个状态,每三个状态组合成一个音素,若干个音素组合成一个单词。也就是说,只要知道每帧语音对应哪个状态了,语音识别的结果也就出来了。

那每帧音素对应哪个状态呢?有个容易想到的办法,看某帧对应哪个状态的概率最大,那这帧就属于哪个状态。比如下面的示意图,这帧在状态S3上的条件概率最大,因此就猜这帧属于状态S3


那这些用到的概率从哪里读取呢?有个叫声学模型的东西,里面存了一大堆参数,通过这些参数,就可以知道帧和状态对应的概率。获取这一大堆参数的方法叫做训练,需要使用巨大数量的语音数据。

但这样做有一个问题:每一帧都会得到一个状态号,最后整个语音就会得到一堆乱七八糟的状态号。假设语音有1000帧,每帧对应1个状态,每3个状态组合成一个音素,那么大概会组合成300个音素,但这段语音其实根本没有这么多音素。如果真这么做,得到的状态号可能根本无法组合成音素。实际上,相邻帧的状态应该大多数都是相同的才合理,因为每帧很短。

解决这个问题的常用方法就是使用隐马尔可夫模型(Hidden Markov ModelHMM)。这东西听起来好像很高深的样子,实际上用起来很简单:
第一步,构建一个状态网络。
第二步,从状态网络中寻找与声音最匹配的路径。

这样就把结果限制在预先设定的网络中,避免了刚才说到的问题,当然也带来一个局限,比如你设定的网络里只包含了今天晴天今天下雨两个句子的状态路径,那么不管说些什么,识别出的结果必然是这两个句子中的一句。

那如果想识别任意文本呢?把这个网络搭得足够大,包含任意文本的路径就可以了。但这个网络越大,想要达到比较好的识别准确率就越难。所以要根据实际任务的需求,合理选择网络大小和结构。

搭建状态网络,是由单词级网络展开成音素网络,再展开成状态网络。语音识别过程其实就是在状态网络中搜索一条最佳路径,语音对应这条路径的概率最大,这称之为解码。路径搜索的算法是一种动态规划剪枝的算法,称之为Viterbi算法,用于寻找全局最优路径。


这里所说的累积概率,由三部分构成,分别是:

1.    观察概率:每帧和每个状态对应的概率

2.    转移概率:每个状态转移到自身或转移到下个状态的概率

3.    语言概率:根据语言统计规律得到的概率

其中,前两种概率从声学模型中获取,最后一种概率从语言模型中获取。语言模型是使用大量的文本训练出来的,可以利用某门语言本身的统计规律来帮助提升识别正确率。语言模型很重要,如果不使用语言模型,当状态网络较大时,识别出的结果基本是一团乱麻。这样基本上语音识别过程就完成了。

1VAD(语音激活检测)

用于判断什么时候有语音输入,什么时候是静音状态。语音识别后续的操作都是在VAD截取出来的有效片段上进行,从而能够减小语音识别系统噪声误识别率及系统功耗。在近场环境下,由于语音信号衰减有限,信噪比(SNR)比较高,只需要简单的方式(比如过零率、信号能量)来做激活检测。但是在远场环境中,由于语音信号传输距离比较远,衰减比较严重,因而导致麦克风采集数据的SNR很低,这种情况下,简单的激活检测方法效果很差。使用深度神经网络(DNN)做激活检测是基于深度学习的语音识别系统中常用的方法(在该方法下,语音激活检测即为一个分类问题)。在MIT的智能语音识别芯片中使用了精简版的DNN来做VAD,该方法在噪声比较大的情况下也具有很好的性能。但是更复杂的远场环境中,VAD仍然是未来研究的重点。

2、特征提取

梅尔频率倒谱系数(MFCC)是最为常用的语音特征,梅尔频率是基于人耳听觉特征提取出来的。MFCC主要由预加重、分帧、加窗、快速傅里叶变换(FFT)、梅尔滤波器组、离散余弦变换几部分组成,其中FFT与梅尔滤波器组是MFCC最重要的部分。但是近年研究表明,对于语音识别而言,梅尔滤波器组不一定是最优方案。受限的玻尔兹曼机(RBM)、卷积神经网络(CNN)、CNN-LSTM-DNNCLDNN)等深度神经网络模型作为一个直接学习滤波器代替梅尔滤波器组被用于自动学习的语音特征提取中,并取得良好的效果。

目前已经证明,在特征提取方面,CLDNN比对数梅尔滤波器组有明显的性能优势。基于CLDNN的特征提取过程可以总结为:在时间轴上的卷积、poolingpooled信号进入到CLDNN中三个步骤。

远场语音识别领域,由于存在强噪声、回响等问题,麦克风阵列波束成形仍然是主导方法。

另外,现阶段,基于深度学习的波束成形方法在自动特征提取方面亦取得了众多研究成果。

3、识别建模

    语音识别本质上是音频序列到文字序列转化的过程,即在给定语音输入的情况下,找到概率最大的文字序列。基于贝叶斯原理,可以把语音识别问题分解为给定文字序列出现这条语音的条件概率以及出现该条文字序列的先验概率,对条件概率建模所得模型即为声学模型,对出现该条文字序列的先验概率建模所得模型是语言模型。

   声音的三个主要的主要属性,即音量(响度)、音调、音色(也称音品),声音的音量(volume),即音频的强度和幅度;声音的音调,也称为音高(pitch),即音频的频率或每秒变化的次数;声音的音色(timbre),即音频泛音或谐波成分。每个人的发音都有其独特的音品,为此,在训练用户的语音识别时,需要提取用户的音品特征,对已经训练的基础模型进行调整,建立用户的声音特征模型,这样可以显著提升识别的成功率和速度,在复杂语音背景下增强抗干扰能力。这是一个值得研究的新思路。

3.1  声学模型

声学模型是把语音转化为声学表示的输出,即找到给定的语音源于某个声学符号的概率。对于声学符号,最直接的表达方式是词组,但是在训练数据量不充分的情况下,很难得到一个好的模型。词组是由多个音素的连续发音构成,另外,音素不但有清晰的定义而且数量有限。因而,在语音识别中,通常把声学模型转换成了一个语音序列到发音序列(音素)的模型和一个发音序列到输出文字序列的字典。

需要注意的是,由于人类发声器官运动的连续性,以及某些语言中特定的拼读习惯,会导致音素的发音受到前后音素的影响。为了对不同语境的音素加以区分,通常使用能够考虑前后各一个音素的三音子作为建模单元。

另外,在声学模型中,可以把三音子分解为更小的颗粒状态,通常一个三音子对应3个状态,但是这会引起建模参数的指数增长,常用的解决方案是使用决策树先对这些三音子模型进行聚类,然后使用聚类的结果作为分类目标。

至此,语音识别有了最终的分类目标状态。最常用的声学建模方式是隐马尔科夫模型(HMM)。在HMM下,状态是隐变量,语音是观测值,状态之间的跳转符合马尔科夫假设。其中,状态转移概率密度多采用几何分布建模,而拟合隐变量到观测值的观测概率的模型常用高斯混合模型(GMM)。基于深度学习的发展,深度神经网络(DNN)、卷积神经网络(CNN)、循环神经网络(RNN)等模型被应用到观测概率的建模中,并取得了非常好的效果。下文给出各个模型的原理、所解决的问题及各自局限性,且给出了由模型的局限性而引起建模方式发展的脉络。

1)高斯混合模型(GMM

观测概率密度函数由高斯混合模型建模,训练中,不断迭代优化,以求取GMM中的加权系数及各个高斯函数的均值与方差。GMM模型训练速度较快,且GMM声学模型参数量小,可以容易地嵌入到终端设备中。在很长一段时间内,GMM-HMM混合模型都是表现最优秀的语音识别模型。但是GMM不能利用语境信息,其建模能力有限。

2)深度神经网络(DNN

最早用于声学模型建模的神经网络,DNN解决了基于高斯混合模型进行数据表示的低效问题。语音识别中,DNN-HMM混合模型大幅度的提升了识别率。目前阶段,DNN-HMM基于其相对有限的训练成本及高识别率,仍然是特定的语音识别工业领域常用的声学模型。需要注意的是,基于建模方式的约束(模型输入特征长度的一致性需求),DNN模型使用的是固定长度的滑动窗来提取特征。

3)循环神经网络(RNN/卷积神经网络(CNN)模型

对于不同的音素与语速,利用语境信息最优的特征窗长度是不同的。能够有效利用可变长度语境信息的RNNCNN在语音识别中能够取得更好的识别性能。因而,在语速鲁棒性方面,CNN/RNNDNN表现的更好。

在使用RNN建模方面,用于语音识别建模的模型有:多隐层的长短期记忆网络(LSTM)、highway LSTMResidualLSTM、双向LSTM、时延控制的双向LSTM

·       LSTM,基于门控电路设计,其能够利用长短时信息,在语音识别中取得了非常好的性能。另外,可以通过增加层数进一步提升识别性能,但是简单地增加LSTM的层数会引起训练困难及梯度消失问题。

·       Highway LSTM,在LSTM相邻层的记忆单元间添加一个门控的直接链路,为信息在不同层间流动提供一个直接且不衰减的路径,从而解决梯度消失问题

·       Residual LSTM,在LSTM层间提供一个捷径,亦能解决梯度消失问题。

·       双向LSTM,能够利用过去及未来的语境信息,因而其识别性能比单向的LSTM好,但是由于双向LSTM利用了未来的信息,因而基于双向LSTM建模的语音识别系统需要观察完整的一段话之后才能识别,从而不适用于实时语音识别系统。

·       时延控制的双向LSTM,通过调整双向LSTM的反向LSTM,实现了性能与实时性的一个折中建模方案,能够应用于实时的语音识别系统。

CNN建模方面,包括时延神经网络(TDNN)、CNN-DNNCNN-LSTM-DNNCLDNN)、CNN-DNN-LSTMCDL)、深度CNN、逐层语境扩展和注意(LACECNNdilated CNN

·       TDNN,最早被用于语音识别的CNN建模方式,TDNN 会沿频率轴和时间轴同时进行卷积,因此能够利用可变长度的语境信息。TDNN用于语音识别分为两种情况,第一种情况下:只有TDNN,很难用于大词汇量连续性语音识别(LVCSR),原因在于可变长度的表述(utterance)与可变长度的语境信息是两回事,在LVCSR中需要处理可变长度表述问题,而TDNN只能处理可变长度语境信息;第二种情况:TDNN-HMM 混合模型,由于HMM能够处理可变长度表述问题,因而该模型能够有效地处理LVCSR问题。

·       CNN-DNN,在DNN前增加一到两层的卷积层,以提升对不同说话人的可变长度声道(vocal tract)问题的鲁棒性,对比于单纯DNNCNN-DNN性能有一定幅度(5%)的提升

·       CLDNNCDL,在这两个模型中,CNN只处理频率轴的变化,LSTM用于利用可变长度语境信息。

·       深度CNN,这里的深度是指一百层以上。语谱图可以被看作是带有特定模式的图像,通过使用比较小的卷积核以及更多的层,来利用时间及频率轴上长范围的相关信息,深度CNN的建模性能与双向LSTM性能相当,但是深度CNN没有时延问题。在控制计算成本的情况下,深度CNN能够很好的应用于实时系统。

·       逐层语境扩展和注意(LACECNNdilated CNN,深度CNN的计算量比较大,因而提出了能够减小计算量的 LACE CNNdilated CNN,其把整个话语看作单张输入图,因而可以复用中间结果,另外,可以通过设计LACE CNNdilated CNN网络每一层的步长,使其能够覆盖整个核,来降低计算成本。

语音识别的应用环境常常比较复杂,选择能够应对各种情况的模型建模声学模型是工业界及学术界常用的建模方式。但是各个单一模型都有局限性。HMM能够处理可变长度的表述,CNN能够处理可变声道,RNN/CNN能够处理可变语境信息。声学模型建模中,混合模型由于能够结合各个模型的优势,是目前声学建模的主流方式。

3.2  语言模型

语音识别中,最常见的语言模型是N-Gram。近年,深度神经网络的建模方式也被应用到语言模型中,比如基于CNNRNN的语言模型。

 

4、端到端的语音识别系统

DNN-HMM或者CNN/RNN-HMM模型中,DNN/CNN/RNNHMM是分开优化的,但是语音识别本质上是一个序列识别问题,如果模型中的所有组件都能够联合优化,很可能会获取更好的识别准确度,这一点从语音识别的数学表达式也可以看出(利用贝叶斯准则变化之后的表达式),因而端到端的处理方式亦被引入到语音识别系统中。

4.1  CTC准则

其核心思想是引入空白标签,然后基于前向后向算法做序列到序列的映射。CTC准则可分为character-based CTCother output units-based CTCword-based CTC,由于CTC准则是直接预测字符、单词等,而不是预测音素,因而其能够剔除语音识别中的字典等专家知识。由于在非word-based CTC中,仍然需要语言模型及解码器。因而,character-basedCTCother output units-based CTC是非纯粹的端到端的语音识别系统。相反,word-based CTC模型是纯粹的端到端语音识别系统。

基于word-based CTC准则,使用10万个词作为输出目标且使用 12.5 万小时训练样本得到的语音序列到单词序列的模型,能够超越基于音素单元的模型。但是word-based CTC模型有训练困难及收敛慢的问题。

4.2  Attention-based模型

相比于CTC准则,Attention-based模型不需要有帧间独立性假设,这也是Attention-based模型的一大优势,因而Attention-based模型可能能够取得更好的识别性能。但是相比于CTC准则,Attention-based模型训练更加困难,且有不能单调地从左到右对齐及收敛更慢的缺点。通过将 CTC 目标函数用作辅助代价函数,Attention训练和 CTC 训练以一种多任务学习的方式结合到了一起。这种训练策略能够很大程度上改善Attention-based模型的收敛问题,并且缓解了对齐问题。

语音识别的发展过程中,深度学习起到了关键的作用。声学模型遵循从 DNN LSTM再到端到端建模的发展路径。深度学习最大的优势之一是特征表征。在有噪声、回响等情况下,深度学习可以把噪声、回响看为新的特征,并通过对有噪声、回响数据的学习,达到比较理想的识别性能。目前阶段,端到端的建模方式是声学模型建模的重点研究方向,但是相比于其它的建模方式,其还没有取得明显的性能优势。如何在端到端建模的基础上,提升训练速度及性能,并解决收敛问题是声学模型的重要研究方向。

 

5、解码

基于训练好的声学模型,并结合词典、语言模型,对输入的语音帧序列识别的过程即为解码的过程。传统的解码是将声学模型、词典以及语言模型编译成一个网络。解码就是在这个动态网络空间中,基于最大后验概率,选择一条或多条最优路径作为识别结果(最优的输出字符序列)。搜索常用的方法是Viterbi算法。对于端到端的语音识别系统,最简单的解码方法是beam search算法。原理如下:

假设词表大小为3,内容为abcbeam size2

decoder解码的时候:

1生成第1个词的时候,选择概率最大的2个词,假设为a,c,那么当前序列就是a,c

2:生成第2个词的时候,我们将当前序列ac,分别与词表中的所有词进行组合,得到新的6个序列aa ab ac ca cb cc,然后从其中选择2个得分最高的,作为当前序列,假如为aa cb

3:后面会不断重复这个过程,直到遇到结束符为止。最终输出2个得分最高的序列。

 

6、远场复杂环境下解决方案 

目前阶段,在近场安静环境下,语音识别能够取得非常理想的识别效果,但是在高噪声、多人说话、强口音等环境,特别是远场环境下,语音识别还有诸多问题需要解决。语音模型自适应、语音增强与分离、识别模型优化等是常用的可选解决方案。

6.1  语音增强与分离

远场环境下,语音输入信号衰减比较严重,为了对语音信号增强,常采用麦克风阵列的波束形成技术,比如,Google Home采用双麦的设计方案,亚马逊Echo采用6+1的麦克风阵列设计方案。近年,深度学习方法被应用到语音增强与分离中,核心思想是把语音增强与分离转化为一个监督学习问题,即预测输入声音源的问题。有研究使用DNN替代波束形成,实现语音增强,并在一定场景下取得了比较理想的效果。但是在背景噪声很大的环境中,该方法性能还有较大提升空间。

在多人说话的情况下,如果不对输入信号做分离处理,而进行语音识别的话,识别效果会很差。对于该问题,在多个说话人距离较远的情况下,波束形成是一个比较好的解决方案,但是当多个说话人距离很近的时候,波束形成的语音分离效果也很差。为了避开波束形成所带来的场景分类问题,传统的方法多是在单通道下尝试解决该问题,常用算法有computational auditory scene analysis、非负矩阵分解、deep clustering 等,但是这些方法只有当噪声信号(除声源外的其他信号)与声音源信号有明显不同的特征时,这些技术才取得比较好的效果。其它情况下,这些方法在语音分离中取得的效果一般。2016年,俞栋博士提出了一种新的深度学习训练准则-- permutation invariant training,巧妙地解决了该问题,并取得了不错的效果。采用综合考虑多参数的混合模型具有更好的精度和速度。prediction-adaptation-correctionPAC)模型可以把一些识别上的行为特征比如预测、自适应、和纠偏直接建在模型里。又比如,我们在书中提到的noise-awarespeaker-aware自适应方法可以通过网络结构直接实现自适应建模。再比如,PIT模型可以直接由深度学习模型分离语音,而基于CTCRNN生成模型的识别方法更是直接由深度学习模型产生识别结果。基于注意的模型使用语音编码到语言文字输出解码的方式,效果好,但有不能单调地从左到右对齐和收敛缓慢的缺点。通过将 CTC 目标函数用作辅助成本函数,注意训练和 CTC 训练以一种多任务学习的方式结合到了一起。这样一种训练策略极大地改善了基于注意的模型的收敛,并且缓解了对齐问题。

6.2  语音模型自适应

·       大量且丰富(能够提供更多信息)的数据集是提升模型泛化能力的最直接简单的方法;

·       基于成本及训练时间的考虑,一般情况下只使用有限的训练数据。此时,在模型训练中加入Kullback-Leiblerdivergence正则项是解决模型自适应问题非常有效的方式;

·       除了加入正则项外,使用非常少的参数来表征说话者特征是另一种自适应方式,其包括:奇异值分解瓶颈自适应,把满秩矩阵分解为两个低秩矩阵,减小训练参数;子空间法,子空间法又包括:

1. 在输入空间及深度网络的各个层中加入i-vector、扬声器(speaker)编码、噪声估计等辅助特征;

2. 聚类自适应训练(CAT;

3. 隐层分解(FHL),相比于CATFHL只需要少量的训练数据,原因在于FHL的基是秩为1的矩阵,而CAT的基是满秩矩阵,在基数量一样的情况下,CAT需要更多的训练数据。

实时性是语音识别应用中关注度很高的问题之一,实时性直接影响用户的体验感,提高语音识别的实时性可以通过降低运算时间成本与提升识别硬件计算能力两方面完成。

 

7、降低运算时间成本

·       SVD,基于奇异值分解的数学原理,把满秩矩阵分解为两个低秩矩阵,减小深度模型的参数,且能够不降低模型识别性能;

·       压缩模型,使用向量量化或者极低比特量化算法;

·       改变模型结构,主要针对LSTM,在LSTM中增加一个线性映射层,降低原有LSTM的输出维度,从而降低运算时间成本;

·       使用跨帧的相关性来降低评估深度网络分数的频率,对于DNNCNN而言,这可以通过使用跳帧策略完成,即每隔几帧才计算一次声学分数,并在解码时将该分数复制到没有评估声学分数的帧 

另外,提升识别阶段硬件的运算能力,开发专用的语音识别芯片对增强语音识别的实时性意义重大,下文将会在这方面展开讨论。

 

三、芯片 

不断积累的高质量大数据与深度学习算法是语音识别性能能够不断提升的关键。基础层的核心处理芯片是支持海量训练数据、复杂的深度网络建模方式以及实时推断的关键要素。语音识别包括训练与识别(给定训练好的模型,对输入语音进行识别)两部分。

在训练阶段,由于数据量及计算量巨大,传统的CPU或者单一处理器几乎无法单独地完成一个模型训练过程(初始阶段,谷歌大脑语音识别项目是基于16000CPU,用了75天,完成一个有156M参数的深度神经网络模型训练工作)。原因在于CPU芯片架构中只有少量的逻辑运算单元,且指令执行是一条接一条的串行过程,其算力不足。研发具有高计算能力的芯片成为语音识别乃至整个人工智能硬件的发展趋势。

CPU不同的是,GPU具有大量的计算单元,因而特别适合大规模并行计算。另外,FPGATPUASIC这些延续传统架构的芯片亦在大规模并行计算中得到广泛的应用。需要注意的是,从本质上讲,这些芯片都是计算性能与灵活性/通用性trade-off的结果,即,如图3所示。CPUGPU是通用处理器,DSP归为ASPTPUASIC这一类,FPGA则是一种Configurable Hardware

3.来源:RITShaaban教授的计算机体系结构课程

另外,基于实时性、低功耗、高计算力的需求,使用专属语音识别AI芯片处理识别阶段大量的矩阵运算,进行运算加速是今后终端语音识别芯片市场的主流方向。

 

1、云端场景

由于计算量、训练数据量极大,且需要大量的并行运算,目前语音识别的模型训练部分基本都放在云端进行。在云端训练中,英伟达的GPU占主导市场,多GPU并行架构是终端训练常用的基础架构方案。另外,Google在自己的人工智能生态中,使用TPU做训练与识别。

目前阶段,语音识别公司的识别部分也大多放在云端,比如Google home、亚马逊Echo,国内的科大讯飞、云知声等。在云端识别中,虽然也有使用GPU,但是GPU并不是最优方案,更多的是利用CPUGPUFPGA各自优势,采用异构计算方案(CPU+GPU+FPGA/ASIC)。

 

2、终端场景

在智能家居等行业应用中,对实时性、稳定性及隐私性有极高的要求。出于对云端数据处理能力、网络延迟及数据安全性的考虑,把计算下放到终端硬件中的边缘计算得到了快速的发展。终端离线的语音识别即是一种基于边缘计算的边缘智能,我们认为离线与在线是语音识别共存的发展路线。在终端离线识别中,需要把训练好的模型存储到芯片。给定语音输入时,引擎会调用模型,完成识别。终端语音识别两个关键因素是实时性与成本,其中实时性影响用户体验,成本影响语音识别应用范围。

由于深度神经网络在语音识别中取得明显的性能优势,其是目前主流的语音识别建模方式。但是神经网络的模型参数量一般非常大,且识别过程中有大量的矩阵计算,常用的DSP或者CPU处理该问题时需要大量的时间,从而无法满足语音识别的实时性需求。GPUFPGA的价格又是阻碍其在终端语音识别中大规模应用的主要障碍。考虑到终端应用中,场景相对比较固定,且需要很高的计算性能,研发语音识别专属芯片是终端语音识别硬件发展趋势。

·       启英泰伦(ChipIntelli):201511月在成都成立。20166月推出了全球首款基于人工智能的语音识别芯片CI1006,该芯片集成了神经网络加速硬件,可实现单芯片、本地离线、大词汇量识别,且识别率明显高于传统终端语音识别方案。另外,启英泰伦能够提供廉价的单麦远场语音识别模组,其实际识别效果能够媲美使用了科胜讯降噪模块的双麦模组,大幅度降低远场语音识别模组成本。启英泰伦在终端语音识别专用芯片发展上取得了明显的技术及先发优势。

·       MIT项目:MIT黑科技,即,MITISSCC2017上发表的paper里的芯片,该芯片能够支持DNN运算架构,进行高性能的数据并行计算,可以实现单芯片离线识别上千单词。

·       云知声:云知声致力于打造云端芯语音生态服务系统,其刚获取3亿人民币的投资,将把部分资金投入到终端语音识别芯片“UniOne”的研发中,据报道,该芯片将会内置DNN处理单元,兼容多麦克风阵列。

过去几十年,尤其是最近几年,语音识别技术不断取得突破。但是,在大多数场景下,语音识别远没有达到完美。解决远场复杂环境下的语音识别问题仍然是当前研究热点。另外,通常情况下,语音识别都是针对特定的任务,训练专用的模型,因而,模型的可移植性比较差。

     

     人类在对话过程中,可以很高效的利用先验知识,但是目前的语音识别系统都还无法有效利用先验知识。因此,语音识别还有很多问题待解决。令人兴奋的是,随着高质量数据的不断积累、技术的不断突破及硬件平台算力的提升,语音识别正在向我们期待的方向快速发展。

      人工智能具有自学习自适应功能,可以充分利用这个特点,从无到有地打造语音识别平台,让机器在不断的训练和工作中持续学习提升,变得越来越强大,圆满完美完成语音识别服务。推而广之,人脸识别、图像、视频识别、文字理解等各个领域都可以采用这个方法取得突破,能听能说,能看能理解和思考,并设制造出和人一样的机器人,完成人类各项工作,实现人类的大解放。

      要充分运用人工智能、机器学习及云计算和芯片的新技术,全面提升各种语言的语音识别的速度与精度,让设备听懂人的话,实现自然交流和简单灵活的控制,开辟一个会听话的人工智能新世界。建立混合模型提高质量,人工智能的模型实现迁移学习,节省成本,提高效率,相信很快就会迎来一个神奇美好的新世界!

 

语音识别技术综述

阅读数 1402

LD3320语音识别

阅读数 4364

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