一 、thchs30中文模型训练
参见https://blog.csdn.net/wyw0000/article/details/125456902?spm=1001.2014.3001.5502
这里不详细叙述
二、拷贝一份gop_speechocean762
拷贝一份gop_speechocean762,命名为gop_chinese
三、拷贝lang、extractor和tdnn_sp到gop_chinese下
从thchs30目录下拷贝lang、extractor和tdnn_sp到gop_chinese下
cd gop_chinese
mkdir thchs30
cp -rf thchs30/data/lang thchs30
cp -rf thchs30/exp/nnet3/extractor thchs30
cp -rf thchs30/exp/nnet3/tdnn1a_sp thchs30/tdnn_sp
修改run.sh
librispeech_eg=../thchs30
model=$librispeech_eg/tdnn_sp
ivector_extractor=$librispeech_eg/extractor
lang=$librispeech_eg/lang
三 、生成dict_nosp和lang_nosp
1 、从thchs30拷贝data/dict 到gop_chinese 的data/dict_nosp下 ,同时修改run.sh
if [ $stage -le 6 ]; then
# Prepare lang
#local/prepare_dict.sh data/local/lexicon.txt data/local/dict_nosp
utils/prepare_lang.sh --phone-symbol-table $lang/phones.txt \
data/local/dict_nosp "<UNK>" data/local/lang_tmp_nosp data/lang_nosp
fi
2、 修改utils/prepare_lang.sh中的position_dependent_phones 为false
因为thchs30中文音素不像英文音素那样带有位置标识,如:_B、_I、_S、_E,故position_dependent_phones 设置成false
3、 修改run.sh 中的data/local/dict_nosp ""为data/local/dict_nosp “<SPOKEN_NOISE>”
四、准备评测数据
评测数据集仍然可以使用thch30,对于评测数据中的score.json可以借助于其他家成熟的评测接口跑thch30的数据,将评测结果转化的score.json的格式,再用score.json生成对应的text-phone,text-phone是按照词组进行切分的,一定要保证其音素与score.json是一致的,否则在训练gop模型的时候会报Unmatch错
五、修改run.sh脚本
由于thchs30的phones.txt序号0和1不是有效的音素,而2是a,是有效音素,故–skip-phones-string为0:1
#修改前
compute-gop --phone-map=data/lang_nosp/phone-to-pure-phone.int \
--skip-phones-string=0:1:2
#修改后
compute-gop --phone-map=data/lang_nosp/phone-to-pure-phone.int \
--skip-phones-string=0:1 \
六、评测脚本c++改造
对于实际应用的语音评测场景来说,使用shell脚本肯定是不现实的,因为不能支持高并发。因此需要将脚本用c++重新实现一遍,实际上这个脚本干活的步骤也是c++实现的,只要找到每步对应的c++实现,组织到一起就可以完成c++的改造。我之前就是以这样的思路完成的,最近发现gop_speechocean762的作者张俊博大神已经实现了c++的版本,链接地址:https://github.com/jimbozhang/kaldi-gop