中文语音识别Demo实践(未完)
1. 之前用Mozilla的DeepSpeech 实践基于中文识别的中文评测, 思路是:
1)使用DeepSpeech的开源baseline,将语音转成中文phones序列(23个声母 + 39*5个带声调的韵母 约220个alphabet)
2)评测时传入中文refText,通过分词(使用genius)+ lexicon 将评测标准也转成phones序列
3)使用difflib 进行两个序列的对比 --- 总分并没这样计算,当时只想着要精确到每个字,所以递归使用difflib使对比尽量细化到最小单元(phone),再用最小单元得分平均出总分的
存在的问题有:
A. 有些情况识别得准,但是对比时却是错的,比如用户把 “小熊” 发音 “xiao3 xeng3”,这时程序会精准的判断为错,但其实人听起来是可接受的
想到的解决方法:
一是判断对错时进行一些修改,将易混音设置为在difflib对比时距离较近;
二是就要用语言模型去“篡改”原始识别结果B. 本身PER还是0.3~0.4,训练集内的效果还可以,训练集外就较差:有时有连续的声母或连续韵母拼不成拼音; 有时会有漏识别几个字; l/n 分不清的就不说了
C. 声音小或其它情况下,直接啥都识别不出,鲁棒性还比较差
2. 这次重新整理,目标也变为: 以单纯ASR为主,识别为汉字句子。 思路是:
1)沿用之前 DeepSpeech 识别为 phones 序列的部分,只是基于某个数据集认真处理一遍
2)使用别的模型,将phones序列转成汉字句子,考虑过:
- WFST解码, 已经在Kaldi里生成 TLG.fst, 但不清楚怎么简单拼接到python里解码,现在知识储备不够;
- Somiao拼音输入法,虽然训练完显示准确率 95%以上,主观测试一些正常的拼音输进去也还可以,但存在问题:
- a. 是character级别的,有时字组不成词(比如 cai3gou4 总转换成 采够 或 彩够)
- b. 如果拼音序列是包含一丝错误,转换出来也是错的明显,虽然可以用 “含习惯性错误的序列去增强训练,来增强鲁棒性” 的思路,但这种方法还是直接用到Word级去尝试吧
3)使用Seq2Seq+CTC的模型,将phones序列转成汉字word序列。
3. 以下就是 2.3)的部分开始实践:
1)使用 thchs30 数据集,准备数据
A. 准备 vocab,没有用 “通过数据集自动生成vocab“ 的方法,是避免数据集覆盖不全,反正利用已有的vocab也不麻烦
cp /data/thchs30/resource/dict/lexicon.txt .
cp /data/thchs30/resource/dict/nonsilence_phones.txt .
awk '$0=$0"\t"NR' nonsilence_phones.txt > train/vocab.sources.txt
awk '{print $1}' lexicon.txt | sort -u | awk '$0=$0"\t"NR' > train/vocab.targets.txt
awk '{for(i=2;i<=NF;i++)print $i}' lexicon.txt | sort -u > vocab_sources.txt
B. 准备sours 和 targets
cp /data/thchs30/data_thchs30/train/list.txt targets.txt; sed -i -r 's/\s*<TR>\s*$//g' targets.txt
# 通过字典生成phone序列:
# awk 'NR==FNR{a[$1]=$0; next}NR>FNR{for(i=1;i<=NF;i++){if($i in a){len=split(a[$i],ps," ");for(p=2;p<=len;p++){printf("%s ",ps[p])}}};printf("\n")}' ../lexicon.txt targets.txt > sources.txt
# 或者还是直接利用标注的phone序列吧,或通过别的方法获取
cp /data/thchs30/data_thchs30/train/list_phone.txt sources.txt
2)100000次結果:
结果看起来还行,主要是thchs30语料文本内容并不丰富,相信语料多了肯定会更好的
INFO:tensorflow:Restoring parameters from /home/ML/seq2seq/bin/data_thchs30/model/model.ckpt-99000
INFO:tensorflow:Saving checkpoints for 99001 into /home/ML/seq2seq/bin/data_thchs30/model/model.ckpt.
INFO:tensorflow:loss = 1.0504744, step = 99001
INFO:tensorflow:Prediction followed by Target @ Step 99002
==============================================================================
待 国会 一些 议员 为 已 奔去 议案 王 日本 在 五年内 完全 消灭 对 美 贸易逆差 SEQUENCE_END
在 国会 一些 议员 也 已 提出 议案 要求 日本 在 五年内 完全 消灭 对 美 贸易逆差 SEQUENCE_END袅袅 凑近 杯 口 闻 了 沉 闻 剧院 牛 奶味 我 有 椰子 味 还 略带 酒香 SEQUENCE_END
我 凑近 杯 口 闻 了 一 闻 有点 牛 奶味 又 有 椰子 味 还 略带 酒香 SEQUENCE_END他 修养 的 演员 即使 正 万 也 人和 就 过眼云烟 的 司令部 普及 上 的 艺术家 SEQUENCE_END
这样的 修养 的 演员 即使 正 走红 也 不过 如 过眼云烟 而已 成不了 真正意义 上 的 艺术家 SEQUENCE_END她 看看 夜 己 饮用 深 白天 的 炎热 了 给 夜 凉 吹散 吩咐 大家 各自 安息 明天 继续 玩乐 SEQUENCE_END
她 看看 夜 己 很 深 白天 的 炎热 已 给 夜 凉 吹散 吩咐 大家 各自 安息 明天 继续 玩乐 SEQUENCE_END刘永 纲 等 委员 呼吁 实行 药品 专营 确保 用药 安全 SEQUENCE_END
刘永 纲 等 委员 呼吁 实行 药品 专营 确保 用药 安全 SEQUENCE_END四川 美术学院 群体 阵营 浩大 风格 多样 成为 本届 艺术 博览会 应 第一大 景观 SEQUENCE_END
四川 美术学院 群体 阵营 浩大 风格 多样 成为 本届 艺术 博览会 的 第一大 景观 SEQUENCE_END据 契 契 比 奥 受到 统一 的 责怪 却 随口 追回 的 句 妙语 白白 也 转 怒 为 喜 饶恕 了 他 SEQUENCE_END
厨子 契 契 比 奥 受到 主人 的 责怪 却 随口 说 了 句 妙语 使 主人 转 怒 为 喜 饶恕 了 他 SEQUENCE_END在 三百五十三 户 人家 的 贵州 网箱 养鱼 末 亩 飘 只 四百多 民族 平均 亩产 达到 五千四百五十 公斤 SEQUENCE_END
有 三百五十三 户 人家 在 洱海 网箱 养鱼 八十五 亩 产 鱼 四百多 吨 平均 亩产 达到 五千四百五十 公斤 SEQUENCE_END蒋 慧娟 廖 鸾凤 廖 静文 翟 文 蓉 颜 小军 潘 长 玉 潘 文兰 薛 昭 戴 丽芳 SEQUENCE_END
蒋 慧娟 廖 鸾凤 廖 静文 翟 文 蓉 颜 小军 潘 长 玉 潘 文兰 薛 昭 戴 丽芳 SEQUENCE_END男宾 一个 澡 十五 元 女宾 十 的 除了 池 淋 盆浴 以外 同样 可 享用 桑拿浴 蒸汽浴 SEQUENCE_END
男宾 一个 澡 十五 元 女宾 十 元 除了 池 淋 盆浴 以外 同样 可 享用 桑拿浴 蒸汽浴 SEQUENCE_END新华社 重点 介绍 了 企业 筹资 与 负债 茬 窦 讨 债务 与 预防 债务 发生 的 相关知识 SEQUENCE_END
该书 重点 介绍 了 企业 筹资 与 负债 经营 追 讨 债务 与 预防 债务 发生 的 相关知识 SEQUENCE_END国王 特 封 她 为 扎基 公主 因此 她 与其 兄 哇 集 拉 隆 功 王储 一样 拥有 王位 继承权 SEQUENCE_END
国王 特 封 她 为 扎基 公主 因此 她 与其 兄 哇 集 拉 隆 功 王储 一样 拥有 王位 继承权 SEQUENCE_END这 一家 个体 制品厂 本该 用 完整 的 型材 生产 门窗 却 越 半截 材 打结 凑合 SEQUENCE_END
有 一家 个体 制品厂 本该 用 完整 的 型材 生产 门窗 却 用 半截 材 打结 凑合 SEQUENCE_END墙根 墙脚 则 往往 光溜溜 的 亮 厌恶 孩子们 靠 也 墙上 玩耍 时 磨成 的 SEQUENCE_END
墙根 墙脚 则 往往 光溜溜 的 亮 是 孩子们 靠 在 墙上 玩耍 时 磨成 的 SEQUENCE_END
==============================================================================INFO:tensorflow:global_step/sec: 2.58
INFO:tensorflow:loss = 1.2592635, step = 99101 (38.760 sec)
INFO:tensorflow:global_step/sec: 2.61297
INFO:tensorflow:loss = 1.0890893, step = 99201 (38.270 sec)
INFO:tensorflow:global_step/sec: 2.61401
INFO:tensorflow:loss = 1.0499042, step = 99301 (38.255 sec)
INFO:tensorflow:global_step/sec: 2.59148
INFO:tensorflow:loss = 0.9883003, step = 99401 (38.588 sec)
INFO:tensorflow:global_step/sec: 2.62374
INFO:tensorflow:loss = 1.2160425, step = 99501 (38.113 sec)
INFO:tensorflow:global_step/sec: 2.61987
INFO:tensorflow:loss = 1.1636374, step = 99601 (38.170 sec)
INFO:tensorflow:global_step/sec: 2.60487
INFO:tensorflow:loss = 1.261106, step = 99701 (38.389 sec)
INFO:tensorflow:global_step/sec: 2.60601
INFO:tensorflow:loss = 0.96606606, step = 99801 (38.373 sec)
INFO:tensorflow:global_step/sec: 2.64198
INFO:tensorflow:loss = 1.1867452, step = 99901 (37.850 sec)
INFO:tensorflow:Saving checkpoints for 100000 into /home/ML/seq2seq/bin/data_thchs30/model/model.ckpt.INFO:tensorflow:Loss for final step: 1.0533162.
INFO:tensorflow:Saving dict for global step 101000: bleu = 61.01, global_step = 101000, log_perplexity = 1.1223234, loss = 1.1225033, rouge_1/f_score = 0.8025217, rouge_1/p_score = 0.79972243, rouge_1/r_score = 0.8066153, rouge_2/f_score = 0.6769801, rouge_2/p_score = 0.67535704, rouge_2/r_score = 0.6787826, rouge_l/f_score = 0.79572356
4. 同時进行 2.1) 部分的:
epoch==15 時結果:
I STARTING Optimization
I Training of Epoch 10 - loss: 32.818731
I Training of Epoch 11 - loss: 30.577577
I Training of Epoch 12 - loss: 28.848944
I Training of Epoch 13 - loss: 27.759910
I Training of Epoch 14 - loss: 26.041908
I FINISHED Optimization - training time: 0:25:00
I Test of Epoch 15 - PER: 0.357285, loss: 52.946847277318305, mean edit distance: 0.216647
I --------------------------------------------------------------------------------
I PER: 0.057143, loss: 9.116256, mean edit distance: 0.028571
I - src: "x_ie2 j_v4 k_uan3 q_ian2 t_ao2 g_uo2 uu_uai4 d_e5 zh_ong4 d_a4 zh_a4 p_ian4 f_an4 uu_u2 j_ia1 sh_eng1 l_iu4 vv_ve4 j_iu3 r_iz4 b_ei4 zh_ong1 g_uo2 g_ong1 aa_an1 r_en2 vv_van2 c_ong2 x_in1 j_ia1 p_o1 ii_ia1 j_ie4 h_ui2 g_uo2"
I - res: "x_ie2 j_v4 k_uan3 q_ian2 t_ao2 g_uo2 uu_uai4 d_e5 z_ong4 d_a4 zh_a4 p_ian4 f_an4 uu_u2 j_ia1 sh_eng1 l_iu4 vv_ve4 j_iu3 r_iz4 b_ei4 zh_ong1 g_uo2 g_ong1 aa_an1 r_en2 vv_van2 c_ong2 x_in1 j_ia1 p_o1 ii_ia1 j_in4 h_ui2 g_uo2"
I --------------------------------------------------------------------------------
I PER: 0.057143, loss: 9.428666, mean edit distance: 0.028571
I - src: "x_ie2 j_v4 k_uan3 q_ian2 t_ao2 g_uo2 uu_uai4 d_e5 zh_ong4 d_a4 zh_a4 p_ian4 f_an4 uu_u2 j_ia1 sh_eng1 l_iu4 vv_ve4 j_iu3 r_iz4 b_ei4 zh_ong1 g_uo2 g_ong1 aa_an1 r_en2 vv_van2 c_ong2 x_in1 j_ia1 p_o1 ii_ia1 j_ie4 h_ui2 g_uo2 "
I - res: "x_ie2 j_v4 k_uan3 q_ian2 t_ao2 g_uo2 uu_uai4 zh_e5 zh_ong4 d_a4 zh_a4 p_ian4 f_an4 uu_u2 j_ia1 sh_eng1 l_iz4 vv_ve4 j_iu3 r_iz4 b_ei4 zh_ong1 g_uo2 g_ong1 aa_an1 r_en2 vv_van2 c_ong2 x_in1 j_ia1 p_o1 ii_ia1 j_ie4 h_ui2 g_uo2 "
I --------------------------------------------------------------------------------
I PER: 0.060606, loss: 5.429083, mean edit distance: 0.030303
I - src: "q_i2 uu_u4 ii_iu2 m_ian2 ee_er2 sh_a1 ee_er2 b_u4 q_i2 sh_ix4 ii_iu2 n_ong2 ee_er2 g_ong1 ee_er2 sh_ang1 ee_er2 j_in1 r_ong2 q_i2 d_i4 ii_iu2 h_ai3 j_iang1 ee_er2 zh_ong1 zh_ou1 x_ing2 j_iang1 j_in4 g_ui1 x_i1 b_ei3 "
I - res: "q_i2 uu_u4 ii_iu2 m_ian2 ee_er2 sh_a1 ee_er2 b_u4 x_i2 sh_ix4 ii_iu2 n_ong2 ee_er2 g_ong1 ee_er2 sh_ang1 ee_er2 j_ing1 r_ong2 q_i2 d_i4 ii_iu2 h_ai3 j_iang1 ee_er2 zh_ong1 zh_ou1 x_ing2 j_iang1 j_in4 g_ui1 x_i1 b_ei3 "
I --------------------------------------------------------------------------------
I PER: 0.064516, loss: 7.513047, mean edit distance: 0.032258
I - src: "x_v3 sh_u1 x_iang2 s_iy4 d_uan4 h_e2 uu_uang2 l_ei3 uu_u3 d_uan4 ii_ie2 ii_iu3 sh_ang4 j_ia1 b_iao3 x_ian4 j_iang1 uu_uang2 vv_van2 h_e2 h_ua2 ii_i3 g_ang1 l_iang3 uu_ui4 b_a1 d_uan4 t_ao2 t_ai4 ch_u1 j_v2"
I - res: "x_v3 sh_u1 x_iang2 s_iy4 d_uan4 h_e2 uu_uang2 m_ei3 uu_u3 d_uan4 ii_ie3 ii_iu3 sh_ang4 j_ia1 b_iao3 x_ian4 j_iang1 uu_uang2 vv_van2 h_e2 h_ua2 ii_i3 g_ang1 l_iang3 uu_ui4 b_a1 d_uan4 t_ao2 t_ai4 ch_u1 j_v2"
epoch==30 時的結果:
I STARTING Optimization
I Training of Epoch 15 - loss: 24.193768
I Training of Epoch 16 - loss: 22.800252
I Training of Epoch 17 - loss: 22.270394
I Training of Epoch 18 - loss: 20.529751
I Training of Epoch 19 - loss: 19.253222
I Training of Epoch 20 - loss: 19.242993
I Training of Epoch 21 - loss: 18.651739
I Training of Epoch 22 - loss: 17.800750
I Training of Epoch 23 - loss: 16.454291
I Training of Epoch 24 - loss: 16.072622
I Training of Epoch 25 - loss: 15.130574
I Training of Epoch 26 - loss: 14.011816
I Training of Epoch 27 - loss: 13.616686
I Training of Epoch 28 - loss: 13.458223
I Training of Epoch 29 - loss: 12.777695
I FINISHED Optimization - training time: 1:15:48
I Test of Epoch 30 - PER: 0.366390, loss: 64.56215875660011, mean edit distance: 0.221604
I --------------------------------------------------------------------------------
I PER: 0.035714, loss: 3.528391, mean edit distance: 0.017857
I - src: "b_u4 j_in3 ii_iao4 x_van1 ch_uan2 sh_ao3 sh_eng1 h_ai2 ii_iao4 x_van1 ch_uan2 uu_uan3 h_un1 uu_uan3 vv_v4 ii_iu1 sh_eng1 ii_iu1 vv_v4 x_van1 ch_uan2 sh_eng1 n_an2 sh_eng1 n_v3 d_ou1 ii_i2 ii_iang4 "
I - res: "b_u4 j_in3 ii_iao4 x_van1 ch_uan2 sh_ao3 sh_eng1 h_ai2 ii_iao4 x_van1 ch_uan2 uu_uan3 h_un2 uu_uan3 vv_v4 ii_iu1 sh_eng1 ii_iu1 vv_v4 x_van1 ch_uan2 sh_eng1 n_an2 sh_eng1 n_v3 d_ou1 ii_i2 ii_iang4 "
I --------------------------------------------------------------------------------
I PER: 0.035714, loss: 4.101439, mean edit distance: 0.017857
I - src: "b_u4 j_in3 ii_iao4 x_van1 ch_uan2 sh_ao3 sh_eng1 h_ai2 ii_iao4 x_van1 ch_uan2 uu_uan3 h_un1 uu_uan3 vv_v4 ii_iu1 sh_eng1 ii_iu1 vv_v4 x_van1 ch_uan2 sh_eng1 n_an2 sh_eng1 n_v3 d_ou1 ii_i2 ii_iang4 "
I - res: "b_u4 j_in3 ii_iao4 x_van1 ch_uan2 sh_ao3 sh_eng1 h_ai2 ii_iao4 x_van1 ch_uan2 uu_uan3 h_un1 uu_uan3 vv_v4 ii_iu1 sh_eng1 ii_iu1 vv_v4 x_van1 ch_uan2 sh_eng1 l_an2 sh_eng1 n_v3 d_ou1 ii_i2 ii_iang4 "
I --------------------------------------------------------------------------------
I PER: 0.057143, loss: 7.630929, mean edit distance: 0.028571
I - src: "l_i4 ii_iong4 g_un3 zh_uang1 ch_uan2 k_e2 ii_i3 ii_iong4 k_a3 ch_e1 h_uo4 q_ian1 ii_in3 ch_e1 b_a3 h_uo4 uu_u4 c_ong2 g_ong1 ch_ang3 zh_ix2 j_ie1 s_ong4 d_ao4 sh_ou1 h_uo4 d_i4 d_ian3 sh_ix2 x_ian4 m_en2 d_ao4 m_en2 vv_vn4 sh_u1 "
I - res: "l_i4 ii_iong4 g_un3 zh_uang1 ch_uan2 k_e2 ii_i3 ii_iong4 k_a3 ch_e1 h_uo4 q_ian1 ii_ing3 ch_e1 b_a3 h_ou4 uu_u4 c_ong2 g_ong1 ch_ang3 zh_ix2 j_ie1 s_ong4 d_ao4 sh_ou1 h_uo4 d_i4 d_ian3 sh_ix2 x_ian4 m_en2 d_ao4 m_en2 vv_vn4 sh_u1 "
I --------------------------------------------------------------------------------
I PER: 0.057143, loss: 9.305422, mean edit distance: 0.028571
I - src: "x_ie2 j_v4 k_uan3 q_ian2 t_ao2 g_uo2 uu_uai4 d_e5 zh_ong4 d_a4 zh_a4 p_ian4 f_an4 uu_u2 j_ia1 sh_eng1 l_iu4 vv_ve4 j_iu3 r_iz4 b_ei4 zh_ong1 g_uo2 g_ong1 aa_an1 r_en2 vv_van2 c_ong2 x_in1 j_ia1 p_o1 ii_ia1 j_ie4 h_ui2 g_uo2 "
I - res: "x_ie2 j_v4 k_uan3 q_ian2 t_ao2 g_uo2 uu_uai4 d_e5 zh_ong4 d_a4 zh_a4 p_ian4 f_an4 uu_u2 j_ia1 sh_eng1 l_iu4 vv_ve4 j_iu3 r_iz4 b_ei4 zh_ong1 g_uo2 g_ong1 aa_an1 r_en2 vv_van2 c_ong2 x_in1 j_ia1 p_o1 ii_ia1 j_i4 h_ui2 g_uo1 "
看打印出来的某些单个结果都不得了,但总的PER为啥不好? 原来是程序只把最好的打出来了,差的没打印。测试集上最差的一个:
I PER: 0.857143, loss: 150.784866, mean edit distance: 0.514286
I - src: "j_in4 l_ai2 ii_i1 x_ve2 j_ia1 ii_iu4 f_a1 x_ian4 ii_in2 ee_er3 d_uo1 t_ang2 ii_iu3 k_ang4 zh_ong3 l_iu2 d_e5 z_uo4 ii_iong4 zh_e4 j_iang1 uu_ui4 ii_in2 ee_er3 sh_eng1 ch_an3 k_ai1 ch_uang4 g_eng4 uu_ui2 g_uang3 k_uo4 d_e5 q_ian2 j_ing3 "
I - res: "zh_u4 l_ai2 ii_i4 x_van3 x_iao3 ii_iu3 f_ang1 x_ian3 n_ing2 ee_er2 d_uo1 t_ao3 ii_iu3 k_eng4 d_ong4 l_z_uo4 ii_iong5 zh_ix4 x_iang1 uu_ui3 ii_i2 ee_er3 s_ong1 q_an3 k_ai2 ch_uang2 g_ou4 uu_g_uang3 k_uo4 q_ing1 "
语料不丰富还是参数待优化? 这先留个 TODO 吧,计划先把流程跑通。
5. 但遇到 phones 转 word 的 seq2seq 模型在部署到Serving后报错:
2018-05-28 15:28:09.271911: E tensorflow_serving/util/retrier.cc:37]
Loading servable: {name: seq2seq version: 20180527183436} failed:
Not found: Op type not registered 'att_sum_bahdanau' in binary running on VM_62_200_centos.
Make sure the Op and Kernel are registered in the binary running in this process.
Note that if you are loading a saved graph which used ops from tf.contrib, accessing (e.g.) `tf.contrib.resampler` should be done before importing the graph, as contrib ops are lazily registered when the module is first accessed.
因为这个项目比较旧,用的不是Tensorflow 标准版本里的函数,是自定义的,所以TF Serving当然不认识,后来根据提示继续去修改,最终遇到错误是:
E tensorflow_serving/util/retrier.cc:38]
Loading servable: {name: seq2seq version: 20180604133622} failed:
Not found: Op type not registered 'PyFunc' in binary running on jili-gong.
Make sure the Op and Kernel are registered in the binary running in this process.
这个问题别人也有遇到: https://blog.csdn.net/shin627077/article/details/78664988
后一直追溯到 Tensorflow未close的一个issue上: https://github.com/tensorflow/tensorflow/issues/17519
最终也没解,所以还是选择了别的两个替代项目来尝试:
- 较新的官方版项目(https://github.com/tensorflow/nmt/tree/master/nmt)
- 私人简化版 (https://blog.csdn.net/liuchonge/article/details/79021938)
6. 以私人简化版为基础重新开进(2018.5.28)
----- Step 12800 -- Loss 8.07 -- Perplexity 3185.58
----- Step 25600 -- Loss 7.91 -- Perplexity 2726.13
----- Step 38400 -- Loss 7.55 -- Perplexity 1905.53
----- Step 51200 -- Loss 7.30 -- Perplexity 1484.97
----- Step 64000 -- Loss 6.75 -- Perplexity 857.40
----- Step 486400 -- Loss 1.20 -- Perplexity 3.31
----- Step 499200 -- Loss 1.09 -- Perplexity 2.97
但实际效果却很差:
s u4 vv vn2 sh ang1 x in1 d e5 d uo3 z ai4 q iang2 g a1 l a2 t ang3 ii ian3 l ei4 k u1 g uo4 l e5
又要 您 您 阿拉法特 的 躺 在 相信我 苏州 秘诀 喷涂 的 大众 的 涂料 又要 这种 这种 遥远 遥远 遥远 的 派兵 派兵 的 决议案 死亡 漂亮 在 的 漂亮 要是 要是 要是 要是 有个人 有个人 当然 当然 要知道 要知道 心肌梗塞 要是 有个人 块 块 块 韦 韦 别
不知道啥原因?
- 为什么训练时Loss和PPX会降而实际测试结果却很差?
- 为什么官方的seq2seq就能很好呢?
要么计算loss和PPX的地方错了,要么就是解码时哪里错了,要继续对比和研究代码。