CTC是一种端到端的语音识别技术,他避免了需要字或者音素级别的标注,只需要句子级别的标注就可以进行训练,感觉非常巧妙,也很符合神经网络浪潮人们的习惯。特别是LSTM+CTC相较于之前的DNN+HMM,LSTM能够更好的捕捉输入中的重要的点(LSTM随着状态数目增加参数呈线性增加,而HMM会平方增加),CTC打破了隐马尔科夫的假设,把整个模型从静态分类变成了序列分类。
语音识别的评价指标
在语音识别中,在数据集 S S S上评价模型 h h h的好坏一般用标签错误率(Label Error Rate): L E R ( h , S ) = 1 ∣ S ∣ ∑ ( x , z ) ∈ S E D ( h ( x ) , z ) ∣ z ∣ LER(h,S)=\frac{1}{|S|}\sum_{(x,z)\in S}\frac{ED(h(x),z)}{|z|} LER(h,S)=∣S∣1∑(x,z)∈S∣z∣ED(h(x),z), E D ( p , q ) ED(p,q) ED(p,q)表示 p p p和 q q q两个序列的编辑距离。
语音识别模型
在语音识别中,提取语音信号的MFCC特征 x x x,经过神经网络或者GMM处理后经过一个softmax层得到一个每个音素的后验概率 y y y, y y y的类别有 ∣ L ∣ + 1 |L|+1 ∣L∣+1种, L L L是可能出现的字符,加1为建个符。定义 B B B为简单的压缩变换,把路径 π \pi π(路径就是一种音素出现的路线)中相邻相同的音素合并,空音素去掉,再特征 x x x下定序列 l l l出现的条件概率为:
p ( l ∣ x ) = ∑ π = ∈ B − 1 ( l ) p ( π ∣ x ) p(l|x)=\sum_{\pi=\in B^{-1}(l)}p(\pi|x) p(l∣x)=π=∈B−1(l)∑p(π∣x)
前向后向算法(Forward-Backward Algorithm)
定义符号 l p : q l_{p:q} lp:q表示符号序列KaTeX parse error: Expected '}', got 'EOF' at end of input: …..l_{q-1},l_{q},容易得知,要想使得路径 B ( π ′ ) B(\pi') B(π′)满足一定的 l l l, π \pi π路线上的状态跳转需要满组 l ′ l' l′的先后顺序,不同的符号之间可以插入blank。
定义前向变量 α ( t , u ) \alpha(t,u) α(t,u): α t ( t , u ) = ∑ π ∈ N T , B ( π 1 : t ) = 1 1 : u ∏ t ′ = 1 t y π t ′ t ′ \alpha_t(t,u)=\sum_{\pi\in N^T,B(\pi_{1:t})=1_{1:u}}\prod_{t'=1}^ty_{\pi_{t'}}^{t'} αt(t,u)=∑π∈NT,B(π1:t)=11:u∏t′=1tyπt′t′
α ( t , s ) \alpha(t,s) α(t,s)可以递推的用 α ( t − 1 , s ) , α ( t − 1 , s − 1 ) \alpha(t-1,s),\alpha(t-1,s-1) α(t−1,s),α(t−1,s−1)计算。
为了方便起见,我们在 l l l相邻标签之间插入了空白(blank),在开始和末尾也加入了空白,这样我们用 l ′ l' l′表示这个新的标记, l ′ l' l′的长度就为 2 ∣ l ∣ + 1 2|l|+1 2∣l∣+1。在计算 l ′ l' l′前缀的概率中,我们允许空白和非空白标签之间转移,那么我么有动态规划的初始条件:
α ( 1 , 1 ) = y b 1 \alpha(1,1)=y_b^1 α(1,1)=yb1
α ( 1 , 2 ) = y l 1 1 \alpha(1,2)=y_{l_1}^1 α(1,2)=yl11
α ( 1 , u ) = 0 , u > 2 \alpha(1,u)=0,u>2 α(1,u)=0,u>2
α ( t , 0 ) = 0 \alpha(t,0)=0 α(t,0)=0
α ( t , u ) = 0 , u < U ′ − 2 ( T − t ) − 1 \alpha(t,u)=0,u<U'-2(T-t)-1 α(t,u)=0,u<U′−2(T−t)−