TLG(四)

基于字建模(中文字英文词)

。。。

分析以下原因

  1. core/decoder/ctc_wfst_beam_search.cc里未做am出来相同类merge规整,修改代码后会提升一些
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 函数:void CtcWfstBeamSearch::Search(const std::vector<std::vector<float>>& logp) {

// Optional, adding one blank frame if we has skipped it in two same
// symbols
/*
if (cur_best != 0 && is_last_frame_blank_ && cur_best == last_best_) {
decodable_.AcceptLoglikes(last_frame_prob_);
decoder_.AdvanceDecoding(&decodable_, 1);
decoded_frames_mapping_.push_back(num_frames_ - 1);
VLOG(2) << "Adding blank frame at symbol " << cur_best;
}
*/
if (cur_best == last_best_ && cur_best != 0 && is_last_frame_blank_) {
decodable_.AcceptLoglikes(last_frame_prob_);
decoder_.AdvanceDecoding(&decodable_, 1);
decoded_frames_mapping_.push_back(num_frames_ - 1);
VLOG(2) << "Adding blank frame at symbol " << cur_best;
}
if (cur_best != 0 && !is_last_frame_blank_ && cur_best == last_best_){
VLOG(2) << "cur frame is same as last frame, skip it(merge it)" << cur_best;
continue;
}

  1. lexicon标注有误,像“买LV” 这种,lexicon标注为 L ▁V的,但是am出来▁L概率很高,L的概率很小,但是加上语言分数,语言模型概率P(V|买) 高于P(V|L),加上声学分就是只出来了L,因此要想避免这种情况,一个是训练语言模型的文本”L V”这种分开的要比较多,使得P(V|L)高,一个是lexicon要人工挑选,尽量声学分数不要太低了。

    训练声学模型时,带LV的单词易拆成** L ▁V,L在单词中间,(L没有空格)L的建模多是L在单词中间的发音的建模,而L单独的发音建模是▁L,因此虽然LV经过声学模型bpe拆分成 L ▁V,也是建模单元▁L的概率高;

  2. CTC prefix beam search,带TLG优于不带TLG的结果,说明TLG是有效的(CTC不带语言模型),而attention rescore后TLG作用不明显,说明TLG建模能力没有transoformer的建模能力强(带语言模型了),而且他们的训练文本很接近,这是可以理解的。

img