阅芯术|语音识别第一课:基于Tensorflow的端到端语音识别技术( 二 )


CTC损失计算
阅芯术|语音识别第一课:基于Tensorflow的端到端语音识别技术
文章图片
输出矩阵示例
假设真实的数据标签为CAT , 在四个时间步长中 , 有序列C-C-A-T , C-A-A-T , C-A-T-T , _-C-A-T , C-A-T-_与真实数据相对应 。 将这些序列的概率相加 , 可得到真实数据的概率 。 根据输出的概率矩阵 , 将序列的各个字符的概率相乘 , 可得到单个序列的概率 。 则上述序列的总概率为0.0288+0.0144+0.0036+0.0576+0.0012=0.1056 。 CTC损失则为该概率的负对数 。 Tensorflow自带损失函数文件 。
解码
由上文的神经网络 , 可输出一个CTC矩阵 。 这一矩阵给出了各个时间步长中每个字符在其字符集中的概率 。 利用前缀束搜索 , 可从CTC矩阵中得出所需的文本 。
除了字母和空格符 , CTC矩阵的字符集还包括两种特别的标记(token , 也称为令牌)——空白标记和字符串结束标记 。
空白标记的作用:CTC矩阵中的时间步长通常比较小 , 如10毫秒 。 因此 , 句子中的一个字符会横跨多个时间步长 。 如 , C-A-T会变成C-C-C-A-A-T-T 。 所以 , 需要将CTC矩阵中出现该问题的字符串中的重复部分折叠 , 消除重复 。 那么像FUNNY这种本来就有两个重复字符(N)的词要怎么办呢?在这种情况下 , 就可以使用空白标记 , 将其插入两个N中间 , 就可以防止N被折叠 。 而这么做实际上并没有在文本中添加任何东西 , 也就不会影响其内容或形式 。 因此 , F-F-U-N-[空白]-N-N-Y最终会变成FUNNY 。
结束标记的作用:字符串的结束表示着一句话的结束 。 对字符串结束标记后的时间步长进行解码不会给候选字符串增加任何内容 。
阅芯术|语音识别第一课:基于Tensorflow的端到端语音识别技术
文章图片
步骤
初始化
·准备一个初始列表 。 列表包括多个候选字符串 , 一个空白字符串 , 以及各个字符串在不同时间步长以空白标记结束的概率 , 和以非空白标记结束的概率 。 在时刻0 , 空白字符串以空白标记结束的概率为1 , 以非空白标记结束的概率则为0 。
迭代
·选择一个候选字符串 , 将字符一个一个添加进去 。 计算拓展后的字符串在时刻1以空白标记和非空白标记结束的概率 。 将拓展字符串及其概率记录到列表中 。 将拓展字符串作为新的候选字符串 , 在下一时刻重复上述步骤 。
·情况A:如果添加的字符是空白标记 , 则保持候选字符串不变 。
·情况B:如果添加的字符是空格符 , 则根据语言模型将概率与和候选字符串的概率成比例的数字相乘 。 这一步可以防止错误拼写变成最佳候选字符串 。 如 , 避免COOL被拼成KUL输出 。
·情况C:如果添加的字符和候选字符串的最后一个字符相同 , (以候选字符串FUN和字符N为例) , 则生成两个新的候选字符串 , FUNN和FUN 。 生成FUN的概率取决于FUN以空白标记结束的概率 。 生成FUNN的概率则取决于FUN以非空白标记结束的概率 。 因此 , 如果FUN以非空白标记结束 , 则去除额外的字符N 。
输出
经过所有时间步长迭代得出的最佳候选字符串就是输出 。
为了加快这一过程 , 可作出如下两个修改 。
1.在每一个时间步长 , 去除其他字符串 , 仅留下最佳的K个候选字符串 。 具体操作为:根据字符串以空白和非空白标记结束的概率之和 , 对候选字符串进行分类 。
2.去除矩阵中概率之和低于某个阈值(如0.001)的字符 。
【阅芯术|语音识别第一课:基于Tensorflow的端到端语音识别技术】具体操作细节可参考如下代码 。