2018-12-04 20:27:38 rickyzhang2008 阅读数 469
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29971 人正在学习 去看看 张中强

本文首发于:算法社区 dspstack.com,转发请注明出处。

前言#

动态时间规整算法,Dynamic Time Wraping,缩写为DTW,是语音识别领域的一个基础算法。

算法的提出#

DTW的提出是为了解决或尽量解决在语音识别当中的孤立词识别不正确的问题。该问题简单描述为:在识别阶段,将输入语音的特征矢量时间序列依次与模板库中的每个模板进行相似度比较,最后将相似度最高者作为识别结果输出。但是,由于语音信号具有相当大的随机性,即使是同一个人在不同时刻所讲的同一句话、发的同一个音,也不可能具有完全相同的时间长度。而在进行模板匹配时,这些时间长度的变化会影响测度的估计,从而降低识别率。对此,日本学者 板仓(Itakura)将动态规划(DP)算法的概念用于解决孤立词识别时的说话速度不均匀的难题,提出了著名的动态时间规整算法或称动态时间伸缩算法(DTW)。

算法的内容#

DTW的目标是从不同时间跨度的两个数据求出它们之间的最小总累计距离,所以首先我们要找出输入矢量和参考矢量之间的对应关系,从而根据对应的矢量来求出模板之间的最小累计距离。在求累计距离的每一步中,需要满足以下条件的规整函数:

  • 边界条件

    w(1) = 1,w(N) = M (3-1)

    即规整函数起点为(1,1),终点为(N,M),

  • 连续条件

    w(n + 1) = w(n) + 0/1/2,如果 w(n) <> w(n - 1) 成立 (3-2)

       w(n + 1) = w(n) + 1/2,如果 w(n) == w(n - 1) 成立 (3-3)

Tip:

  • 式(3-2)意思是 w() 的当前值和前一个 w() 值不相等,说明已经加过 1 或 2 ,则 w(n + 1) 的加上的值可为 0;式(3-3)则刚刚相反,w(n + 1) 的加上的值不能为 0,因为 w(n) 已经使用过 0;本质上,规整函数限制了最小累加距离的路径走向。0/1/2代表了路径走的步数,要么是当前矢量本身,要么是当前矢量的前一列的步数为 1和 2 的矢量(或点)。
  • n 的值与 N 相对应

使用规整函数的最小累计距离递推公式:
DTW(n,m) = d((n,m)) + min { DTW(n - 1, m) * g(n - 1, m),DTW(n - 1, m - 1), DTW(n - 1, m - 2)} (3-4)
其中:

g(n - 1,m) = 1,如果 w(n - 1) <> w(n - 2) (3-5)

g(n - 1,m) = ∞,如果w(n - 1) == w(n - 2) (3-6)

Tip:这里的只能取前一列的矢量(点)的数据
根据式(3-2)和式(3-3),文字解释为:当 DTW(n - 1, m) 不是来自 DTW(n - 2, m) 时,则去判断 DTW(n - 1, m) [本身,步数为 0 ],DTW(n - 1, m - 1) [步数为 1 ],DTW(n - 1, m - 2) [步数为 2 ]

优点和注意点#

时间复杂度#

DTW算法的优势在于:它解决了数据长度不同的两数据序列的差异度表示方式。从计算的角度来说,式(3-4)可看出,横轴每向前增加一步,仅参考前一列的累计距离,所以在计算时只保留前一列的累计距离即可,不必保留所有数据。这样可以降低算法的时间复杂度;其原理在于,一个参考数据只与其距离相近的数据会比较相似,距离过远的数据关系不大,所以就没必要计算参考数据与对比数据的所有距离,而DTW算法本身就是在矩阵中运算的,其一般的计算点关系如图
file

距离指标选择#

相邻矢量间距离指标的好坏绝对影响DTW算法的效果。在孤立词识别当中,先用矢量量化技术,然后再对各分量使用欧拉
距离来度量和计算;由于DTW算法可应用不同的领域,所以不同的领域距离指标是不一样的,甚至一般的统计距离:欧拉距离、Minkowski距离、Mahalanobis距离以及兰氏距离等用在所碰到的问题上,达不到想要的效果。所以,此时就需要根据实际数据的特征来构造距离(这里的距离已经不是一般意义上的长度等)指标,去衡量两个数据的相似程度

数据点约束#

虽说根据规整函数可以使计算复杂度降低,但是从递推公式可知,要想知道终点的累计最短距离,还是要不断计算前面的累计距离,那么如何才能更进一步的降低计算时间复杂度呢?答案就是对计算数据的范围进行约束,下图是平行四边形约束
file
也就是说,计算的数据点坐标必须落在平行四边形内部,否则就不用计算,至于平行四边形的形状可以根据实际数据来调试,一般不会相差很大,主要取决于平行四边形邻边的角度,即斜率

计算例子#

最后,给出一个简单的例子,讲下DTW的计算过程。
时间序列为:
d1 = {1,3,3,5,2},d2 = {0,2,3,6,4,1}
第一列:
DTW(1,1) = 1 + 0 = 1;
DTW(1,2) = 1 + min {DTW(0,2), DTW(0,1), DTW(0,0)} = 1 + 0 = 1;
DTW(1,3) = 2 + min {DTW(0,3), DTW(0,2), DTW(0,1)} = 2 + 0 = 2;
DTW(1,4) = 5 + min {DTW(0,4), DTW(0,3), DTW(0,2)} = 5 + 0 = 5;
DTW(1,5) = 3 + min {DTW(0,5), DTW(0,4), DTW(0,3)} = 3 + 0 = 3;
DTW(1,6) = 0 + min {DTW(0,6), DTW(0,5), DTW(0,4)} = 0 + 0 = 0;
第二列:
DTW(2,1) = 3 + min {DTW(1,1), DTW(1,0), DTW(1,-1)} = 3 + 1 = 4;
DTW(2,2) = 1 + min {DTW(1,2), DTW(1,1), DTW(1,0)} = 1 + 1 = 2;
DTW(2,3) = 0 + min {DTW(1,3), DTW(1,2), DTW(1,1)} = 0 + 1 = 1;
DTW(2,4) = 3 + min {DTW(1,4), DTW(1,3), DTW(1,2)} = 3 + 1 = 4;
DTW(2,5) = 1 + min {DTW(1,5), DTW(1,4), DTW(1,3)} = 1 + 2 = 3;
DTW(2,6) = 2 + min {DTW(1,6), DTW(1,5), DTW(1,4)} = 2 + 0 = 2;(这列符合w(n-1) == w(n-2))
第三列:
DTW(3,1) = 3 + min {DTW(2,1), DTW(2,0), DTW(2,-1)} = 3 + 4 = 7;
DTW(3,2) = 1 + min {DTW(2,2), DTW(2,1), DTW(2,0)} = 1 + 2 = 3;
DTW(3,3) = 0 + min {DTW(2,3), DTW(2,2), DTW(2,1)} = 0 + 1 = 1;(这列符合w(n-1) == w(n-2))
DTW(3,4) = 3 + min {DTW(2,4), DTW(2,3), DTW(2,2)} = 3 + 1 = 4;
DTW(3,5) = 1 + min {DTW(2,5), DTW(2,4), DTW(2,3)} = 1 + 1 = 2;
DTW(3,6) = 2 + min {DTW(2,6)∞, DTW(2,5), DTW(2,4)} = 2 + 3 = 5;
第四列:
DTW(4,1) = 5 + min {DTW(3,1), DTW(3,0), DTW(3,-1)} = 5 + 7 = 12;(这列符合w(n-1) == w(n-2))
DTW(4,2) = 3 + min {DTW(3,2), DTW(3,1), DTW(3,0)} = 3 + 3 = 6;(这列符合w(n-1) == w(n-2))
DTW(4,3) = 2 + min {DTW(3,3)
∞, DTW(3,2), DTW(3,1)} = 2 + 3 = 5;
DTW(4,4) = 1 + min {DTW(3,4), DTW(3,3), DTW(3,2)} = 1 + 1 = 2;
DTW(4,5) = 1 + min {DTW(3,5), DTW(3,4), DTW(3,3)} = 1 + 1 = 2;
DTW(4,6) = 4 + min {DTW(3,6), DTW(3,5), DTW(3,4)} = 4 + 2 = 6;
第五列:
DTW(5,1) = 2 + min {DTW(4,1), DTW(4,0), DTW(4,-1)} = 2 + ∞ = ∞ ;
DTW(5,2) = 0 + min {DTW(4,2), DTW(4,1), DTW(4,0)} = 0 + 12 = 12;
DTW(5,3) = 1 + min {DTW(4,3), DTW(4,2), DTW(4,1)} = 1 + 5 = 6;
DTW(5,4) = 4 + min {DTW(4,4), DTW(4,3), DTW(4,2)} = 4 + 2 = 6;(这列符合w(n-1) == w(n-2))
DTW(5,5) = 2 + min {DTW(4,5), DTW(4,4), DTW(4,3)} = 2 + 2 = 4;(这列符合w(n-1) == w(n-2))
DTW(5,6) = 1 + min {DTW(4,6), DTW(4,5), DTW(4,4)} = 1 + 2 = 3;
最终以表格形式给出计算结果:
file

DTW(5,6) 就是最终的累计最短距离,也就是两个数据的差异度表示

本文首发于:算法社区 dspstack.com,转发请注明出处。

2017-09-08 22:00:11 qq_37572875 阅读数 15541
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29971 人正在学习 去看看 张中强

0 语音识别概述 1
1 语音识别的算法 2
1.1.1 DNN-HMM 2
1.1.2 RNN-CTC 3
1.1.4FSMN 3
1.1.5 LSTM-DNN电话交谈语音识别 3
1.1.6Android科大讯飞语音识别源码及API下载 3
2. 语音识别的应用场景 4
2.1语音识别的智能家居框架 4
2.2移动端的使用 5
2.3内容监管上的运用 6
2.3.1 语音识别技术应用之音频切分和分类技术 6
2.3.2 语音识别技术应用之音频模板匹配技术 6
2.3.3 语音识别技术应用之节目的自动发现技术 7
2.4 语音导航系统 7
2.4.1 语音导航系统构架 7
2.5 医疗领域 9
2.6 在社交方面的运用 9
3 语音识别数据集 11
4 语音识别行业分析 12
4.1 智能语音技术取得重大突破,商业化落地成为可能 12
4.2 智能车载、智能家居及可穿戴设备风潮的兴起加速语音技术落地 13
4.3科技巨头,初创公司纷纷从不同维度布局相关产业链 14
4.4 面向物联网的智能语音产业链的形成将引起商业模式的变化 16

0 语音识别概述

研究进程:
http://pan.baidu.com/s/1jHI22DS
算法演替:
https://www.leiphone.com/news/201608/4HJoePG2oQfGpoj2.html
基于深度学习的语音识别应用研究:
http://pan.baidu.com/s/1mhFG7xu
CNN在语音识别上的应用:
http://www.52cs.org/?p=1870
百度CNN语音识别:
https://www.jiqizhixin.com/articles/2016-11-04-4

1 语音识别的算法

1.1.1 DNN-HMM
这里写图片描述
DNN-HMM模型
介绍:
http://blog.csdn.net/xmdxcsj/article/details/52760080
程序:
https://github.com/wenjiegroup/DNN-HMM/tree/master/Codes_packaging

1.1.2 RNN-CTC
http://weibo.com/1402400261/Cz5lomszF?type=comment#_rnd1504833793294

1.1.4FSMN
Python代码:
https://github.com/katsugeneration/tensor-fsmn/blob/master/ptb.py

1.1.5 LSTM-DNN电话交谈语音识别
http://pan.baidu.com/s/1eRC4ZdC
LSTM介绍以及程序实现:https://zybuluo.com/hanbingtao/note/581764

1.1.6Android科大讯飞语音识别源码及API下载
https://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cad=rja&uact=8&ved=0ahUKEwj38KDZj5TWAhWCv1QKHZBvB2QQFgg3MAM&url=http%3A%2F%2Fdditblog.com%2Fitshare_359.html&usg=AFQjCNG5tTtXuKWhNIxoqWUPxaJCKK1O9A

2.语音识别的应用场景

2.1语音识别的智能家居框架

本系统由软件和硬件两部分组成, 如图 2所示.软件部分又分为云端和嵌入式客户端. 云端和客户端各自集成了几个主要模块, 分别实现不同的功能
这里写图片描述

图2 系统架构模型
云端软件运行在 Linux 上, 它包含声学模型、语音模型、语料库、CMU Sphinx 工具包、Java 虚拟机. 云端主要功能是接受客户端发送的语音文件转化成文本文件返回, 应用程序模块全部使用 Java 开发, 调用
CMU Sphinx 提供的类库. 主要功能包含语音识别算法和语义转换模块, 它被部署在 Java 虚拟机上. 语音识别算法的主要过程有: 语音输入、预处理、特征提取、模型匹配、输出结果. 首先必须使用 CMU Sphinx的训练工具以特定声学模型为基础对语料库获取匹配的 MFCC 特征数据, 然后使用 MAP 和 MLLR 自适应技术来改进原来的声学模型。

2.2移动端的使用

随着移动互联网技术的不断发展,尤其是移动终端的小型化、多样化变化趋势,语音识别作为区别于键盘、触屏的人机交互手段之一,在需要解放双手的环境下、对于双手或视觉残障人士、对于无法通过触觉控制的微型设备都具有独特的优势。随着语音识别算法模型、自适应性的加强,相信在未来很长一段时间内,语音识别系统的应用将更加广泛与深入,更多丰富的移动终端语音识别产品将步入人们的日常生活。
就算对于正常人来说,例如寒冷的冬天,有无数次需要用手机却死活不想伸手。打电话,发微信,查路线,叫车,这些如果都可以用一个可穿戴设备通过语音控制实现,那该多好啊。目前出门问问团队以做出搭载 Moto 360 的智能手表操作系统Ticwear,可以实现直接语音控制滴滴打车。
早在一年前,Intel 就开发出可穿戴设备原型 Jarvis,可戴在耳朵上之后连入手机,以此实现听懂主人发出的指令、给予语音反馈的功能,充当类似 Siri 的个人语音助手角色

2.3内容监管上的运用

2.3.1 语音识别技术应用之音频切分和分类技术
音频切分和分类技术的应用范围非常广,以语音识别和关键词处理广播电视音频信息为例,首先要做的就是要打点切分音频打点切分的时候可以利用静音检测方法进行,静音检测法在定位方面确性更高,可以为之后的音频分类奠定基础。在音频打点切分完成后,将切分得到的各音频片段加以分类,使之后的音频处理有据可循。

2.3.2 语音识别技术应用之音频模板匹配技术
知道节目的片头曲或者片尾曲,则可以利用音频模板匹配技术对节目(片段)进行自动打点和分割。在压缩及信号传输的影响下,音频流与固定模板之间会产生巨大差别,而解决鲁棒性是其核心所在,通过基于多频带能量相对比率的特征提取方法,利用各时刻所对应的各个频带的能量分布趋势相对稳定这一特性,解决因为音频扭曲造成不稳定的问题。

2.3.3 语音识别技术应用之节目的自动发现技术
为了更好地进行本次研究,下面笔者将以广告识别作为样本,利用音频重复性检测获取新广告片段,具体内容概括如下:首先,因为针对的是自动发现未知新节目和广告而设计的,所以在实际过程中需要将待处理数据从已知模板中去除掉,以便能够减小计算量;其次,在进行重复候选位置的定位时,通过基于音频向量空间模型的快速音频搜索算法进行定位,但在具体过程中,因为会召回一些错误片段,所以有必要进行过滤处理;再有,利用基于音频指纹的搜索确认,用音频向量空间模型检测出来的重复片段,这样检测出的结果准确性更高,进行重复候选确认,进而检测出误报片段。
通过上述几个步骤的操作,余下的片段均是重复片段,既有广告内容的重复部分,也有新闻或者电视节目中的重复部分,然后利用图像帧变化率这一特征进行区分,将广告重复部分之外的内容去除。

2.4 语音导航系统

2.4.1 语音导航系统构架
这里写图片描述

1)客户通过手机或者固话,利用排队机接入呼叫中心系统,在 CTI 和 IVR 的控制下,当用户需要语音导航业务时,通过呼叫平台实现话务接入,平台记录下的原始语音文本,并进行播报用户确认无误后,将该文件作为语音识别引擎的输入;
2)原始的语音文件信息经过语音识别模块,分别经过特征提取、端点检测、去燥处理等语音识别预处理技术,经过处理过的较为干净的语音文件在经过离线解码、在线解码、置信度等处理,转出成自然语言文本信息,并将原始文件信息、原始语音信息、语音特征信息存入文本 / 语音语库中。
3)将自然语言文本信息经过自然语言处理,分别经过模式匹配、语法分析、语义解析、语义搜索、上下文管理、预测等技术处理,将自然语言文本信息转换成计算机能识别的语音信息作为输出物。
4)并进行业务需求的分析,为自然语言处理引擎提供关键数据输入。

2.5 医疗领域

不仅是简单的通过智能手表追踪运动情况和心率,还有直接根据人的身体状况匹配相应的服务如合适的餐厅或食物等,当然这些大多是基于可穿戴设备的。另外还需要考虑到更多场景,诸如紧急语音求助,医患对话存档,呼叫中心的对话听写等。
由于医疗领域词汇库专业性强演变性弱,只要建立完整的数据库,就可以做到对疾病名称、药品名称相对精确的识别。国内已有的应用如病历夹与珍立拍,为医生提供一个安全存储病历资料的云空间,方便查找病例,支持语音搜索功能。

2.6 在社交方面的运用

A、熟人通讯方面,我们应该都见过这样的场景,出租车上司机们通过对讲平台互相勾兑、插科打诨。路上匆忙的低头族,很多都在回微信,而如果通过声控交互构建一个对讲平台,这个体验就完全不一样了,你不需要用眼和手也可以随时给某某捎去一段话,别人给你发来语音、声控交互会提示你是否接听,而如果这个交互可以通过耳麦自动识别微小的语音(并根据接听者情况适度放大),那么以后走在路上就可以轻松而不违和地与人通话了,这个事情的意义在于将从另一个角度接管用户的关系链,形成大网优势。
B、陌生人社交方面,当下社交产品最大的痛点就是社交质量差、低效社交多、效率远远赶不上用户预期,一个突出表现就是搭讪无人理睬、理睬也在若干小时之后(所以人们为何喜欢直播,因为美女主播至少会说谢谢反馈下),但是语音沟通是一个更加强调即时性和真实性的场景,又不像视频那么需要“化妆和端着”,所以反而可能成为新的突破口。至于当下的语音社交平台为何多数做的不好,因为太像色情声讯台了!
C、兴趣推荐。如果选择值得一听的声音节目成本如此之高,那么一个比较好的办法就是基于兴趣的推荐来降低选择难度。比如喜马拉雅已经推出了“猜你喜欢”系统,可以通过深度学习、进行类似今日头条那样的个性化推荐。那么再进一步,如果以后这个推荐可以不需要通过眼睛完成呢,直接传来一个声音:“小喜根据你的爱好搜到了几个节目,下面念下标题,你感兴趣就喊要这个……”
D、时空触发。这个意思是,应该给更多的信息赋予时空属性,比如在某一时刻放出,或者在某一位置放出。举一个例子,你今天刚到一家商场,连上wifi,耳麦里立刻提醒你有最新的优惠活动信息、要不要听。你像即刻那样设置一些关注节点,比如某股又跌了,当这个消息到来,耳麦里立刻提醒你要不要听。你到达某个景点,耳边响起景点的典故。你晚上睡不着了,耳边响起周围人的声音,像不像《her》?
E、做强参与。同为视频,直播爆火的劲头远远强于当年的视频平台和短视频,这也释放了一个信号,用户并不满足于成为单向的内容接受者,他们也希望成为内容的参与者甚至再创作者,他们也希望得到更多的互动和回馈,来满足参与感、存在感和归属感,所以类似电台的互动直播很重要。

3 语音识别数据集

一2000 HUB5 English:仅包含英语的语音数据集,百度最近的论文《深度语音:扩展端对端语音识别》使用的是这个数据集。
地址:https://catalog.ldc.upenn.edu/LDC2002T43
二:LibriSpeech:包含文本和语音的有声读物数据集,由近500小时的多人朗读的清晰音频组成,且包含书籍的章节结构。
地址:http://www.openslr.org/12/
三:VoxForge:带口音的语音清洁数据集,对测试模型在不同重音或语调下的鲁棒性非常有用。
地址:http://www.voxforge.org/
四:TIMIT:英文语音识别数据集。
地址:https://catalog.ldc.upenn.edu/LDC93S1
五:CHIME:包含环境噪音的语音识别挑战赛数据集。该数据集包含真实、模拟和清洁的语音录音,具体来说,包括4个扬声器在4个有噪音环境下进行的将近9000次录音,模拟数据是将多个环境组合及在无噪音环境下记录的数据。
地址:http://spandh.dcs.shef.ac.uk/chime_challenge/data.html
六:TED-LIUM:TED Talk 的音频数据集,包含1495个TED演讲的录音及全文的文字稿。
地址:http://www-lium.univ-lemans.fr/en/content/ted-lium-corpus
七:ai_challenger_interpretation_train
地址:http://pan.baidu.com/s/1skIUjiH

4 语音识别行业分析

4.1 智能语音技术取得重大突破,商业化落地成为可能

◈智能语音技术是人工智能产业链上的关键一环
人工智能产业链主要分为三个层次。
底层是基础设施,包括芯片、模组、传感器,以及以大数据平台、云计算服务和网络运营商。这部分参与者以芯片厂商、科技巨头、运营商为主。
中间层主要是一些基础技术研究和服务提供商。包括深度学习/机器学习、计算机视觉、语音技术和自然语言处理以及机器人等领域。这一模块需要有海量的数据,强大的算法,以及高性能运算平台支撑。代表性企业主要有BAT、科大讯飞、微软、亚马逊、苹果、facebook等互联网巨头和国内一些具有较强科技实力的人工智能初创公司。
最上层是行业应用。大致分为2B和2C两个方向。2B的代表领域包括安防、金融、医疗、教育、呼叫中心等。2C的代表领域包括智能家居、可穿戴设备、无人驾驶、虚拟助理、家庭机器人等。相关代表性企业既包括互联网科技巨头,也包括一些初创厂商。
◈ 中国人工智能市场规模持续增长,智能语音将居于重要地位
◈ 智能语音技术成熟,商业化应用成为可能
深度学习、高性能运算平台和大数据是人工智能技术取得突破的核心助推力。深度学习端到端解决了特征表示与序列影射的问题,使得人工智能的性能得到了快速提升;而互联网时代海量的数据又不断为算法模型提供了训练材料,同时,云计算的兴起和高性能的运算平台为智能化提供了强大的运算能力和服务能力。
在语音识别率方面,百度、谷歌,科大讯飞等主流平台识别准确率均在96%以上,稳定的识别能力为语音技术的落地提供了可能。
◈ 商业场景落地的重要环节语音交互有了重大突破
与此同时,语音交互的核心环节也取得重大突破。语音识别环节突破了单点能力,从远场识别,到语音分析和语义理解有了重大突破,呈现一种整体的交互方案。

4.2 智能车载、智能家居及可穿戴设备风潮的兴起加速语音技术落地

◈ 智能语音市场整体处于启动期,智能车载,智能家居,智能可穿戴等垂直领域处于爆发前夜
◈ 智能车载市场前景广阔,预计五年内车联网渗透率超过50%,语音将成为车载系统标配
◈ 智能家电渗透率提高,智能家居市场蕴涵千亿市场规模,语音作为家居交互入口将大有所为

4.3科技巨头,初创公司纷纷从不同维度布局相关产业链

◈ 国外科技巨头:通过并购等手段,夯实核心技术,开放应用平台,在既有的产品和业务中实现AI first,扩展以AI为核心的生态系统
在技术层,科技巨头多推出算法平台吸引开发者,实现产品快速迭代,打造开发者生态链,形成行业标准。例如,谷歌通过一系列并购、开放平台的建立,软件硬件一体化来打造这个生态系统。
苹果在自身生态系统中相继推出面向可穿戴、家居、车载等领域的产品。亚马逊则基于自身电商生态业务,推出智能音箱,成功敲开了智能家居的大门。
◈ 谷歌:延续既有开放模式,打造开发者生态链,推出Google Home,试图建立物联网时代安卓系统
在谷歌的AI first战略中,一方面,推出人工智能学习系统平台TensorFlow,以吸引开发者,实现产品快速迭代,打造开发者生态链,形成行业标准;另一方面,推出谷歌家庭,试图建立物联网时代安卓系统。同时,将AI技术应用于其原有的产品中,比如Google输入法、Google 翻译、Google Now等,不断提升产品性能,优化用户体验。
◈ 苹果:基于智能硬件定标准、做平台、获数据 ,重视物联网时代生态控制权
与谷歌的开放生态不同,苹果依旧延续了其既有的封闭系统,瞄准物联网时代的生态控制权。同时,以硬件擅长的苹果这次仍从布局硬件起步,打造软硬件生态系统,依靠其广泛的OS系统用户,再基于已推广的OS系统拓展至物联网产业链。
◈ 国内互联网巨头:开放语音生态系统,以产业内合作的方式,将语音技术植入产品和或应用于相关业务场景,构建全产业生态链
在中国,以BAT等为代表的众多互联网巨头也纷纷开发智能语音市场。在语音生态系统方面,百度宣布语音识别技术及能力全面开放。腾讯、搜狗语音开放平台相继上线。
◈ 百度:瞄准人工智能战场,对外开放语音生态系统,对内在自身产品业务中实现AI First
◈ 国内智能语音公司:依托原有优势,从单一智能语音技术商转型全方位人工智能技术服务商
◈ 科大讯飞:传统优势明显,未来将更注重通用人工智能技术和平台级业务的拓展
科大讯飞长期在教育领域拥有绝对优势。除教育外,政府便民工程、呼叫中心和客服也是讯飞长期深耕的领域。
近两年讯飞的重点关注的领域开始向移动互联网和物联网转移。从业务布局层面看,先后发布讯飞云平台和人工智能交互平台AIUI,利用通用的人工智能技术和平台级业务,将语音识别、自然语言处理能力授权给第三方,或者与其他公司进行合作,并且开始向垂直领域拓展。
◈ 初创厂商:以垂直领域和细分场景为突破口,重点布局家居,车载和可穿戴设备
◈ 图灵机器人:定位于语义和认知计算的平台服务提供商,提供聊天机器人平台和机器人操作系统

4.4 面向物联网的智能语音产业链的形成将引起商业模式的变化

◈ 未来趋势:以语音为入口,建立以物联网为基础的商业模式
◈ 智能家居:以合适的入口级应用为载体,基于万物互联的标准,将技术与硬件结合,实现内容和服务的拓展
◈ 智能车载:车联网向纵深方向发展,硬件基础功能免费,基于用户数据的挖掘和增值服务将成为未来主要赢利点

转载自:
《新型工业化》开放式获取期刊:www.chinaxxgyh.com
语音识别技术在内容监管中的应用 郭莉亚 田书云 国家新闻出版广电总局 282 台
语音识别自适应算法在智能家居中的应用 蒋 泰, 张林军(桂林电子科技大学 计算机与信息安全学院, 桂林 541004
作者:辩手李慕阳
链接:https://www.zhihu.com/question/20128179/answer/109598639
来源:知乎
智能家居中语音识别系统的算法研究 郭莉莉,王 迪,魏惠芳 (沈阳城市建设学院,110167

2018-09-29 14:57:42 weixin_42039090 阅读数 3665
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29971 人正在学习 去看看 张中强

目前

目前的语音识别算法:

  1. 卷积神经网络

  2. 深度学习神经网络

  3. BP神经网络

  4. RBF神经网络

  5. 模糊聚类神经网络

  6. 改进的T-S模糊神经网络

  7. 循环神经网络

  8. 小波神经网络

  9. 混沌神经网络

  10. 小波混沌神经网络

  11. 神经网络和遗传算法

  12. 动态优化神经网络

  13. K均值和神经网络集成

  14. HMM与自组织神经网络的结合

  15. 正交基函数对向传播过程神经网络

  16. HMM和新型前馈型神经网络

  17. 特征空间随机映射

  18. SVM多类分类算法

  19. 特征参数归一化

  20. 多频带谱减法

  21. 独立感知理论

  22. 分段模糊聚类算法VQ-HMM

  23. 优化的竞争算法

  24. 双高斯GMM特征参数

  25. MFCC和GMM

  26. MFCCs和PNN

  27. SBC和SMM

  28. MEL倒谱系数和矢量量化

  29. DTW

  30. LPCC和MFCC

  31. 隐马尔科夫模型HMM

       由于BP算法在神经网络的层数增多时容易陷入局部最优的困境,也很容易产生过拟合的问题。20世纪90年代,各种各样的浅层机器学习模型相继被提出,如支撑向量机(Support Vector Machines, SVM)、Boosting、最大熵方法(如 Logistic Regression, LR)等。这些模型具有高效的学习算法,且不存在局部最优的问题,在理论分析与实际应用中都获得了巨大的成功。相比之下,MLP的训练需要很多经验和技巧,多层前馈神经网络的研究逐渐变得冷清。

       随着2006年深度神经网络(DNN)和深度学习(deep丨earning)概念的提出,神经网络又成为机器(统计)学习领域的研究热点。这些名词由多伦多大学的Geoff Hinton研究组于2006年创造。

Hinton研究组提出:

  • 1)多隐藏层的人工神经网络具有优异的特征学习能力,学习得到的特征对数据有更本质的刻画,从而有利于可视化或分类;
  • 2)深度神经网络在训练上的难度,可以通过“逐层预训练”(layer-wise pre-training)来有效克服。关于预训练有助于深度学习的原因,最直接的解释是预训练将网络参数训练到一组合适的初始值,从这组初始值出发会得到一个较优的局部最优解。
  • 卷积神经网络(Convo丨utional Neural Network, CNN)由纽约大学的 Yann 1^60111[6]于1998年提出(如图1.2所示),在手写体认别、交通标志识别等图像分类任务中得到了广泛应用。CNN本质上是一个多层感知机,其成功的原因关键在于它所采用的局部连接和共享权值的方式,一方面减少了的权值的数量使得网络易于优化,另一方面降低了过拟合的风险。

                                                                        

        上图中,圆圈代表神经网络的一个输入值,“+1”标识的圆圈称为偏置神经元,也就是截距项。神经网络最左边的一层叫做输入层,最右的一层叫做输出层(本例中,输出层只有一个神经元)。中间所有神经元组成的一层叫做隐藏层,隐藏层神经元功能是以某种方式介入输入与输出之间。可以看到,图1.1神经网络有3个输入单元(偏置单元不计算在内),1个隐藏层及1个输出单元。CNNs 由一组或多组卷积层 convolutional layer + 采样层 pooling layer 构成。一个卷积层中包含若干个不同的卷积器,这些卷积器对语音的各个局部特征进行观察。采样层通过对卷积层的输出结点做固定窗长的采样,减少下一层的输入结点数,从而控制模型的复杂度。一般采样层采用最大采样算法( max poo-ling) ,即对固定窗长内的结点选取最大值进行输出。最后,通过全网络层将采样层输出值综合起来,得到最终的分类判决结果。

 

 

 

 

 

 

2012-10-03 20:17:11 zwy06226326 阅读数 3604
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29971 人正在学习 去看看 张中强

        提起人工智能优化算法,你可能首先想到的是遗传算法、PSO算法、模拟退火算法。的确,微分进化算法长久以来一直不被重视。但是,不可否认的是,近年来,微分进化应用的领域不断的扩大,也有越来越多的人去研究。那么,什么是微分进化算法呢?

     微分进化算法和遗传算法一样,同属于进化算法,但是微分进化(DE) 是比较新的基于群体的随机优化方法。它具有简单、快速、鲁棒性好等特点。不同于其它进化算法,它的变异算子是由种群中任意选取的多对向量的差值得到的。微分进化主 要用于实参数优化问题,在非线性和不可微的连续空间问题上优于其它进化方法。

    微分进化算法秉承着进化算法的特性,模拟生物的进化,根据适者生存的法则,通过多次迭代,找到搜索控件内的最优解。与其他进化算法相比,包含着相似机理,如初始化种群,进行变异,交叉和选择操作,不断进化更新,判断停止条件,等等。下面是实现的代码:

//产生一个服从正太分布的随机数
float rnd_uni(long *idum) {
 long j, k;
 static long idum2 = 123456789;
 static long iy = 0;
 static long iv[NTAB];
 float temp;

 if (*idum <= 0) {
  if (-(*idum) < 1) {
   *idum = 1;
  } else {
   *idum = -(*idum);
  }
  idum2 = (*idum);
  for (j=NTAB+7;j >= 0;j--) {
   k = (*idum)/IQ1;
   *idum = IA1*(*idum - k*IQ1) - k*IR1;
   if (*idum < 0) {
    *idum += IM1;
   }
   if (j < NTAB) {
    iv[j] = *idum;
   }
  }
  iy = iv[0];
 }
 k = (*idum)/IQ1;
 *idum = IA1*(*idum - k*IQ1) - k*IR1;
 if (*idum < 0) {
  *idum += IM1;
 }
 k = idum2/IQ2;
 idum2 = IA2*(idum2 - k*IQ2) - k*IR2;
 if (idum2 < 0) {
  idum2 += IM2;
 }
 j = iy/NDIV;
 iy = iv[j] - idum2;
 iv[j] = *idum;
 if (iy < 1) {
  iy += IMM1;
 }
 double AM = (1.0/IM1);
 temp = (float) AM*iy;
 if (temp > RNMX) {
  return (float) RNMX;
 } else {
  return temp;
 }
}

//进化操作(对个体进行评估)

float evaluate(int D, float tmp[]) {
 int i, j;
 int const M = 60;
 float px, x = -1, dx = M, result = 0;
 for (i=0;i<D;i++)
 {
  px=tmp[i];
  result+=(1-px)*(1-px);   // 目标函数
 }
 return result;
}

//主函数

int main ()

{

 int   i, j, L, n;                   
 int   r1, r2, r3, r4,r5;  // 用来产生随机数
 int   imin;            // index to member with lowest energy   
 int   gen;   //迭代的次数

 int seed;

 int D,NP,iterations;
 long  nfeval;          // number of function evaluations    
 float trial_energy;    // 缓冲变量               
 float inibound_h;      // 参数的上限            
 float inibound_l;      // 参数的下限             
 float tmp[MAXDIM], best[MAXDIM], bestit[MAXDIM]; // members 
 float energy[MAXPOP];  // obj. funct. values                 
 float F  , CR;           // control variables of DE           
 float emin;            // help variables                     

 rnd_uni_init = -seed;  // initialization of rnd_uni()
 nfeval       =  0;           // reset number of function evaluations
 float r;


 // spread initial population members
 for (i=0; i<NP; i++) {
  for (j=0; j<D; j++) {
   r = rnd_uni(&rnd_uni_init);
   c[i][j] = inibound_l + r*(inibound_h - inibound_l);
  }
  energy[i] = evaluate(D, c[i], &nfeval,index);
  // printf("%2d %20.8f %3d\n", i, energy[i], nfeval);
  // cin.get(ch);
 }
 //for(i=0;i<NP;i++)
 // {
 //  pause[i]=energy[i];

 // }
 account=NP;
 emin = energy[0];
 imin = 0;
 for (i=1; i<NP; i++) {
  if (energy[i] < emin) {
   emin = energy[i];
   imin = i;
  }
 }
 CopyVector(best, c[imin]);
 CopyVector(bestit, c[imin]);

 // old population (generation G)
 // new population (generation G+1)
 CopyArray(oldarray, c);
 // new population (generation G+1)
 CopyArray(newarray, d);

 // Iteration loop
 gen = 0; // generation counter reset
 while ((gen <iterations)) {      //迭代
  gen++;
  imin = 0;

  for (i=0; i<NP; i++) {
   // Pick a random population member
   do {
    // Endless loop for NP < 2 !!!
    r = rnd_uni(&rnd_uni_init);
    r1 = (int)(r*NP);
   } while(r1 == i);           

   do {
    // Endless loop for NP < 3 !!!
    r = rnd_uni(&rnd_uni_init);                        
    r2 = (int)(r*NP);
   } while((r2 == i) || (r2 == r1));

   do {
    // Endless loop for NP < 4 !!!    
    r3 = (int)(rnd_uni(&rnd_uni_init)*NP);
   } while((r3 == i) || (r3 == r1) || (r3 == r2));

   do {
    // Endless loop for NP < 5 !!!    
    r4 = (int)(rnd_uni(&rnd_uni_init)*NP);
   } while((r4 == i) || (r4 == r1) || (r4 == r2) || (r4 == r3));

   do {
    // Endless loop for NP < 6 !!!    
    r5 = (int)(rnd_uni(&rnd_uni_init)*NP);
   } while((r5==i) || (r5==r1) || (r5==r2) || (r5==r3) || (r5==r4));

 

   // strategy DE0 (not in our paper)
   if (strategy == 1) {
    for (int k=0; k<MAXDIM; k++) {
     tmp[k] = oldarray[i][k];
    }
    n = (int)(rnd_uni(&rnd_uni_init)*D);
    L = 0;
    do {                      
     tmp[n] = bestit[n] + F*(oldarray[r2][n] - oldarray[r3][n]);
     n = (n+1)%D;
     L++;
    } while((rnd_uni(&rnd_uni_init) < CR) && (L < D));
   }
   // DE/rand/1/exp
   // This is one of my favourite strategies. It works especially well when the
   // "bestit[]"-schemes experience misconvergence. Try e.g. F=0.7 and CR = 0.5
   // as a first guess.
   // strategy DE1 in the techreport
   else if (strategy == 2) {
    for (int k=0; k<MAXDIM; k++) {
     tmp[k] = oldarray[i][k];
    }
    n = (int)(rnd_uni(&rnd_uni_init)*D);
    L = 0;
    do {                      
     tmp[n] = oldarray[r1][n] + F*(oldarray[r2][n] - oldarray[r3][n]);
     n = (n+1)%D;
     L++;
    } while((rnd_uni(&rnd_uni_init) < CR) && (L < D));
   }
   // DE/rand-to-best/1/exp
   // This strategy seems to be one of the best strategies. Try F=0.85 and CR = 1.0
   // If you get misconvergence try to increase NP. If this doesn't help you
   // should play around with all three control variables.
   // similiar to DE2 but generally better
   else if (strategy == 3) {
    for (int k=0; k<MAXDIM; k++) {
     tmp[k] = oldarray[i][k];
    }
    n = (int)(rnd_uni(&rnd_uni_init)*D);
    L = 0;
    do {                      
     tmp[n] = tmp[n] + F*(bestit[n] - tmp[n]) + F*(oldarray[r1][n] - oldarray[r2][n]);
     n = (n+1)%D;
     L++;
    } while((rnd_uni(&rnd_uni_init) < CR) && (L < D));
   }
   // DE/best/2/exp is another powerful strategy worth trying
   else if (strategy == 4) {
    for (int k=0; k<MAXDIM; k++) {
     tmp[k] = oldarray[i][k];
    }
    n = (int)(rnd_uni(&rnd_uni_init)*D);
    L = 0;
    do {                          
     tmp[n] = bestit[n] + (oldarray[r1][n] + oldarray[r2][n] - oldarray[r3][n] - oldarray[r4][n])*F;
     n = (n+1)%D;
     L++;
    } while((rnd_uni(&rnd_uni_init) < CR) && (L < D));
   }
   // DE/rand/2/exp seems to be a robust optimizer for many functions
   else if (strategy == 5) {
    for (int k=0; k<MAXDIM; k++) {
     tmp[k] = oldarray[i][k];
    }
    n = (int)(rnd_uni(&rnd_uni_init)*D);
    L = 0;
    do {                          
     tmp[n] = oldarray[r5][n] + (oldarray[r1][n] + oldarray[r2][n] - oldarray[r3][n] - oldarray[r4][n])*F;
     n = (n+1)%D;
     L++;
    } while((rnd_uni(&rnd_uni_init) < CR) && (L < D));
   }
   // Essentially same strategies but BINOMIAL CROSSOVER
   // DE/best/1/bin
   else if (strategy == 6) {
    for (int k=0; k<MAXDIM; k++) {
     tmp[k] = oldarray[i][k];
    }
    n = (int)(rnd_uni(&rnd_uni_init)*D);
    // perform D binomial trials
    for (L=0; L<D; L++) {
     // change at least one parameter
     if ((rnd_uni(&rnd_uni_init) < CR) || L == (D-1)) {                      
      tmp[n] = bestit[n] + F*(oldarray[r2][n] - oldarray[r3][n]);
     }
     n = (n+1)%D;
    }
   }
   // DE/rand/1/bin
   else if (strategy == 7) {
    for (int k=0; k<MAXDIM; k++) {
     tmp[k] = oldarray[i][k];
    }
    n = (int)(rnd_uni(&rnd_uni_init)*D);

    for (L=0; L<D; L++) {
     // change at least one parameter
     if ((rnd_uni(&rnd_uni_init) < CR) || L == (D-1)) {                      
      tmp[n] = oldarray[r1][n] + F*(oldarray[r2][n] - oldarray[r3][n]);
     }
     n = (n+1)%D;
    }
   }
   // DE/rand-to-best/1/bin
   else if (strategy == 8) {
    for (int k=0; k<MAXDIM; k++) {
     tmp[k] = oldarray[i][k];
    }
    n = (int)(rnd_uni(&rnd_uni_init)*D);
    for (L=0; L<D; L++) {
     if ((rnd_uni(&rnd_uni_init) < CR) || L == (D-1)) {                      
      tmp[n] = tmp[n] + F*(bestit[n] - tmp[n]) + F*(oldarray[r1][n] - oldarray[r2][n]);
     }
     n = (n+1)%D;
    }
   }
   // DE/best/2/bin
   else if (strategy == 9) {
    for (int k=0; k<MAXDIM; k++) {
     tmp[k] = oldarray[i][k];
    }
    n = (int)(rnd_uni(&rnd_uni_init)*D);
    for (L=0; L<D; L++) {
     if ((rnd_uni(&rnd_uni_init) < CR) || L == (D-1)) {                      
      tmp[n] = bestit[n] + (oldarray[r1][n] + oldarray[r2][n] - oldarray[r3][n] - oldarray[r4][n])*F;
     }
     n = (n+1)%D;
    }
   }
   // DE/rand/2/bin
   else {
    for (int k=0; k<MAXDIM; k++) {
     tmp[k] = oldarray[i][k];
    }
    n = (int)(rnd_uni(&rnd_uni_init)*D);
    for (L=0; L<D; L++) {
     if ((rnd_uni(&rnd_uni_init) < CR) || L == (D-1)) {                      
      tmp[n] = oldarray[r5][n] + (oldarray[r1][n] + oldarray[r2][n] - oldarray[r3][n] - oldarray[r4][n])*F;
     }
     n = (n+1)%D;
    }
   }

   // Trial mutation now in tmp[]. Test how good this choice really was.
   trial_energy = evaluate(D, tmp, &nfeval,index);  // Evaluate new vector in tmp[]
   // improved objective function value?
   if (trial_energy <= energy[i]) {                                 
    energy[i] = trial_energy;        
    for (int k=0; k<MAXDIM; k++) {
     newarray[i][k] = tmp[k];
    }
    // Was this a new minimum?
    if (trial_energy<emin) {
     // reset emin to new low...
     emin = trial_energy;          
     imin = i;
     for (int k=0; k<MAXDIM; k++) {
      best[k] = tmp[k];
     }        
    }                          
   } else {
    for (int k=0; k<MAXDIM; k++) {
     newarray[i][k] = oldarray[i][k];
    }
   }
  }

  CopyVector(bestit, best);  // Save best population member of current iteration
  CopyArray(swaparray, oldarray);
  CopyArray(oldarray, newarray);
  CopyArray(newarray, swaparray);

}

 

2015-09-22 16:25:43 Joe_LQ 阅读数 2091
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29971 人正在学习 去看看 张中强

算法描述

        EP 是 L. J. Fogel 于20世纪60年代在人工智能研究中提出的一种有限状态机进化模型,在此模型中机器的状态基于分布的规律进行编译。

        D. B. Fogel 在90年代拓广了 EP 思想,使它可处理实数空间的优化问题,并在变异运算中引入了正态分布变异算子,这样 EP 就变成了一种优化搜索工具,并在很多实际问题中得到了应用。

        EP 模拟生物种群层次上的进化,因此在进化过程中主要强调生物种群行为上的联系,即强调种群层次上的行为进化而建立父、子代间的行为链,意味着好的子代才有资格生存,而无论其父代如何,适于选择子代。

算法流程

初始化(个体表现型X, 群体规模N, 迭代次数G等)
随机产生初始群体并计算适应值(含N 个个体) 
while (not done)
{
	for(i = 1; i < N; i++)
	{
		对Xi进行变异得到Xi' 
		对Xi进行可行性检查
		计算xi的适应值 
	}
	从2N 个个体中选择N 个个体 
} 
输出结果 

对算法流程的解释

        ①个体表现型X : X = (x1, x2, ┉┉ ,xn, σ1,σ2, ┉┉ σn),其中x1 ┉┉ xn为个体表现的分量,σ1 ┉┉ σn为个体表现分量的变异参数;

        ②群体规模N : 为改算法中包含的个体数;

        ③随机产生初始群体 : 在个体表现型X中对于个体 xi 初始化为再该分量中范围内随机取值,σi 根据 N(0, 1)产生,并计算该个体的适应值;

        ④对 Xi 进行变异得到 Xi‘  : 可根据如下公式进行变异;


        ⑤对 Xi’ 进行可行性检查,计算适应值 : 对 Xi‘ 中的各个分量在取值范围内进行判断,若不符合取值范围,处理方法可见下一节,若符合,计算该个体的适应值;

        ⑥从2N个个体中选择N个个体 : 方法采用随机型q-竞争法,详细请参看下一篇博文;

一些问题的解释

        ①个体变异不成功: 可采用三种方法:(1)重新变异直至可行; (2)从解空间中随机选取一个可行解代替; (3)选择当代中的最优解代替;

        ②变异公式: 变异公式可根据实际情况略作修改,如:将 + 改为 - ;

代码示例

        示例代码求取 f(x) = x1 * x1 + x2 * x2 在区间(-1000, 1000)的最小值。

        示例代码下载地址: http://download.csdn.net/detail/joe_lq/9131119

差分进化算法

阅读数 493

进化算法

阅读数 5132

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