2014-02-18 11:43:38 whaoXYSH 阅读数 5538
  • C++语音识别开篇

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

    6114 人正在学习 去看看 杨波

概念

“ 鸡尾酒会问题”(cocktail party problem)是在计算机语音识别领域的一个问题。当前语音识别技术已经可以以较高精度识别一个人所讲的话,但是当说话的人数为两人或者多人时,语音识别率就会极大的降低,这一难题被称为鸡尾酒会问题

解决方案  


斯坦福大学的Andrew NG教授的机器学习公开课(http://v.163.com/special/opencourse/machinelearning.html(ml-class.org)在第一章unsupervised learning那段视频里解决鸡尾酒会问题(cocktail party problem)就写了一行代码:[W,s,v] = svd ((repmat(sum(x.*x,1),size(x,1),1).*x)*x');


用fastICA算法可以比较好地解决http://research.ics.tkk.fi/ica/fastica/


http://www.endolith.com/wordpress/2009/11/22/a-simple-fastica-example/ 是一个分离音乐的例子,效果比较明显。用的就是fastICA的python实现。不过好像用来解决cocktail party problem的话效果不太好。


Blind Source Separation of recorded speech and music signalshttp://cnl.salk.edu/~tewon/Blind/blind_audio.html

 
2016-09-22 20:41:11 pipisorry 阅读数 1660
  • C++语音识别开篇

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

    6114 人正在学习 去看看 杨波


Introduction

“ 鸡尾酒会问题”(cocktail party problem)是在计算机语音识别领域的一个问题,当前语音识别技术已经可以以较高精度识别一个人所讲的话,但是当说话的人数为两人或者多人时,语音识别率就会极大的降低,这一难题被称为鸡尾酒会问题。

解决方案

斯坦福大学的Andrew NG教授的机器学习公开课(http://v.163.com/special/opencourse/machinelearning.html)(ml-class.org)

在第一章unsupervised learning那段视频里解决鸡尾酒会问题(cocktail party problem)就写了一行代码:

[W,s,v] = svd ((repmat(sum(x.*x,1),size(x,1),1).*x)*x');

用fastICA算法可以比较好地解决http://research.ics.tkk.fi/ica/fastica/

http://www.endolith.com/wordpress/2009/11/22/a-simple-fastica-example/ 是一个分离音乐的例子,效果比较明显。用的就是fastICA的python实现。不过好像用来解决cocktail party problem的话效果不太好。

Blind Source Separation of recorded speech and music signals:http://cnl.salk.edu/~tewon/Blind/blind_audio.html

from:


2014-01-21 11:10:45 mycomshare 阅读数 21792
  • C++语音识别开篇

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

    6114 人正在学习 去看看 杨波

“鸡尾酒会问题”(cocktailparty problem)是在计算机语音识别领域的一个问题,当前语音识别技术已经可以以较高精度识别一个人所讲的话,但是当说话的人数为两人或者多人时,语音识别率就会极大的降低,这一难题被称为鸡尾酒会问题。

该问题描述的是给定混合信号,如何分离出鸡尾酒会中同时说话的每个人的独立信号。当有N个信号源时,通常假设观察信号也有N个(例如N个麦克风或者录音机)。该假设意味着混合矩阵是个方阵,即J = D,其中D是输入数据的维数,J是系统模型的维数。

 

要分离出鸡尾酒会中同时说话的每个人的独立信号,常用的方法是盲信号分离算法。

 



1 盲信号分离

1.1 简介

盲信号(BlindSource Separation,BSS)分离指的是从多个观测到的混合信号中分析出没有观测的原始信号。通常观测到的混合信号来自多个传感器的输出,并且传感器的输出信号独立性(线性不相关)。盲信号的“盲”字强调了两点:1)原始信号并不知道;2)对于信号混合的方法也不知道。

 

1.2 原理(简单的数学描述)

为了简单易懂,我们先看看只有两个信号源的情况,即观测信号也是只有两个。 和 是两个源信号; 和 是两个观测信号; 和 是对声源信号 和 的估计。矩阵A是混合矩阵(说得有点别扭,混合矩阵就是将两个信号混合在一起,然后产生输出两个观测信号)。W是权重矩阵(用于提取估计出声源信号)。下面就是BSS算法的主要流程图。


 

图1 BSS算法主要流程图

 

下面是图1所示流程的,矩阵表达形式:

 


图2 BSS算法主要流程方程形式

 

 

看完简单的,我们看看难一点的,盲信号分离的模型。

具有n个独立的信号源和n个独立的观察量,观察量和信号源具有如下的关系:


其中 , , A是一个的系数矩阵,原问题变成了已知的独立性,求对 的估计问题。

假定有如下公式


其中是对 的估计,W是一个 系数矩阵,问题变成了如何有效的对矩阵W做出估计。

因此,BSS的主要工作是寻找一个线性滤波器或者是一个权重矩阵W。理想的条件下,W矩阵是A矩阵的逆矩阵。

由于参数空间不是欧几里得度量,在大多的情况下都是黎曼度量,因此对于W矩阵的求解选用自然梯度解法。

 

1.3 自然梯度法计算W矩阵

自然梯度法的计算公式为:


其中W为我们需要估计的矩阵。为步长,是一个非线性变换,比如

实际计算时y为一个矩阵,m为原始信号个数,k为采样点个数

 

计算步骤:

1)初始化W(0)为单位矩阵;

2)循环执行如下的步骤,直到W(n+1)与W(n)差异小于规定值(计算矩阵差异的方法可以人为规定),有时候也人为规定迭代次数;

3)利用公式 ,(其中 );

4)利用公式


2 程序实现

1.main.m

% fftproject.m
% By: Johan Bylund(原始作者)
% 修改注释:Harvey
close all;
clear, clf, format compact;
% Makes a matrix out of wav files in project directory.
% The arreys will all be in the same length as the shortest one.
% Files longer than the shortest one will be truncated.
disp('Reading .wav files from project directory');
mic_1=wavread('000100100mix2.wav'); %Reading file from right microphone.
mic_2=wavread('000100100mix1.wav'); %Reading file from left microphone.
size(mic_1)
size(mic_2)

% The below operation makes them 1xN:
% 将矩阵设置成1*N的矩阵就一行多列的矩阵
mic_1=mic_1';
mic_2=mic_2';

% 规范长度,将长度统一在一起
if length(mic_1)>length(mic_2)
mic_1=mic_1(1:length(mic_2));
else
mic_2=mic_2(1:length(mic_1));
end
size(mic_1)
size(mic_2)
% 分别播放两个原始的接受源信号
disp('Playing the recording of the right microphone (closer to music)');
soundsc(mic_1)
disp('Playing the recording of the left microphone (closer to me)');
soundsc(mic_2)
subplot(2,1,1)
plot(mic_1), axis([0 16000 -0.12 0.12]);
title('Right microphone (closer to music)')
xlabel('Sampled points');
subplot(2,1,2)
plot(mic_2), axis([0 16000 -0.12 0.12]);
title('Left microphone (closer to me)')
xlabel('Sampled points');

% I also choose to look at the frequency spectra of the signal:
% 信号频谱经过快速傅立叶变换显示
Fs=8000; % Sampling frequency
% Matrix with the frequency spectra from the two microphones:
fftsounds=[real(fft(mic_1,Fs));real(fft(mic_2,Fs))];
f=[1:Fs/2];
figure(2)
subplot(2,1,1)
plot(f,fftsounds(1,f)), axis([0 4000 -15 15]);
title('Frequency spectra of the right microphone')
xlabel('Frequency (Hz)');
subplot(2,1,2)
plot(f,fftsounds(2,f)), axis([0 4000 -15 15]);
title('Frequency spectra of the left microphone')
xlabel('Frequency (Hz)');
% At first I tried the algorithm in the time domain, and it didn't
% manage to separate the two sources very well.
% After that I used the frequency spectra of the two microphone signals
% in the algorithm and it worked out much better.
% 算法开始了……
% 按照原作者说的话,使用频域来运算的效果会比时域要好(请看上面的英文注释)
sounds=[real(fft(mic_1));real(fft(mic_2))];
% N="number of microphones"
% P="number of points"
[N,P]=size(sounds) % P=?, N=2, in this case.
permute=randperm(P); % Generate a permutation vector.
s=sounds(:,permute); % Time-scrambled inputs for stationarity.
x=s;
mixes=sounds;
% Spheres the data (normalisation).
mx=mean(mixes');
c=cov(mixes');
x=x-mx'*ones(1,P); % Subtract means from mixes.
wz=2*inv(sqrtm(c)); % Get decorrelating matrix.
x=wz*x; % Decorrelate mixes so cov(x')=4*eye(N);
w=pi^2*rand(N); % Initialise unmixing matrix.
M=size(w,2); % M=N usually
sweep=0; oldw=w; olddelta=ones(1,N*N);
Id=eye(M);
% L="learning rate, B="points per block"
% Both are used in sep.m, which goes through the mixed signals
% in batch blocks of size B, adjusting weights, w, at the end
% of each block.
%L=0.01; B=30; sep
%L=0.001; B=30; sep % Annealing will improve solution.
%L=0.0001; B=30; sep % ...and so on
%for multiple sweeps:
L=0.0001; B=30;
for I=1:100
sep; % For details see sep.m
end;
uu=w*wz*mixes; % make unmixed sources
% Plot the two separated vectors in the frequency domain.
figure(3)
subplot(2,1,1)
plot(f,uu(1,f)), axis([0 4000 -22 22]);
title('Frequency spectra of one of the separated signals')
xlabel('Frequency (Hz)');
subplot(2,1,2)
plot(f,uu(2,f)), axis([0 4000 -22 22]);
title('Frequency spectra of the other separated signal')
xlabel('Frequency (Hz)');
% Transform signals back to time domain.
uu(2,:)=real(ifft(uu(2,:)));
uu(1,:)=real(ifft(uu(1,:)));
disp('Playing the first of the separated vectors');
soundsc(uu(1,:))
% Plot the vector that is played above.
figure(4);
subplot(2,1,1)
plot(uu(1,:)), axis([0 16000 -0.12 0.12]);
title('Plot of one of the separated vectors (time domain)')
disp('Playing the second of the separated vectors');
soundsc(uu(2,:))
% Plot the vector that is played above.
subplot(2,1,2)
plot(uu(2,:)), axis([0 16000 -0.12 0.12]);
title('Plot of the other separated vector (time domain)')

2. sep.m

% SEP goes once through the scrambled mixed speech signals, x 
% (which is of length P), in batch blocks of size B, adjusting weights,
% w, at the end of each block.
%
% I suggest a learning rate L, of 0.01 at least for 2->2 separation.
% But this will be unstable for higher dimensional data. Test it.
% Use smaller values. After convergence at a value for L, lower
% L and it will fine tune the solution.
%
% NOTE: this rule is the rule in our NC paper, but multiplied by w^T*w,
% as proposed by Amari, Cichocki & Yang at NIPS '95. This `natural
% gradient' method speeds convergence and avoids the matrix inverse in the 
% learning rule.

sweep=sweep+1; t=1;
noblocks=fix(P/B);
BI=B*Id;
for t=t:B:t-1+noblocks*B,
  u=w*x(:,t:t+B-1); 
  w=w+L*(BI+(1-2*(1./(1+exp(-u))))*u')*w;
end;
sepout

3. sepout.m

% SEPOUT - put whatever textual output report you want here.
%  Called after each pass through the data.
%  If your data is real, not artificially mixed, you will need
%  to comment out line 4, since you have no idea what the matrix 'a' is.
% 
[change,olddelta,angle]=wchange(oldw,w,olddelta); 
oldw=w;
fprintf('****sweep=%d, change=%.4f angle=%.1f deg., [N%d,M%d,P%d,B%d,L%.5f] \n',...
   sweep,change,180*angle/pi,N,M,P,B,L);
% w*wz*a     %should be a permutation matrix for artif. mixed data


上述代码中所使用的声音文件可以到这个网址下下载:http://research.ics.aalto.fi/ica/cocktail/cocktail_en.cgi



参考文献

[1]维基百科. 独立成分分析. http://zh.wikipedia.org/wiki/%E7%8B%AC%E7%AB%8B%E6%88%90%E5%88%86%E5%88%86%E6%9E%90,2014-1-14.

[2] 我爱公开课. Coursera公开课笔记: 斯坦福大学机器学习第一课“引言(Introduction)”. http://52opencourse.com/54/coursera%E5%85%AC%E5%BC%80%E8%AF%BE%E7%AC%94%E8%AE%B0-%E6%96%AF%E5%9D%A6%E7%A6%8F%E5%A4%A7%E5%AD%A6%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%AC%AC%E4%B8%80%E8%AF%BE-%E5%BC%95%E8%A8%80-introduction,2014-1-14.

[3]维基百科. 盲信号分离. http://zh.wikipedia.org/wiki/%E7%9B%B2%E4%BF%A1%E5%8F%B7%E5%88%86%E7%A6%BB,2014-1-14.

[4]Johan Bylund. A hunble attempt to solvethe “Cocktail-party” problem Using Blind Source Separation[EB].http://www.vislab.uq.edu.au/education/sc3/2001/johan/johan.pdf.


2019-03-20 15:27:49 u010092862 阅读数 117
  • C++语音识别开篇

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

    6114 人正在学习 去看看 杨波

temporal is 处于动态平衡中,因为任何量都不可能永恒不变。 因为宇宙的本质就是变得,所以每个量在一个区间内变化,而保持系统的平衡。 所以没有唯一的准则,而是在不断的变化,人也相应的调整策略。这就是狐狸。 但是又要和刺猬一样,有一个目标,短期目标不断变化,长期目标也有偏动,但是方向不变。 为目标奋斗。这就是刺猬。

鸡尾酒问题

当前语音识别技术已经可以以较高精度识别一个人所讲的话,但是当说话的人数为两人或者多人时,语音识别率就会极大的降低**,这一难题被称为鸡尾酒会问题。**要分离出鸡尾酒会中同时说话的每个人的独立信号,常用的方法是盲信号分离算法。

该问题 给定混合信号,分离出鸡尾酒会中 同时说话的每个人的独立信号。
基于神经网络模型架构,音频-视觉语音分离模型,解决“鸡尾酒会效应”.此外,在多人发声的场景下,视觉信号除了有效提升语音分离的质量,还可以把分离之后的音轨和视频里的人物对应起来。此种方式为其后的语音识别领域提供了许多的可能性。
“鸡尾酒会效应”难题的解决为语音识别领域的许多问题提供了思考路径,同时视觉-音频网络识别系统的提出,也为人声分离提供了视觉+听觉的解决方式。
蝙蝠是如何区分自己和他人发出的超声波信号的呢?科学家通过研究发现,蝙蝠并没有改变发出的超声频率,而是通过叫声变大,持续时间变长,发射频率增多等方式来解决的。动物界的“鸡尾酒会效应”启示无人驾驶:想提高雷达的定位精度,提高信噪比是根本。比如,蝙蝠叫声变大,相当于提高了信号的能量;而叫声持续时间变长和叫声频率增多,则是增加了信号的样本点数。在噪声不相关的情况下,经过简单的平均就可以降低噪声的影响。这一点,将会为机器人和无人驾驶汽车带来了新的启发。


最小二乘法

为了搞清楚为什么,就要先搞清楚,逻辑回归的对数似然函数和最小二乘法函数分别是什么。
可以证明逻辑回归的最小二乘法的代价函数不是关于分布参数θ的凸函数,求解过程中,会得到局部最优,不容易求解全局最优θ。
而对数似然函数可以证明逻辑回归的对数似然函数是关于θ的凸函数,且有最大值。证明过程详细如下所示:
在这里插入图片描述
因为逻辑回归不是一种回归,而是一种分类算法。而逻辑回归的假设函数是属于指数分布族,且逻辑回归的样本给予满足伯努利分布而进行训练的。最大似然估计的出发点就是使得当前样本发生的可能性最大化,反向支持逻辑回归样本满足伯努利分布。而最小二乘法只是让预测值和观测值更拟合,而最大似然估计是保证计算出的特征值发生的概率正确率最大化,最大似然更满足逻辑回归是一种分类器。


范数

范数 norm.

函数与几何图形往往是有对应的关系,函数是几何图像的数学概括,而几何图像是函数的高度形象化。但当函数与几何超出三维空间时,就难以获得较好的想象,于是就有了映射的概念,映射表达的就是一个集合通过某种关系转为另外一个集合。
通常数学书是先说映射,然后再讨论函数,这是因为函数是映射的一个特例
为了更好的在数学上表达这种映射关系,(这里特指线性关系)于是就引进了矩阵**。这里的矩阵就是表征上述空间映射的线性关系。而通过向量来表示上述映射中所说的这个集合,而我们通常所说的基,就是这个集合的最一般关系**。于是,我们可以这样理解,一个集合(向量),通过一种映射关系(矩阵),得到另外一个集合(另外一个向量)。
那么向量的范数,就是表示这个原有集合的大小。
而矩阵的范数,就是表示这个变化过程的大小的一个度量。
那么说到具体几几范数,其不过是定义不同,一个矩阵范数往往由一个向量范数引出,我们称之为算子范数。
0范数,向量中非零元素的个数。1范数,为绝对值之和。2范数,就是通常意义上的模。

模是范数的一种,即每个元素的平方和在开平方。目的是的得到集合的大小。即一种大小的度量。
例如:绝对值是取模的特殊情况,绝对值是对于实数来说的 可以看成虚部为零的复数z1=a+i0 复数z=a+ib取模是√(a²+b²),把b=0代进去 就是取z1的模 ,所以求z1的模就是取z1的绝对值。

向量的范数

1-范数:,即向量元素绝对值之和,matlab调用函数norm(x, 1) 。

2-范数:,Euclid范数(欧几里得范数,常用计算向量长度),即向量元素绝对值的平方和再开方,matlab调用函数norm(x, 2)。

∞-范数:,即所有向量元素绝对值中的最大值,matlab调用函数norm(x, inf)。

-∞-范数:,即所有向量元素绝对值中的最小值,matlab调用函数norm(x, -inf)。

矩阵的范数:

在这里插入图片描述

2018-01-18 11:50:03 haima1998 阅读数 11259
  • C++语音识别开篇

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

    6114 人正在学习 去看看 杨波

以下转自:http://blog.csdn.net/whaoxysh/article/details/19402337

“ 鸡尾酒会问题”(cocktail party problem)是在计算机语音识别领域的一个问题。当前语音识别技术已经可以以较高精度识别一个人所讲的话,但是当说话的人数为两人或者多人时,语音识别率就会极大的降低,这一难题被称为鸡尾酒会问题

解决方案  


斯坦福大学的Andrew NG教授的机器学习公开课(http://v.163.com/special/opencourse/machinelearning.html(ml-class.org)在第一章unsupervised learning那段视频里解决鸡尾酒会问题(cocktail party problem)就写了一行代码:[W,s,v] = svd ((repmat(sum(x.*x,1),size(x,1),1).*x)*x');


用fastICA算法可以比较好地解决http://research.ics.tkk.fi/ica/fastica/


http://www.endolith.com/wordpress/2009/11/22/a-simple-fastica-example/ 是一个分离音乐的例子,效果比较明显。用的就是fastICA的python实现。不过好像用来解决cocktail party problem的话效果不太好。


以下转自:http://blog.csdn.net/mrharvey/article/details/18598605

说说鸡尾酒会问题(Cocktail Party Problem)和程序实现

以下转自:https://www.jiqizhixin.com/articles/2017-06-02-6

腾讯AI Lab副主任俞栋:语音识别研究的四大前沿方向

5 月 27-28 日,机器之心在北京顺利主办了第一届全球机器智能峰会(GMIS 2017),来自美国、加拿大、欧洲,香港及国内的众多顶级专家分享了精彩的主题演讲。在这篇文章中,机器之心整理了腾讯 AI Lab 副主任、西雅图人工智能研究室负责人俞栋在大会第一天发表了主题为《语音识别领域的前沿研究》的演讲,探讨分享了语音识别领域的 4 个前沿问题。


640-34.jpeg

俞栋是语音识别和深度学习领域的著名专家。他于 1998 年加入微软公司,此前任微软研究院首席研究员,兼任浙江大学兼职教授和中科大客座教授。迄今为止,他已经出版了两本专著,发表了 160 多篇论文,是 60 余项专利的发明人及深度学习开源软件 CNTK 的发起人和主要作者之一。俞栋曾获 2013 年 IEEE 信号处理协会最佳论文奖。现担任 IEEE 语音语言处理专业委员会委员,之前他也曾担任 IEEE/ACM 音频、语音及语言处理汇刊、IEEE 信号处理杂志等期刊的编委。



以下是俞栋演讲的主要内容:


640-35.jpeg


大家好,我是俞栋,现在腾讯 AI Lab,是西雅图研究室的负责人,我的主要的研究方向是语音识别,所以今天我在这里也给大家介绍一下最近的一些语音识别方向的研究前沿。

大家都知道语音识别领域有着悠久的研究历史,在过去的几十年里面,研究人员从最简单的非常小词汇量的阅读式的语音识别问题开始,逐渐转向越来越复杂的问题。现在即便是在以前认为非常难的自由对话形式的语音识别问题,机器也已经能够达到甚至超过人的识别水准。不过我们要看到,虽然我们取得了这些进展,但是离真正非常自由的人机交流还有一定的距离。这也是为什么我们现在语音识别的研究前沿又往前推进了一步,现在我们研究的问题越来越多地是不对环境、说话的风格、口语做任何限定(不像以前有非常多的限制)。而这些非限定的环境,就使得语音识别难度有了大幅度的增加。尤其在最近的几年里面我们发现在真实的应用场景里,很少有人会愿意戴着麦克风,所以现在研究的前沿就从近场麦克风向远场麦克风改变。

从近场到远场麦克风的改变有一个很重要的区别,即远场的情况下,当人的声音传达到麦克风的时候,声音的能量衰减得很厉害。所以近场麦克风很难见到的一些困难,在远场麦克风里面就变得非常重要。最著名的就是鸡尾酒会问题,本文稍后会对其做一个详细的介绍。如果这些远场问题不解决的话,在很多的应用场合,用户仍然会觉得语音识别并不是很方便。


640-37.jpeg


所以今天在这样的背景下,我介绍一下最近在语音识别当中的一些前沿的研究方向,主要有四个:

  • 研究方向一:更有效的序列到序列直接转换模型

  • 研究方向二:鸡尾酒会问题

  • 研究方向三:持续预测与适应的模型

  • 研究方向四:前端与后端联合优化


研究方向一:更有效的序列到序列直接转换模型


640-38.jpeg


如果我们仔细想想语音识别这个问题的话,大家都会看到,语音识别其实就是一个从语音信号序列转化为文字或者词序列的问题。这也就是为什么很多研究人员都一直认为要解决这个问题其实只要找到一个非常有效的,从一个序列到另外一个序列转换的模型就可以了。

在以前的所有的研究里面,绝大部分的工作都是研究人员通过对问题做一些假设,然后根据这个假设从语音信号序列到词信号之间,生成若干个组件,然后通过逐步地转换,最后转换成词的序列。有许多假设在某些特定场合中是合理的,但是在很多真实的场景下还是有问题的。那么直接转换这样序列模型的想法就是,如果我们能够把这些可能有问题的假设去掉,然后通过数据驱动让模型自己学习,就有可能找到一个更好的方法,使得这个序列的转换更准确。这样做还有另外一个好处,因为所有的这些人工的 component 都可以去掉了,所以整个的训练流程也就可以缩短。

序列到序列直接转换、直接映射这样的研究目前来讲主要有两个方向:


方向一: CTC(Connectionist Temporal Classification)模型


640-39.jpeg


如上图所示,方向一是 CTC(Connectionist Temporal Classification)模型,从上图中最下面一行可以看到,在 CTC 模型里面,系统会一直保留一个内部状态,当这个内部的状态提供足够的信息可以做某一个决定的时候,它就会生成一个尖峰(spike)。其表明到某个位置的时候可以非常确定地推断到底听到了哪个字或者哪个词。而在没有听到足够的信息的时候,只会产生空信号以表明还不能有足够的信息来判断是不是听到了某一个字或者词。这样的模型在语音识别问题上是非常合适的模型,因为它要求输出序列的长度比输入序列的长度要短很多。

CTC 模型还有一个优势,即传统的深度神经网络与混合模型一般来说建模单元非常小,但是在 CTC 模型可以相对自由地选择建模单元,而且在某些场景下建模单元越长、越大,识别效果就越好。

最近 Google 有一项研究,他们在 YouTube 上采用几十万小时甚至上百万小时的数据量训练 CTC 的模型,发现可以不用再依赖额外的语言模型就能够做到超过传统模型的识别率。CTC 模型相对来说比传统的模型仍会更难训练,因为其训练稳定性还不是很好。


方向二:带有注意力机制的序列到序列转换模型


640-40.jpeg


第二个比较有潜力的方向是带有注意力机制的序列到序列转换模型(Sequence-to-Sequence Transformation with Attention)。这个模型基本的想法是首先把输入的序列、语音信号序列,转换成一个中间层的序列表达,然后基于中间层的序列表达提供足够的信息给一个专门的、基于递归神经网络的生成模型,并每次生成一个字、一个词或者一个音符。现在这个方法在机器翻译里面成为了主流方案,但是在语音识别里面它还是一个非常不成熟的技术。它有如下几个问题:


  • 问题 1:训练和识别过程有很大的不匹配性,在训练过程中所依赖的信息是准确的、已知的,但是在识别过程中,信息却是估算出来的,是不准确的。所以一旦错误产生以后,这个错误就可能会累加到下一个字或词的生成,所以该方法比较适合只是一个短语的识别,对长的句子效果比较差。

  • 问题 2:该模型和语音识别本身也有不匹配性,这个不匹配是其在进行注意力机制时产生的,因为注意力可以在不同的位置上移动,但是对于语音识别,下一个词的 attention 肯定是在前一个词的 attention 的后面,其有一个持续固定的约束,这个约束在目前带注意力机制的序列到序列模型里是不存在的,所以这个模型目前在做语音识别的时候效果非常不稳定。


640-41.jpeg

如何解决这样的问题而得到更好的结果呢?目前最佳的解决方案就是把 CTC 模型跟 Attention 模型联合在一起,最基本的想法是因为 CTC 有持续信息,其词的生成是根据后面那几帧的语音信号信息而得出,因此它会帮助 Attention 模型生成更好的 embedding space 表达。结合这两个方法所最终产生的结果既比 CTC 模型训练的好,也比 Attention 模型训练的好,所以这就变成了一个 1+1 大于 2 的结果。


640-42.jpeg


我们稍后会看到,即便把两种成本函数和模型结构联合在一起,它的效果与传统的混合模型相比并没有太大的长进。所以我们仍然需要解决一些问题。


  • 问题一:在这样的架构下面,有没有更好的模型结构或训练准则,能够比现有的 CTC 或者 Attention 模型更好。

  • 问题二:我们看到 YouTube 用 CTC 模型训练的时候,它的效果比用语言模型的传统方法更好,很大的原因就在于它的训练集有很多的训练语料,因此我们可以在里面训练非常好的语言模型,所以语言模型和声学模型是紧密结合在一起的。那么当我们没有这么多的数据时,有没有办法也建造一个结构,使得这个语言模型和声学模型紧密结合在一起。但是当训练数据不够多的时候,如果有足够的文本数据,我们也可以用它来加强语言模型的训练,使两个部分能够相辅相成。

  • 问题三:到底有没有办法结合各种语料的数据,因为一种语料可能数据量不够多,所以到底有没有办法在模型的各个层次上都做迁移学习,这样的话我们就有办法可以利用各种语料的数据,整合起来训练一个更好的序列到序列的转换模型。


研究方向二:鸡尾酒会问题


640-43.jpeg


众所周知,在非常嘈杂或者多人同时说话的环境中,人有一个非常好的特点,即能够把注意力集中在某一个人的声音上,屏蔽掉周围的说话声或者噪音,非常好地听懂所需关注之人的说话声音。现在,绝大多数语音识别系统无法做到这一点。如果不做特殊处理,你会发现只要旁边有人说话,语音识别系统的性能就急剧下降。

由于人的信噪比非常大,这个问题在近场麦克风时并不明显;但在远场情况下,信噪比下降很厉害,问题也就变得很突出,进而成为了一个难以解决的关键问题。


640-44.jpeg


鸡尾酒会中一个相对简单的问题是语音加上噪声(或者语音加上音乐、语音加上其他的东西)。因为你已经知道要关注的语音部分,可以忽略掉其他,所以这个问题就可以从之前的非监督学习盲分类问题,转换到人为定制的 supervision 信息的有监督学习问题。


640-45.jpeg


但是有监督学习会在多人说话时碰到困难,这个困难就在于这时你无法轻易地提供 supervision 信息,因为当麦克风收到信息时,它收到了两个或者多个麦克风的混合语音,但并不能知道这个混合语音是 A+B 还是 B+A(因为两者结果是一样的)。所以在训练过程当中,你无法预先知道是把说话人 A 的声音作为输出 1 的 supervision 还是输出 2 的 supervision。这个问题有一个专门的术语叫做标签排列问题(Label Permutation Problem),目前它有两个比较好的解决方案:


方案一:Deep Clustering


640-46.jpeg


假设当两个人说话时,每一个时频点都会被一个说话人掌控;在这个情况下,它可以把整个语谱图分割成两个集群,一个属于说话人 A,一个属于说话人 B,进而训练一个嵌入空间表达。如果两个时频点同属一个说话人,它们在嵌入空间里的距离则比较近;如果属于不同的说话人,距离则比较远。所以训练准则是基于集群的距离来定义的,在识别的时候,它首先将语音信号映射到嵌入空间,然后在上面训练一个相对简单的集群,比如用 k-means 这样的方法。这个想法非常有意思,但是同时聚类算法的引入也带来了一些问题,使得训练和识别变得相对复杂,也不易于与其他方法融合。


方案二:Permutation Invariant Training


640-47.jpeg


这个想法是因为我们真正做分离的时候,其实并不在乎它是 A+B 还是 B+A,而只关注两个信号分离的水准是不是好。在真正做判定的时候,我们其实会专门比较音频信号,并选择成本最小的作为最后判别的分类。这也提醒我们在训练时也可以这样做。所以训练时怎么做呢?

每次我拿到新的混合语音时,并不预先设定它的 supervision 标签什么样,而是针对当前模型动态地决定当下我的 supervision 应该是什么样。由于取 supervision 的最小错误率,所以我又在其上进一步优化,它的错误率也进一步减小,这是其基本想法。它唯一需要改变的就是训练的标注分配,其他部分则不用变。所以识别相对简单,也很容易与其他方法做融合。


640-48.jpeg


那么我放几个声音大家听一下:


  • 三个说话人:三个人混合的声音是比较难分离。这个方法的另外一个好处是不需要预先知道有几个人说话,所以当有两个人说话的时候,它也能做得很好。

  • 两个说话人:当有两个说话者时,第三个数据就没有输出,只有保留沉默,所以它有一个非常好的特性:不需要你做特殊处理,输出结果即分离结果。


640-49.jpeg


但是目前为止,我们所使用的一些信息只来自单麦克风。众所周知,麦克风阵列可以提供很多信息,所以:


  • 第一个很重要的问题是如何有效地利用多麦克风信息来继续加强它的能力;

  • 第二个问题是说我们有没有办法找到一个更好的分离模型,因为现在大家使用的依然是 LSTM,但是其不见得是最佳模型。

  • 第三个问题是我们有没有办法利用其他的信息作为约束进一步提升它的性能。


研究方向三:持续预测与适应的模型


640-50.jpeg


第三个大家关注的研究热点是能否建造一个持续地做预测(prediction)和适应(adaptation)的系统。我们之前做了一个模型,如上图所示;它的优势是能够非常快地做适应,持续地做预测,然后改进下一帧的识别结果。但是由于目前这个模型回路比较大,所以性能上还是很难训练,这和 CTC 模型情况相似。所以我们现在的问题是如何建造一个更好的模型能够持续地做预测。这种模型需要有哪些特性呢?


  • 一是模型能够非常快地做适应;

  • 二是可以发现一些一致的规律性,并将其变为长远记忆里面的信息,使得下一次再做识别时会变成稳定的状态,其他状态则变成需要适应的状态;

  • 三是我们有没有办法把类似说话者的信息,用更好的方式压缩在其模型之中,所以当见到一个新说话者时,可以很快地做 适应。


研究方向四:前端与后端联合优化


640-51.jpeg


第四个研究前沿是出于远场识别的需要,即如何更好地做前端和后端的联合优化。这其中包含几个问题,因为传统来讲,处理前端信号使用的是信号处理技术,其一般只用到当前状态下的语音信号信息,比如训练集信息;而机器学习方法,则用到很多训练器里的信息,并很少用到当前帧的信息,也不会对它进行数据建模,所以我们能否把这两种方法更好地融合在一起,是目前很多研究组织正在继续努力的一个方向。

另外,我们是否有办法更好地联合优化前端的信号处理与后端的语音识别引擎。因为前端信号处理有可能丢失信息,且丢失的信息很可能无法在后端恢复,所以我们能否做一个自动系统以分配这些信息的信号处理,使得前端更少地丢失信息,后端则这些信息更好地利用起来。


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