<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.3">Jekyll</generator><link href="http://kellwang.com/atom.xml" rel="self" type="application/atom+xml" /><link href="http://kellwang.com/" rel="alternate" type="text/html" /><updated>2023-05-09T06:52:13+00:00</updated><id>http://kellwang.com/atom.xml</id><title type="html">Kell’s Blog</title><author><name>Kell</name></author><entry><title type="html">我的1989</title><link href="http://kellwang.com/%E6%96%87%E5%AD%A6/2020/12/31/%E6%88%91%E7%9A%841989/" rel="alternate" type="text/html" title="我的1989" /><published>2020-12-31T22:36:23+00:00</published><updated>2020-12-31T22:36:23+00:00</updated><id>http://kellwang.com/%E6%96%87%E5%AD%A6/2020/12/31/%E6%88%91%E7%9A%841989</id><content type="html" xml:base="http://kellwang.com/%E6%96%87%E5%AD%A6/2020/12/31/%E6%88%91%E7%9A%841989/">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;font size=&quot;4&quot;&gt;谨以此文献给我所热爱的全部生活&lt;/font&gt;&lt;/center&gt;

&lt;h3 id=&quot;第一节&quot;&gt;第一节&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
1989年5月，我们在去北京的路上被遣返了。说是遣返，其实并不是有人强迫我们回来的，而是我们爬上的火车在途中坏了，等了一天都没行进，我们饿坏了，晚上又爬上反向回西安的车往回走了。回来的路上，开始下雨，雨越下越大。我们担心雨下的太大，又要停车，如果那样第二天白天才能走，身上没钱都是小事情，荒郊野外的到哪里区买东西吃呢。&lt;/p&gt;

&lt;p&gt;车还是这样慢悠悠的在风雨里走着，凌晨2点多，我站在车窗旁边，额头贴着车窗，感觉从车窗跳下去，跑着都能追的上火车。虽然已是初夏的晚上，但还真是冷。雨点斜斜地打在车窗上，锋利的像是把车窗的玻璃划了一道又一道，车厢一颠簸，一股股水流也斜斜淌下来，冲散了雨点锋利的痕迹。车窗和它下面边框不能完全合住，风就从那缝里不断的向车厢里钻，然后往身上吹。我们找没人的地方坐着，甚至没人的地方站着。第二天清晨，火车终于停靠在西安的站台上。&lt;/p&gt;

&lt;p&gt;又折腾了两天，我终于坐西安坐班车到了县城，回到了学校。出去进来学校的学生，老师太多，整个校园仍然如往日那样令人烦躁。学校的大喇叭没日没夜的在讲话，而且教学楼上两侧的这两个喇叭永远不能同时发声，声音总是一前一后的回响在整个校园，老师们也被聒噪着不能正常上课，在办公室批改作业时，捶打学生的作业本的次数都上升了。&lt;/p&gt;

&lt;p&gt;这些，终于在某一天早上的广播体操结束后，消失了。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gallery/1989/1989_00.webp&quot; alt=&quot;1989_00&quot; /&gt;&lt;/p&gt;

&lt;p&gt;6月，学校让学生们都回家去了，我的自行车被隔壁宿舍比我还瘦的货骑爆胎了，只好走了三十多里路从县城走回家。想想我作为一个高龄的中小学生，还能有机会学期中放假，别提多高兴了，就像小学的这个时候还放芒假一样。我想着家里麦子今年种了不少，可以帮着收麦，扬场。我虽然不喜欢在地里干活，劳动，但这两年，家里的地我却能多做就想多做一点。我妈不让，说我要高考，不能体力劳动，要把精力放在复习功课上。&lt;/p&gt;

&lt;p&gt;我是穷人家的孩子，但没有穷人家孩子的命。穷人家但凡有个勤俭持家，辛苦操劳，贤良重教的母亲，就一定也有一个聪明好学，刻苦学习，成绩优异的孩子。然而，前一半做到了，而后一半并没有。&lt;/p&gt;

&lt;p&gt;高考第一天很顺利，但第二天早上，紧张了，呕吐了。这是为什么，可能是因为第一天表现太好，反而压力大，害怕后面的表现不好吧。考试前我大概算了一下招考比例，以我的班级排名差不多刚好到我就截止了，但是一想，我所在的是一个落后的小县城，相较全国的综合比例还会少的多，看来我是考不上的。&lt;/p&gt;

&lt;p&gt;7月，学校放暑假了。刚刚复课没有一个月，紧接着又要放假。学校在放假前，校长在晨会时，在学校操场的讲台上扯着自己的嗓子告诉我们，不要出去瞎玩瞎闹。大喇叭因为前两个月学生冲进去砸坏了麦克风，还没修好，只要一通电就“刺啦刺啦”的响的不停。临近毕业，终于才新换了话筒，校长又三令五申的说着说那，还专门告诉我们这些毕业的高三学生，要我们要么继续好好学习，要么掌握一个技能，进入工厂，跨步进入社会主义建设的大家庭中。话音背后还有大概能听清楚的其他电台混入的秦腔的声音。&lt;/p&gt;

&lt;p&gt;那时候我刚高考结束，成绩也出来了。几门课考得都很认真，但无奈分数不够，没有一个大学愿意招我。我妈那两个月每天见到我都要骂我，不争气。但其实我也知道，她也做好了我考不上的准备，因为她知道我在学校的成绩，但她总是这么一个不甘心的人。我总是说，人家上边计划变了，本来招的人多，现在少了好几万，我就是那好少了的几万，知道吧。我妈一听，一边用棒槌捶打衣服一边爆粗口地继续骂，咬牙切齿，偶尔也骂错了连自己也骂了，那几个月的衣服总洗得很干净。&lt;/p&gt;

&lt;p&gt;我妈让我到县城去学厨子，可我不想，我觉得那不是男人干的活，天天围着锅灶转，手里拿着锅瓢铲，最要命的是我不能穿着围裙饿着肚子给别人端菜盛饭。那时候我就觉得开个拖拉机啊，收割机啊，挖掘机啊，这些比较好。风风光光的在大街上、公路上兜风，远远地看见熟人，你就按喇叭，一点头，一微笑，“突突突”的就过去了。最后，到县城一问，开这些大机械最好还是要有证，整个县城也没有几个车让你开，不过会开的人其实也不少了，大多也都没证。我一听，又要考证，所以也就放弃了这个念头。&lt;/p&gt;

&lt;p&gt;县城里有个食品厂，离最繁华的街道一墙之隔，我们县城繁华的街道也就这一条，长度也就一千米。这食品厂的牌子经常在过年过节卖的水晶饼盒子上看的到，我同村的一个和我同姓的哥介绍我来这里工作，我就问他，你们是不是每天三餐都吃水晶饼？他说不是，他们也就一个月吃不了那么一两次，其他都是员工灶，馒头稀饭面。我觉得反正能吃到水晶饼，总比我一年吃一次强吧，就去了。没想到，我被分到做锅巴的线上了。还好，锅巴也是好吃的。&lt;/p&gt;

&lt;p&gt;我在县城里这家因水晶饼做的很好的著名食品厂里做锅巴，曾经在城里的大商店看到我们这个牌子的水晶饼。现在我想着，城里人竟然也吃着乡下人做的水晶饼，这可不比城里人吃着乡下人种的蔬菜水果大麦，说明我们做的点心更高级嘛。&lt;/p&gt;

&lt;p&gt;我一个月的收入32.5元，管吃又管住，已然觉得自己是一个工薪阶层了，如沐社会主义春风。厂房隔壁的厂房就是宿舍，大通铺，晚上可以听到此起彼伏的打鼾声，接力一样的从厂房这头传到那头。另外，在食品厂上班的大部分人文化水平都不高，连厂长都是小学没毕业就出来混社会的人，像我这样的高中生，我觉得自己是读过书的文化人。&lt;/p&gt;

&lt;p&gt;那个骑爆我自行车胎的家伙，是我同班同学，那时他坐在班里第二排最左边，头发卷卷的贴在头上，带着黑色圆框的学生镜，看起来像个文弱书生，大家叫他二田，是理科班里最有文学素养的学生。不知道什么时候，他也跑来食品厂来上班了，在做水晶饼的生产线。我记得他学习还不错，高考考到了我们县城里唯一的高等学府，一个名字和航空相关的高职学校，进进出出的全是老师学生，连门卫值班的大爷都有儒雅的读书气质。我不懂什么是航空，大概是一群人在搞什么飞机吧。&lt;/p&gt;

&lt;p&gt;有一天中午在食堂吃饭，我和他坐对面。&lt;/p&gt;

&lt;p&gt;我问他，“你不是去那个大学上学去了吗？”&lt;/p&gt;

&lt;p&gt;他说，“被劝退了。”&lt;/p&gt;

&lt;p&gt;我问，“劝退！为什么？”&lt;/p&gt;

&lt;p&gt;他说，“不知道学校老师怎么知道了，我砸了高中学校大喇叭的话筒的事。”&lt;/p&gt;

&lt;p&gt;我问，“这样就被劝退了？”&lt;/p&gt;

&lt;p&gt;说，“学校的政治审查，政教处说我这事儿过不了。”&lt;/p&gt;

&lt;p&gt;……&lt;/p&gt;

&lt;p&gt;对，就是他，砸了高中学校的传达室的话筒。&lt;/p&gt;

&lt;p&gt;5月底我们从北京坐火车回来，实际上是从太原回来。那些天早上做完广播体操，学校的大喇叭就转播昨天晚上的中央新闻，每天都是各种不提及核心问题的声明，或者是关于领导出访的消息，亦或者是教导员的再一次告诫。二田像练武术一样地做完广播体操，我在他后面站着，被嘈杂的声音遮盖，总是幻听他嘴里还有给自己动作“哼“，“哈”的配音。&lt;/p&gt;

&lt;p&gt;6月5号的早晨的广播体操后，播稿老师照例开始念新闻，只念完第一则，二田喊着“不要逃避，不要逃避！”大步地跑到操场一侧的广播站，拿着门背后的扫帚把儿，敲坏了话筒。全校的学生站在操场，在大喇叭里只听到播稿的老师“哎呦，我贼！”了一声，就只有“嗡嗡”的没了人的声音。&lt;/p&gt;

&lt;p&gt;复课之后学校让他写一万的字的深刻检讨。二田自己觉得不够，用了三天时间几乎没有休息，写成将近三万字的检讨书。用厚厚的一个作业本，竟然写了一份检讨，里面洋洋洒洒的都是关于阶级矛盾与国家道路的论述和认识，一笔一划的竖折弯钩的字迹和他常在教室里给同学们讲课的语气一模一样。原本，班主任要让他把检讨在班里念一遍，最后，只看了看这个封面是小男孩和小女孩放风筝图案的作业本，然后翻看了他最后一页悔过的陈述，然后，放弃了让他朗读的这个想法。&lt;/p&gt;

&lt;p&gt;二田其实是个非常善良的人，大家觉得他二，所以叫他二田，他也是个很聪明的人。他的父亲母亲离婚好些年，没有一个人管他，他也好几年都没见过他们俩，他们分别离开村子到了外面打工。二田高中之前和奶奶住在一起，上高中考到了县城，现在也只有周末回去。他奶奶六十多岁了，还在家里看了一头羊，几只鸡。奶奶也听不懂什么是阶级关系，也不知道二田在学校犯了错。而且也不知道孙子考上大学了，她应多一点高兴，所以也就没有因为孙子被学校劝退而多一点悲伤。&lt;/p&gt;

&lt;p&gt;二田每周末回到家里，早上第一件事就是帮着挤羊奶，到奶站交羊奶。奶站对羊奶的密度和温度有要求，二田自己家里有个密度计，奶奶每天自己在家里测密度，密度大于指标，就给羊奶里面兑温水，能多卖点钱。可他奶奶养的这头羊啊，营养不良，产的奶别说兑水了，不兑水的羊奶密度都几乎不达标。这羊的蛮劲大，奶奶牵不动它，每天下午放羊只能在村口附近吃草。或者二田他奶把槐树枝砍下来，带回家给羊吃。而别人家的羊可以在在山坡上撒野、奔跑、狂吃鲜草，去山坡上路过村口时，都不屑停留，那些落满灰尘的枯草，都留给了二田奶奶的羊。&lt;/p&gt;

&lt;p&gt;吃不了好草的羊，怎么能产出好奶？&lt;/p&gt;

&lt;h3 id=&quot;第二节&quot;&gt;第二节&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
老莫是我在厂里的师傅，老莫不算老，比我大十来岁，在这里干活干了十年了，总对我说，我刚来这厂里上班的时候，年纪也像你一样大。确实，他从开始做挂面，做粉条，到现在做糕点，做零食。这厂子也就开了十年，所以论资历，大家都叫他老莫。虽然是老前辈，但是和我们住一起的宿舍，工资也比我们高不了多少。不过他已经不做苦力活，我觉得他现在是锅巴工线上的监工，所有的流程他都熟悉，所有的问题他都能解决。他每周末都会回家，他家在里县城不远的地方，有时候周内有事也骑着车子就回去了。&lt;/p&gt;

&lt;p&gt;和做水晶饼的一样，我们也能吃到自己做的锅巴，发工资那天下午下班时，我们会每人领一包。所以，发工资那天出的一斤包装的锅巴才真正是一斤的。&lt;/p&gt;

&lt;p&gt;老莫每月拿回来的锅巴，自己不吃，到周末带到车子上，回家给孩子。他有两个孩子，一男一女，男孩子今年十一岁，女孩五岁半，同在一个学校，一个上五年级，一个才刚上小学。老莫的老婆看起来很彪，大脸盘子粗嗓门但个子低矮，老莫个子不低，在老婆面前倒显得像了一个小男人。老莫老婆人非常好，看着不苟言笑，也常常来厂里见老莫，当着我们的面夸老莫这能行那能行，这一点让我感到意外，我以为她总会劈头盖脸的全是骂老莫。&lt;/p&gt;

&lt;p&gt;老莫平时沉默寡言，那些中年男人在一起也嬉笑怒骂，老不正经。老莫也被取笑，他就笑笑不说话。&lt;/p&gt;

&lt;p&gt;8月的一天晚上，是要关灯睡觉的时候了，老莫急匆匆的跑来找我，问我借自行车，说他要回家。我问他他自己的自行车呢，他说他的自行车太重太闷，跑不快。我看他惊慌失措的样子，一边带他跑去车棚，一边问他家里出了什么事。他告诉我，他小女儿傍晚和小伙伴在山坡上玩，吃了不少坡上的野萝卜，别的孩子吃的少现在拉肚子，他女儿现在上吐下泻，半昏迷。半夜乡大队医院没有医生，值班护士没执照不敢开药打点滴，让转院去县城。&lt;/p&gt;

&lt;p&gt;我说，我再借辆车子，把孩子她妈带着，你带着孩子，你一个人骑一个车子，带两个人肯定慢。老莫再没说什么。&lt;/p&gt;

&lt;p&gt;我们骑着车子，到乡里。老莫老婆在大队医院的病床旁边，腿软得跪在地上，手里拿着毛巾给女儿擦嘴巴。小女儿已经昏睡过去了，老莫不能把女儿单独带在车后座上，得有人抱着女儿。结果还是他骑车带着老婆，老婆抱着五岁的女儿。&lt;/p&gt;

&lt;p&gt;我帮不上什么忙，问老莫带有没有带够钱，他说有。老莫对我说，你先走一步，到县城北门的医院，给医生说一下情况，我们在后面，去了就能进急诊。&lt;/p&gt;

&lt;p&gt;我到县城人民医院，急诊室的医生是个年轻的姑娘，问孩子吃了什么，我说是野萝卜，医生问我什么是野萝卜，我也不知道。我就说是中毒了，口吐白沫的症状，哪种药能治，你现在都拿出来，准备好，孩子来了你一看，该用哪个就直接用。她上楼叫了值班的医生，那医生才看起来有点年纪，我又把我能说的讲了一遍，他们在病床边挂了两瓶写着NaCl的吊瓶，里面还兑了其他的粉末。那时，我看看表，11点多。&lt;/p&gt;

&lt;p&gt;没多久，老莫就来了，当即就给女儿打上点滴。孩子昏迷着不醒，老莫老婆着急得眼里有泪，老莫瘫坐在凳子上沉默不语。医生听了听胸腔，腹腔，说还都正常。老莫让我早点回厂里，我说没事，等着孩子醒了，我就回。老莫说要出去买吃的东西，他知道老婆下午没吃饭，我们到现在也饿了要命。大晚上县城里卖东西的可不多，老莫跑了很远，回到厂里，去看大门的师傅家里，要了几个馒头和一串柿饼。&lt;/p&gt;

&lt;p&gt;我和老莫在病房外的椅子上坐着，柿饼就着馒头吃，没有水喝。噎得我想打嗝，却不想让老莫察觉，就一直在要咽唾沫。小女孩点滴打了一瓶，慢慢有了意识。&lt;/p&gt;

&lt;p&gt;老莫其实还有个大女儿，比男孩小，比女孩大，大女儿五六岁的时候，冬天在河边玩的时候掉冰窟窿里，死了。&lt;/p&gt;

&lt;p&gt;睡我上铺的小哥在锅巴工线的打包工位，锅巴线有三台大设备，但平时只开一台，其中一台是破旧的老设备，不能用了。我让小哥把包一袋最多的留在桌子最里面，我去的时候，就从最里面拿出来。我让他故意反套着袋子，我去挑印的字是反的那袋。发工资那天，正好是周六，第二天我想带着第一月的工资和锅巴回家。&lt;/p&gt;

&lt;p&gt;我回到宿舍，找我在水晶饼厂区的哥们，用我的半包锅巴换了他四个水晶饼，他那一包是六个。他说他划不来换，我说我明天要回家，想给我妈带回去，这他才同意了。第二天从县城走路回家的时候，没吃早饭，走着走着自己实在太饿了，吃了一个水晶饼。&lt;/p&gt;

&lt;p&gt;房顶，门前，家里都是金黄的玉米棒子，我妈坐在门边上剥玉米，地上的大簸箕里已经装得满满地。我端了一个凳子坐在她旁边，一边和她说话，一边帮他剥玉米。小时候我很喜欢剥玉米，直接用手都剥的很得劲。我觉得玉米一年比一年硬了，剥不动。我妈的手里拿着锉子，一行行米粒就能快速的脱落，她的手看起来和玉米锉子一样粗糙。&lt;/p&gt;

&lt;p&gt;我告诉她我带回来了钱和锅巴，还有水晶饼。我妈说，钱你自己拿着用，但是要开始自己攒钱。我嘴上说着攒钱干什么，有钱就花呗，但是心里面在想着确实要开始攒钱了。&lt;/p&gt;

&lt;p&gt;我妈说今年让我去给我爸上坟，她不去了。我问她为啥她不去，她没说话。她让我带上白酒和烟袋。我爸在的时候，我妈从来没允许过我爸抽烟喝酒，每次见都骂骂咧咧的，现在，我爸不在了，她去见我爸，自己却都带着白酒和烟袋。&lt;/p&gt;

&lt;p&gt;我说，“我爸现在肯定不想再抽旱烟袋了，他要抽滤嘴烟。“&lt;/p&gt;

&lt;p&gt;她说，“你爸哪有讲究，家里也没有啊。”&lt;/p&gt;

&lt;p&gt;我说，“我去买一包。”&lt;/p&gt;

&lt;p&gt;她说：“你就挣了一个月钱，啥你都买！”&lt;/p&gt;

&lt;p&gt;我说：“我有钱，自己的，你可管不着！”&lt;/p&gt;

&lt;p&gt;她对着夺门而出的我喊，“有钱你就买烟，没钱你就捡破烂去吧！”&lt;/p&gt;

&lt;p&gt;狗屁，我现在是捡锅巴的人！&lt;/p&gt;

&lt;p&gt;我花自己挣的钱买了一盒烟，红色的软盒包装“猴王”，只给我爸抽了一根，烧纸钱的火顺着风窜得很快，烧了烟皮、烟丝，连烟屁股都烧成了灰，剩下的烟我放烟盒里揣到自己裤兜了。&lt;/p&gt;

&lt;p&gt;第二天一大早起来，我骑着车子去县城了。骑到一半，才想起裤兜里还有一包烟，十几根烟折了一半。我把那些断了的皮儿的烟丝自己用纸包起来，一口气抽完了，把那几根没断的烟给了老莫。&lt;/p&gt;

&lt;p&gt;我对我妈说给我爸买滤嘴烟的时候，那一瞬间想到了老莫那张脸。&lt;/p&gt;

&lt;p&gt;老莫请我去他家吃饭，要感谢我。他小女儿第二天就出院了，喝了三天的稀饭，今天是全家第一天炒菜吃。那周星期天的中午，我和老莫一起骑着车子回他家。&lt;/p&gt;

&lt;p&gt;我之前没去过老莫家，上次也是直接去的队里的医院。他家房子在山坡的半腰上，青灰的瓦房，房前一侧还有半边盖的侧房，主房背靠着山坡，后面还有一个小院子，院子后面，在坡上掏了一口窑洞。窑洞里放着犁铧，手推车，还有一孔鸡窝。剩下来的就是一堆苞谷叶和硬柴火了。&lt;/p&gt;

&lt;p&gt;老莫老婆在灶上烧火，进门的那一刻，热锅盖子被她掀开，蒸汽冲上来，我没看清她的脸。两个孩子一个在炕上坐着，另一个在隔廊没出来。炕上的女孩叫我“哥哥”，我笑了笑一时不知道怎么回她。男孩子从隔廊门口探出头来，没说话又缩回去了。老莫说他正在写作业。&lt;/p&gt;

&lt;p&gt;老莫家里的饭桌比我们家的好，黑漆刷的很亮，但是饭明显没有我们家的好吃。老莫老婆的话很多，几乎是她一个人在说话，问我很多问题。老莫老婆只是看起来彪一点，但是聊起天来，感觉还比较亲切。老莫老婆知道我父亲不在了，只有母亲一人在家。也知道我是家里的独生子，所以对我的提问也都聚集在我的母亲和我现在工作上。老莫只是埋头吃饭，偶尔抬头笑笑，“嗯”的给她回应。两个孩子在饭桌上也依然很安静。&lt;/p&gt;

&lt;p&gt;下午，老莫带着他的两个孩子和我去摘柿子。村里有两棵柿子树是他家的，有一棵在村那头的路堎边上，被路过的人偷摘了没剩多少，另一棵在离家里很远很远的山沟里，所以我们四点不到就出发了。&lt;/p&gt;

&lt;p&gt;山坡上的柿子树长得很高很高。而且柿子树的枝干又很细很细，老莫让男孩子小莫爬上树摘，太高的地方也只能拿杆子绑着钩子勾。男孩子也才十一岁，干瘦干瘦的身板，爬树却是很快，脚踏在柿子树最底下的树枝上，树就已经开始摇晃了。老莫说之前都是他自己上去摘柿子，现在越来越胖，越来越不灵活，爬不上了柿子树了。这两年都是他的儿子上树摘柿子。&lt;/p&gt;

&lt;p&gt;我和老莫在树底下捡柿子，小女孩在坡上的草丛里玩，小莫勾一会儿柿子，老莫就让他休息停下来，我们再俯身去捡，不然，再怎么小心都可能被柿子砸到。山沟里的这棵柿子树很大，结了很多果，个头都很大。&lt;/p&gt;

&lt;p&gt;我担着摘了两平篓的柿子。小女孩要吃柿子，可是新摘的柿子还非常苦涩。老莫没办法，告诉她，要吃就要吃完，这柿子回去还要暖，那时候才会甜，才会好吃。最后他挑了一个小柿子，给小女孩。&lt;/p&gt;

&lt;p&gt;小女孩拿了柿子，柿子皮生涩得也剥不开，她咬了一大口，眉毛不禁的锁住，老莫笑着问她是不是不好吃。小女孩严肃地告诉父亲：没有，很好吃。老莫突然指着一丛大叶子问她，是不是吃了这东西，小女孩点了点头。我才明白，老莫认识他家孩子前两天吃的毒萝卜，那叶子确实和萝卜的很像。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gallery/1989/1989_02.webp&quot; alt=&quot;1989_02&quot; /&gt;&lt;/p&gt;

&lt;p&gt;我们回到老莫家，已经是晚上七点了，简单的吃了开水就馍的晚饭，然后，老莫和我又骑着车子，回了县城。&lt;/p&gt;

&lt;p&gt;老莫告诉我，往年学生放暑假的这段时间，厂里面总会有电影放映的人来放电影。但是今年应该是没人来了，大型的聚会都要取消了。我以前看过很少的几次电影，但我总能记得给我留下深刻印象的第一次。那时候年龄还小，我也并没有记下那个电影的内容，只有一个镜头，那一幕至今没有忘记过。&lt;/p&gt;

&lt;p&gt;那是一个死了的人，被两个人一前一后的抬着，从一个内室抬到大厅的棺材里面，前面的那个人穿一身的白色衣服，后面那个人穿着一身黑色的衣服。就在他们把这个人放在棺材里面，准备盖棺材顶的时候，突然的里面的人突然醒了，一手撑着棺材盖，一只手伸出来抓着边沿，这两个黑白人，十分惊慌，喊着“诈尸啦！”一个直接扑到坐在棺材盖子上，另一个敲打这里面人的手，最终，两个人把棺材楔住，顶上了钉子，而里面那个人还在不断的敲打着木板，企图能爬出来。棺材在两侧撑着木条上放着，里面的人还在撞击拍打，棺材一阵阵的颤动，却不能出来，我竟忘了后来发生了什么。&lt;/p&gt;

&lt;p&gt;也就是这一幕，让我害怕了很久，我家里的厕所在后院的一角，离前厅的火炕很远，晚上我独自一个人去尿尿，茅厕又很黑，一阵风吹过，嗖嗖地响。我的脑海里不禁浮现很多画面，感觉黑暗中躲藏的什么东西要向自己走来，也会抓住我，然后我就很慌张。很多时候，还没有尿完，就一边提着裤子一边继续尿着往屋子里跑，由此，我练会了一招，倒着边跑边尿。&lt;/p&gt;

&lt;h3 id=&quot;第三节&quot;&gt;第三节&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
我上高中的时候虽然和二田同班，但是我们交集却很少，印象最深刻的是一次生物课。&lt;/p&gt;

&lt;p&gt;学校有一台显微镜，唯一的一台，放在生物老师的办公室，锁在他身后书柜里。其他的生物课教学仪器、标本都在教材室，教材室常年不打开，也不用，学生们路过窗口都只能朝里面看看。显微镜这东西也只是听高年级学生说过，除了在课本上的显微镜照片，我连看也没有看过。高一刚开学发新书时，我后座告诉我说这学期要学显微镜，他从他高二的哥哥那里才知道，学校的那台显微镜在来是办公室后座的柜子里，县里的三所重点高中里一家一台，是特别申请经费买来的。&lt;/p&gt;

&lt;p&gt;高二，终于在讲细胞的第一节课上，老师把这个学校唯一的显微镜请出来了。但老师仍然把它锁在一个桃红的木匣子里，讲了半天课，也没有打开匣子。&lt;/p&gt;

&lt;p&gt;讲完细胞结构，说细胞有多么小，人的肉眼看不到，只能借助仪器来观察。老师说一会大家可以自己用显微镜看看细胞到底长什么样子。终于才把显微镜拿出来，然后他又讲显微镜的构造，这是哪里哪里。同学们对照着书上的显微镜观察，一个个眼睛都发亮，都已经急不可耐的想上讲台去看看，去看看所谓的细胞。最后老师又开始讲显微镜的工作原理，我看看时间，只有十几分钟就要下课了，已经没有心思再听老师讲这些。&lt;/p&gt;

&lt;p&gt;老师把菠菜叶绿细胞结构的永久玻片拿出来，放在显微镜上，亲自调好焦距，光圈，角度。然后让大家排好队一个接一个的用显微镜观察，每个人20秒时间，还告诉我们自己不要碰显微镜。&lt;/p&gt;

&lt;p&gt;排在后面的人都希望别人早点上去看到，就帮台上的人数秒，可越数越快，两秒并一秒的喊着。我和邻桌的同学，还有二田排得比较靠后，二田在我后面第三个。终于轮到我了，上前凑到显微镜镜头看，我听到后面的人数得实在太快了，我扬起身，大声对大家喊，让他们数慢一点。完之后，大家停顿了两秒，然后并没有变慢，短短20秒就过去了。&lt;/p&gt;

&lt;p&gt;我在显微镜里什么都没有看到，只是一片灰白。但在我回座位的时候，我看到、听到教室里同学们讨论着自己刚刚都看到了什么，翻着生物书核对着自己看到的结构。于是，回到座位上，我也和在我后面观察的邻桌的两个同学也开始讨论，假模假样的也告诉别人我看到了什么。&lt;/p&gt;

&lt;p&gt;我们三个大谈特谈的说，“哎，对，这就是液泡。”&lt;/p&gt;

&lt;p&gt;“细胞核就是颜色最深的那部分不？”&lt;/p&gt;

&lt;p&gt;“细胞壁，细胞壁你们看到了吗？真的就像是书上说的两层结构。”&lt;/p&gt;

&lt;p&gt;“叶绿体？那么小，你还能看到，你可别吹牛呦！”&lt;/p&gt;

&lt;p&gt;这时候，二田在讲台上观察着，20秒也匆匆的过去了，被后面的人催促着离开，他突然举起手，对老师说：“老师，我没看到啊，什么都没有啊！”&lt;/p&gt;

&lt;p&gt;“快下来吧，就你想多看会呗。”下面的人喊到。&lt;/p&gt;

&lt;p&gt;老师走到显微镜前，看了一眼，发现视镜下的玻片位置不对，他挪了挪玻片，还动手调了调反光镜，“这下你看”。&lt;/p&gt;

&lt;p&gt;二田凑过去再看，只看了一两秒，“啊呀，我看到了，老师。”然后二田才兴冲冲的跑下讲台。&lt;/p&gt;

&lt;p&gt;我心里想到自己刚才什么都没看到，还和前面的两个邻桌讨论了这么多，我们三个人没说话，也没敢互相看对方，估计心里边都相互猜忌着对方也没看到任何东西。&lt;/p&gt;

&lt;p&gt;回家给他奶奶挤羊奶的二田也回到厂里了，我总是看他一个人，有时手里还拿着本书。我问他是不是还想上学，他说他两年后还要参加高考，他要到外地去上大学。然而他放心不下的就是他的奶奶了。要是他奶奶这两年死了也好，他就能无牵挂的出去了。&lt;/p&gt;

&lt;p&gt;二田在水晶饼线上工作，但是宿舍却离我很近，只隔了一个床铺，他在上铺。我几乎随时都能看到他在床头放着的几本书。每天晚上，他下铺的哥们喜欢坐床边泡脚，一直到熄灯。上铺的二田喜欢抱本书，一直看到熄灯。他一直想和底下的哥们换铺，下铺的一直没答应，一个想方便的看书，一个想方便的洗脚。&lt;/p&gt;

&lt;p&gt;一天晚上，二田半躺着手里拿着书，看着看着困了，头歪到一边已经睡着，手里的书慢慢地滑落。从床边的铁护栏中间掉下来，“哐”一声，砸到了下铺哥们的脑袋。然后又巧妙地掉到那哥们的洗脚盆里，下铺哥们被吓了一跳，坐在床上的屁股弹了起来。&lt;/p&gt;

&lt;p&gt;二田醒了，两个人看着彼此。二田懵懵的不知道发生了什么，只等着下铺的哥们提着他沾水的书给他看时，才明白是怎么回事。下铺哥们有点生气，说“你的书掉下来，砸到我了。“”我的书掉到你的盆里了？“&lt;/p&gt;

&lt;p&gt;二田也有点生气，气氛显得非常尴尬，二田从上铺跳下来，夺过自己的书，半边的书都已经湿了。下铺哥们拿着书一躲过去，没给他，顺势还把书扔到床铺的另一边的地上。这一下却是激怒了二田，二田也不去管他的书了，双手就是一推，下铺兄弟向后踉跄一步，猛地一倒，倒在自己床边上，脚上一支布鞋也滑掉了。&lt;/p&gt;

&lt;p&gt;下铺哥们站起来，一脚有鞋一脚没鞋的上前走了两步。于是，两个人你来我往，你一推，我一推，竟动起手来，旁边围上上两个人开始拉架，但是还是拉不住愤怒的两个人，又互相踹了几脚。下铺的哥们当天晚上没在他的床铺睡觉，不知道去了哪里。&lt;/p&gt;

&lt;p&gt;第二天大早上，下铺的哥们就找到正在洗脸的二田，告诉他让他找些人，约了三天之后在厂门口打架。二田没应声，下铺的哥们就走了。二田在县城里、自己村里也没什么亲戚，朋友，他也根本没找别人。&lt;/p&gt;

&lt;p&gt;三天后，二田又被打了一顿，下铺哥们叫了几个他们村的小伙子，就在厂区里面，车间门口，拦住了二田，按在地上，一顿暴打。二田也算是运气好，只是颧骨青了点，其它什么看起来都没什么问题。&lt;/p&gt;

&lt;p&gt;这要是放在十年前，约群架可是要说好时间，地点，双方人数的。要是人数不对等也是打不起来，现在啊，没这规矩了。&lt;/p&gt;

&lt;p&gt;厂里自然知道了这件事，当即就开会批评了这两个人，但谁都没有被开除。这事不怪二田，是下铺哥们找人打了二田。可是如果厂里开除了这下铺哥们，恐怕他还要找二田动手，怪他让自己丢了工作，出了人命可就不好。工厂把他们都留下劝导。下铺哥们的床铺搬走了，二田的床铺搬下来了，工作线也换了，从水晶饼线换到锅巴线，和我在同一个车间。&lt;/p&gt;

&lt;p&gt;二田还有个哥哥，在城里打工。&lt;/p&gt;

&lt;p&gt;自从二田和我在同一工作先上干活，我平时和他接触的时间就比较多了。二田来到锅巴线上以后，他的工作也是老莫带着，我们这两个年轻人就跟着这师傅。那时候我已经在锅巴车间干了三个月了，基本上熟练了整个过程，老莫让我在工线的四五个段位都做了几天。我觉得自己像个老员工一样给二田讲这讲那。&lt;/p&gt;

&lt;p&gt;和他聊的多了，我才知道，二田的父亲不是他的父亲，他的母亲也不是他的母亲，他是他们包养来的孩子。他的父母根本就生不出孩子，也不知道是父亲有问题，还是母亲有问题，反正现在两个人都出去打工了，听村里人的闲言碎语，他们在外边又彼此有了新家。二田近些年只见过这个养父一次，一次过年时候回来看二田的奶奶，二田的生父不认自己的亲妈，现在却只有二田把这个养父的妈当亲奶奶。&lt;/p&gt;

&lt;p&gt;二田不想真的无依无靠，不想这个世上没有任何一个亲人，甚至他还想从奶奶那里得到他生父母的消息，可奶奶也告诉他自己不知道儿子从哪里抱来的二田。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gallery/1989/1989_03.webp&quot; alt=&quot;1989_03&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;第四节&quot;&gt;第四节&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
老莫的老婆把家里暖的柿子托给老莫，给我带了一布袋子。暖的又红又软，带来时都已经压烂了几个，柿子完全熟透了，一点也不苦涩。我家没有柿子树，只有两颗核桃树，但核桃树长在一片茂密的竹林中间。今年的8月初，我一个人上树打核桃，打完自己再下树捡。散落在竹林里的核桃很难找，而且竹子间隔很窄，捡拾的时候要一直弯着腰。&lt;/p&gt;

&lt;p&gt;不知道什么时候，我也开始抽烟了。以前我没钱，看到烟也不买，现在手里总有点钱，也就总想买点烟。老莫也抽烟，他不希望我抽烟，但有时候他抽烟看见我，也会给我，他更不想看到我自己用钱买烟。&lt;/p&gt;

&lt;p&gt;在锅巴线上，车间主任是个戴眼镜的男人，鬓角已经白了，总是穿着深蓝长裤和中山装，印象中从来没有见过他穿其他衣服，一副老学究的样子。他就在厂房西侧的厂办的最后一间屋子坐着，空闲了就捧着印着“为人民服务”的白色搪瓷杯来厂房转几圈。他是厂里的老人了，虽然只是个主任，但明显比副厂长的架子还大。这食品厂刚开始建设的时候，就是征了几户人家的宅基地，其中就有他的一家。现在锅巴线上的就只有他一个人是这里当年征地的老住户，当然也就是老关系户了。&lt;/p&gt;

&lt;p&gt;老莫下午上班有时候就去主任房子里休息，说是休息，其实就是去抽烟。&lt;/p&gt;

&lt;p&gt;老莫和锅巴车间的主任合伙偷卖面粉。车间主任联系的买家，老莫负责接头，自己也出体力搬运到车间的侧门就，实际上车间主任才是实际的操纵者和最后主要的受益者。厂里的面粉一般都卖给了县城里两家档次比较高的酒店，这几家饭店是老莫的固定客户，每周一的晚上都会从长里侧门偷偷运出去，和厂里垃圾台的垃圾一起走。老莫卖掉的面粉自己能拿三四成的钱。&lt;/p&gt;

&lt;p&gt;车间主任几乎什么都不做，拿走一多半的钱，出了事也不担责任。车间里的工人大都心知肚明，只是不敢多说话而已。&lt;/p&gt;

&lt;p&gt;小莫的同学们上学的时候，人人都提着铁皮罐头做的暖炉，小莫的铁皮暖炉是捡回来的，一个内外都生锈的罐头盒子，有一天下课和几个男孩在操场打闹，甩着暖炉互相撞击，他那个暖炉被别人打散了架，自那之后，两个礼拜都没提暖炉。我想着我小时候上学，家里连这种暖炉都没有，别说是好看或者是新的，看着别人家孩子的暖炉就想靠过去暖暖。还好我家在村里属于本分不惹事生非的，穷，但不至于需要别人接济，我小学时候学习挺好，每次都在班里是考前五名，虽然班里也只有二三十人，考试之后整理试卷，登成绩，写学期评语都是我们这些好学生在做，但每次安排座位，我都喜欢和学习差、爱捣蛋的同学坐在一起。&lt;/p&gt;

&lt;p&gt;老莫说，儿子的手背上都是冻疮，手指头上皲裂了几道口子。所以他才想给儿子做新的暖炉。老莫在厂房里找了一个油漆罐头，刮干净了里外的漆皮，把罐头上的广告漆也磨掉，锃光瓦亮的反着光。铁皮罐头下面隔着一层网，网下面是放炭火烧成的灰，网上面是炭火，燃烧炭的地方罐头四周戳着孔眼，老莫认真的规划排布着这些孔，尽量的让它们有规律的交替。&lt;/p&gt;

&lt;p&gt;老莫把油漆罐的把手也改造了，不像是别人家孩子那样只能用线绳提着，他在线绳上穿了一副把手，可以更方便地提着暖炉。&lt;/p&gt;

&lt;p&gt;老莫儿子小莫，脾气和老莫一样，沉闷而胆小。第一天提着父亲做的暖炉上学，被同班的男同学看见，围着他的新暖炉看，羡慕着他的暖炉好，光亮，小莫也是不做声，只是提着暖炉放在课桌斗里，双手捂着也不愿让人看见。下课铃响了，班里几个男生问他今天怎么不出来玩了，敢不敢用&amp;gt;新暖炉和他们打架。小莫不愿意出来，不想自己这么光亮的新暖炉和他们互撞，他几乎是被两个比他还瘦小的同学拖着拉了出去。&lt;/p&gt;

&lt;p&gt;小莫的暖炉在手里一震，暖炉的把手就断了，被抛出去很远，摔在地上，呼噜的从学校操场滚到地棱下面。这时候上课铃响了，小莫不顾上课，跑到地棱下面，在山坡的沟里找自己的暖炉，坡底没什么树，也没什么&amp;gt;草。远远地小莫就看见了自己的新暖炉。跑下山坡看到暖炉里也没剩一点碳火，而且铁皮罐头还凹陷了一角。小莫从坡底爬上来，等回到教室，早已经上课十多分钟。&lt;/p&gt;

&lt;p&gt;小莫没敢进教室，寻思着自己的座位在边上，老师看不到他不在，也就不管他了。他走出学校外，在校门口一边的墙角蹲坐着，手里还提着自己的新暖炉。可是早已经没了炭火，要不是有太阳晒着，他早就冻得受不&amp;gt;了。终于挨到了这节课后，他回到教室的座位上，才知道这节是数学课，还好老师也没有发现他不在。&lt;/p&gt;

&lt;p&gt;就在小莫在位置坐定没有几分钟，教室外传来同学们的喧闹声。“着火啦，着火啦。”“坡堎上的树着火了！”小莫冲出教室，在教室门口就看见操场的地堎下冒着烟，就是刚才他从那下面爬上来的地方。有同学紧忙叫&amp;gt;来了在二楼办公室的老师，提着铁桶就去厕所外的水龙头。接水，让几个高年级的同学从班里拿来铁桶也来接水。水龙头本来水就很小，这些天天冷半夜会冻住水管，水管的水就这么小股小股的流，还好也没多大的火。&lt;/p&gt;

&lt;p&gt;老师提着水，浇灭了地堎下的干草，泼灭了这颗被点着的树。&lt;/p&gt;

&lt;h3 id=&quot;第五节&quot;&gt;第五节&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
星期五晚上，老莫骑着自行车回家了。自己在家吃了饭。吃完饭后，擦干净了饭桌，老莫把家里的啤酒拿出来，叫老婆瓜子也抓了几把放在碗里，搁在饭桌上。&lt;/p&gt;

&lt;p&gt;老莫和老婆分别坐在桌两边的小板凳上，沉默着相互不说话。等了半个小时，老莫老婆终于开口说话，咱们为啥要给他上酒，上酒不就意味着咱们做了大错，请求原谅吗？咱们已经准备要给他赔钱了，就是要他来这里说事，吃瓜子聊事就行了。老莫默默还是没说话，老莫老婆把两瓶啤酒取走了。等了20分钟，铜娃还是没来，夜色已经全部覆盖了，风在屋外，吹着门口的杨树叶子莎莎的响。桌子上一碗瓜子，老莫没有嗑一个，老莫老婆也没有动。老莫手里捧着的一瓶浓茶，喝的只剩茶叶底，还时不时端起到嘴边，喝最后的杯中水，不愿起身倒水。老莫老婆有点不耐烦了，说好的吃完饭就来了，这都等了一个多小时，咋还不来。人家说吃完饭，没说咱们吃完饭，人家家里吃饭晚了点。等啊等，让咱等这么久，还给他们吃瓜子，又不是过年，吃个屁瓜子。说着就端着瓜子碗往隔廊走。人家好歹村长也来呢。说着的功夫，老莫老婆都已经进了门里，老莫也并没有起身。&lt;/p&gt;

&lt;p&gt;又过了十分钟，7点半，铜娃和村主任来了，老莫老婆笑脸相迎，老莫的男孩小莫躲在隔廊里，听着外面大人的声音。&lt;/p&gt;

&lt;p&gt;老莫叫主任和铜娃都坐下，竟然沉默了下来，没人开口说话。村主任先说了：“老莫，你家的小子把学校坡底下的核桃树点着了，这树是这我们村铜娃的，去年开始挂的果，现在就这个事情，咱们商量一下。”&lt;/p&gt;

&lt;p&gt;老莫问：“你说赔你多少钱？”&lt;/p&gt;

&lt;p&gt;铜娃：“这棵树是离我家最近的核桃树，以后还靠着它，夏天卖核桃赚钱。“&lt;/p&gt;

&lt;p&gt;主任：“怎么说，这树死了？”&lt;/p&gt;

&lt;p&gt;铜娃：“我说，这树一定是死了。”&lt;/p&gt;

&lt;p&gt;老莫：“烧了一点树梢子，我也看过你那棵树了，我家里也有核桃树，那一点少了能让树死了？”&lt;/p&gt;

&lt;p&gt;铜娃：“咋不死，人少了一半的头还能活吗，何况是树。”&lt;/p&gt;

&lt;p&gt;老莫：“哪能给人比，树的生命力多强，今年你看着还干枯着，等着明年就发芽长绿了。”&lt;/p&gt;

&lt;p&gt;村长在一旁也没有说话的空档。&lt;/p&gt;

&lt;p&gt;老莫说：“不然就是我家的这棵核桃树给我，我家的那棵给你，反正都是同一年栽的。”&lt;/p&gt;

&lt;p&gt;铜娃：“我要你屋的核桃树干啥，你家的树离我家多远，没等我去打核桃，不知道都被谁都偷着打完了。”&lt;/p&gt;

&lt;p&gt;主任：“铜娃过来前，也给我说了，我之前也给老莫把话带到了，咱们说现在是谁的责任也无济于事，各有各的难处。我们商量目的就是看怎么赔偿，赔多少钱。”&lt;/p&gt;

&lt;p&gt;老莫：“100块，不可能。”&lt;/p&gt;

&lt;p&gt;主任：“咱这不是也正商量呢吗，赔多少合适，也就是个数字。”&lt;/p&gt;

&lt;p&gt;老莫对着铜娃说：“你这树要是死了，我们还可以给你补钱。要是没死，难道你还会给我们退钱吗？”&lt;/p&gt;

&lt;p&gt;铜娃：“咋可能没死，要是真没死，我还真把钱给你全还了。”&lt;/p&gt;

&lt;p&gt;老莫：“你要说这话，就是胡搅蛮缠。我给村长之前说的是30，我现在说最多给50块。赔你半棵树，你说的烧了半棵，咱们就按你说的来。这不可能再多了。”&lt;/p&gt;

&lt;p&gt;铜娃：“那我这树要是死了，明年结不上核桃。你给我50，那不是亏了吗，我50块钱领一棵死树？”&lt;/p&gt;

&lt;p&gt;最终老莫同意给70块，算赔给了牛娃，他也给主任说，这两天家里没这么多钱，等过两天结了工资，托主任给铜娃送去。铜娃一开始还不答应，看着从中有主任在中间当见证人，也就答应了，事情总算是有个了结。&lt;/p&gt;

&lt;p&gt;二田他家离我们县城很远，我们骑车子走了半个小时，然后又推着车子走了半个小时，然后又骑着车子半个小时，才到他们村。他们村整个都在一条沟里，山沟的阴面，前些天下的雪还都没有化。一家家房子都散布在山沟里面，从粱上向下看去，星星点点的也几户人家。不像我们村还好点，至少村里几户几户的一层层并排地建在坡棱上。&lt;/p&gt;

&lt;p&gt;二田和我把自行车放在梁上的商店里面，那商店是村里人家开的。我们就徒步往沟下面走，一脚深一脚浅，我一直没问二田给我指，哪里是他家，走到沟底最深的地方，终于是到了，他要是一直都不开口说“就是这个了”，我真以为我们要走到山沟对面去了。&lt;/p&gt;

&lt;p&gt;二田他家是土坯房。我们下去的时候，从家里后院的地棱绕下去。家里后院是个柴棚，还有一个用玉米杆搭成的茅厕，我们这里，叫水茅化。遮遮掩掩，影影绰绰，从外面看得见里面，从里面也看的见外面。里面是人蹲的地方，外面就是一个坑，敞开着里面什么都有，现在已经被冻住的和土成为一体了，坑旁边放着暗红色的一个塑料桶。&lt;/p&gt;

&lt;p&gt;在门口，踢了五分钟的鞋，终于把鞋底、鞋面上粘的泥剔掉了。&lt;/p&gt;

&lt;p&gt;我走到二田家里面，只有灶台和炕中间的白炽灯亮着，却也完全照不亮房间，厅中间的柱子，房顶的梁木，都被常年的烟熏得黝黑发亮。二田的奶奶正在烧火，看见二田回来了，也看见我，一回头，呵呵的笑着，“赶紧上炕坐着去，看把我娃冻的，回来路上冷吧。”&lt;/p&gt;

&lt;p&gt;我和二田坐上炕，老奶奶把炕烧的很旺。&lt;/p&gt;

&lt;p&gt;二田的奶奶开始在灶台上做饭了，炒土豆丝和白菜炖粉条，两个菜。我知道可能平常她平常都不吃这两个菜吧，不过我什么客气的话也没有说。和二田坐在炕上，我背靠着一侧的背墙，背墙上贴满了报纸，报纸上又贴了两张年画。一张去年，一张是今年的，塑料纸的。今年的年画是财神爷捧着金元宝，两边站着一男一女的散财童子。红扑扑的脸，胖嘟嘟的身，一边手持“招财进宝”，一边手持“财源滚滚”的对联。另一张年画，去年的，是伟大领袖毛主席。&lt;/p&gt;

&lt;p&gt;时间已经过得久远，毛爷爷也应该在这里注视了将近两年了，上面的一角已经翻开耷拉下来。翻开的那一面落满了厚厚的一层灰，我尝试着把一角掀上去，可因为落上了做饭产生的烟，已经不能粘在墙上了。不过，正面的毛主席依旧面色红润，历久而新。&lt;/p&gt;

&lt;p&gt;我靠在这面墙上，刚好头就在财神爷的男童子的两腿那里。我竟然感觉有点不舒服，颠着屁股向右边挪了挪，头放在毛爷爷的领口的正中心。坐在买主席的年画下面，突然感觉比刚才更暖和了一些，看来，毛爷爷的待遇比财神爷还要好，刚好就在火炕的烟道上面。&lt;/p&gt;

&lt;p&gt;二田奶奶问我，菜做的怎么样。我说特别好吃，就跟我妈妈做的一样好吃，几乎一样的味道。其实我想说的是，同样的少油多盐。尤其是土豆丝搭的这葱，太好吃了，太有味道了。我们家菜地也种了葱，但是可没有你们种的好吃啊。二田奶奶又一笑，我又单独夹了一段大葱，放在嘴里嚼得很有味。&lt;/p&gt;

&lt;p&gt;“哈哈，这葱就是用咱自己水茅化浇的！”二田奶奶说。&lt;/p&gt;

&lt;p&gt;我停顿下来，脑海里突然地就闪现了刚才一些画面，影影绰绰的玉米杆，冰冻的大坑，深红色的塑料桶。几秒后，我才开始又嚼起来，然后，那段葱我自己嚼了很久，味道也更浓了。&lt;/p&gt;

&lt;p&gt;二田告诉我，他的奶奶，一天做两顿饭，但是，从早到晚的时间，不是围着锅灶转，就是在柴房拾掇。早上起来在锅上烧水，开始熬稀饭，托热馍馍。等吃了早饭，没过多久就要开始准备中午吃什么，下午的饭大概到三点才能吃下嘴，奶奶吃完饭就已经4点。除了这些时间，就是看管她的鸡和羊，以及她勤于浇灌的菜园的菜了。&lt;/p&gt;

&lt;p&gt;二田奶奶的牙掉光了，却不喜欢戴假牙，一副假牙总是躺在炕头的水杯里。现在她也不习惯戴着了。上下嘴唇向内侧凹陷下去。有时候嘴咧开的时候，我能看到整个牙床，都已经被磨成了光滑的整体，就像是一块被打磨过的肉色的手镯的一部分一样。每次我不留神的看到奶奶夹菜、张嘴吃菜的时候，总是不由得想用舌头顶顶自己的下牙床。二田奶奶吃饭很慢，来一口菜，需要很长的时间才能把它们咀嚼完。我一开始没有注意到这一点，吃得很快，都已经吃到一半，才发现了这一点，因此放慢了速度。&lt;/p&gt;

&lt;p&gt;二田的奶奶问我是不是和二田在一起做一样的活，她让我们相互帮忙。问我在哪个村，问我家条件怎么样，问我父母都是做什么工作的。我告诉他都挺好的，父亲在外面打工。我还告诉她家的二田可以考上大学，可是怪学校太坏了，不给他这么有用的人学习的机会。二田的奶奶回答我，没事，现在不也能在你们厂里做活，挺好的么，能赚到钱，把自己先包住就好了。&lt;/p&gt;

&lt;h3 id=&quot;第六节&quot;&gt;第六节&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
从二田家里回来的第二天，县城里里的雪也下地一场接一场。厂里的空地和草坪被雪覆盖连成了一大片，没有了界限。厂里的工人也没人走到了雪地里，好像没人愿意打破这完整的，洁白的雪地，只有靠墙的一人多宽的路，被脚印踩得实实的。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gallery/1989/1989_04.webp&quot; alt=&quot;1989_04&quot; /&gt;&lt;/p&gt;

&lt;p&gt;夜里，熄灯睡觉的时候，外面的雪花看起来越飘越大了。雪跟着呼呼的风吹，透过厂房一侧的白炽灯，飘散的雪花一会聚拢一会又分散，前赴后继的向地面坠落。厂房宿舍都熄灯了，只有厂房外面的白炽灯还亮着。我躺在自己的床上，都能借着这点光看到窗外的雪。雪越下越大，雪花大片大片的向地面砸。我都隐约能听到外面簌簌坠落的雪的声音。随着风吹的力量与方向的变化，声音也有变化。&lt;/p&gt;

&lt;p&gt;刚刚睡下没多久。“轰”的一声，惊醒了大通铺里的所有人，宿舍的灯亮了。很快我们就知道，是锅巴线的厂房的房顶塌了。老莫是锅巴线在宿舍住的领头，他叫上我和二田，还有另外我们车间的几个人，赶忙地跑过去。还好我们宿舍离厂房并不远，锅巴线厂房的顶棚，塌陷了一块下来，雪也很快的灌注到厂房里面。两块石棉瓦断裂着掉在半空中。四周更多的雪滑落下来，断裂的石棉瓦承重更多了，随时有可能整体坠落。而它下面正是锅巴机的出货口。&lt;/p&gt;

&lt;p&gt;老莫让大家赶紧手动把断裂的石棉瓦卸下来，不能让它们掉落下来砸了机器。几个人上梯子，抬着，卸掉了石棉瓦。两片石棉瓦卸掉之后的将近8、9平米的孔洞，开始飘着大雪。抬头看时，都已经被雪花大得睁不开眼睛。可是却找不到可以更换的新石棉瓦了，找遍厂房都没有找到剩余的石棉瓦。&lt;/p&gt;

&lt;p&gt;最后只能找到一块很大的编制网的塑料布，还有一个防晒网。两个重合着覆盖到缺口的地方，但是雪还是疯狂得下着，很快也就积满的整个塑料网编织袋从中间开始下沉。老莫让我把厂办的一根长竹竿拿来，顶了顶编制网的中心，把雪抖到四周去，雪还是没有要停的意思。眼看着则编制塑料也快要撑不住了。老莫决定几个人轮换着上梯子撑开塑料布上厚厚的雪，将雪抖到旁边的石棉瓦上去。就这样，我和二田、老莫三个人驻守在锅巴线车间，每隔一个小时就需要爬梯除雪。&lt;/p&gt;

&lt;p&gt;车间里堆着柴油，不能生火。太冷了，实在太冷了。老莫脑袋一沉，然后站起身来。“不行，我得去厂办公室里拿棉袄，来，二田，你跟我到长办。”于是，我在车间等了10多分钟，就看见老莫和二田穿着军大衣，二田手里拿着一件回来了。我猜这军大衣是厂里厂长、副厂长、和调度三个人的衣服。我看见二田穿的这身胸口有块地方是被烟烫一个小洞，而这衣服，常常是厂长在厂里巡视时穿的。我们就这样靠着车间的一侧边聊着边喝着热水。终于，大雪在后半夜的5点钟，终于小了，慢慢地也不下了。&lt;/p&gt;

&lt;p&gt;难得的冬日暖阳，洒在厂区的水泥地上，一排排工人圪蹴在厂房的墙根下。一个一个端着洋瓷碗的糊汤面。我一早起来，已经到了中午12点，工人们都端着饭在外面吃饭。&lt;/p&gt;

&lt;p&gt;凛冽的风吹过连绵的山沟，呼呼的直向人的帽子里，衣服里钻。天空中下着大雪，覆盖了整个去县城的大路。我这周回来时只能把车子放在厂里，走着回家去，现在也只能走着去厂里。路上也见不到一辆车、一辆摩托或者其他什么可以机动的车。走路和推着自行车的人，沿着大马路的右边，向着县城进发。每周末的下午，去县城的人可多。&lt;/p&gt;

&lt;p&gt;厂里因为锅巴组厂房顶倒塌的缘故，我们组停工了一天，我上周也就提前回去了一天，可两天下来，除了在家里的火炕上睡了两天之外，就是去后院的茅厕上了三次厕所， 或许是四次。&lt;/p&gt;

&lt;p&gt;也是因为锅巴组厂房顶倒塌，老莫第一时间组织补救，以及在厂房里驻守了一整夜，未给厂里带来巨大损失，厂里的领导表扬了老莫，还给他发了50元的奖金。另外，厂长在厂区穿的军大衣也送给了老莫，老莫觉得脸上很有光，见人都能听到他们对老莫称赞与寒暄。老莫带我和二田去下馆子，吃了一顿饺子。饭间，我问老莫听说厂长还把他的军大衣送给你了，怎么没见你在厂里穿着呢。老莫说，军大衣他不敢穿，那衣服胸口的香烟烫出的小洞还挺明显的，穿出来，大家都能看得出是厂长的大衣，所以他把那衣服拿回到家里了。&lt;/p&gt;

&lt;p&gt;下午，天空又阴沉了下来，盐粒似的雪慢慢开始下。在一层冰冻的雪上了覆盖了新的雪。风也开始吹的急了。吹得雪粒慢慢地变成了簌簌的雪花，也就慢慢的一层一层地着在地上，着在厂区中间的草坪上。目之所及，天空、屋顶、松树，白茫茫的又成了一片。&lt;/p&gt;

&lt;p&gt;锅巴线今天这周第一天开工，所有的人都到了，工作任务不多，所以车间里冷冷清清的，只有机器周而复始、百无聊赖的转着。线上只有三个人在盯着，其他的人都在里面的有煤炉的小房间里，抽烟的抽烟，喝水的喝水。&lt;/p&gt;

&lt;p&gt;厂里来了几个重庆人，重庆人是来找在我们长水晶饼线上工作的两三个重庆老乡的，他们说从没见过这么大的雪。也从来没有见过用雪堆成的雪人，他们问我们为什么不出去玩雪。把这些雪扫起来，或者堆成雪人，他们说在别人的照片里看见过大雪，以及和人一样高的雪人。我们厂里的三四十岁的人都不愿出去，觉得太冷了。于是，只有我和二田和他们，以及他们的孩子们一起在院子里推雪球。雪和水混合着裹在一起，不一小会，两人合力推出的雪球就有半米多高。然后众人又将两个大雪球推在一块，搭在一起。用报纸、木棍和树皮给雪人做了帽子、鼻子和眼睛。雪人矗立在厂区“进入厂区，禁止吸烟”的标牌旁。和一米多高的标牌竟然差不多高。那雪人，比较丑。丑丑的站在那里，一动不动。&lt;/p&gt;

&lt;p&gt;这些重庆人今天在县城待一天，明天他们就要回重庆了。他们几个带着孩子在西安的工地工作，因为连续的下雪停工了快半个月了。可能到明年过年来的春天，他们还能再回来正常工作。二田向他们问了很多，关于重庆的，关于在西安做工的。&lt;/p&gt;

&lt;h3 id=&quot;第七节&quot;&gt;第七节&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
矗立在草坪一角的那个雪人，静静地被风吹着，未见一点消融。鼻子和眼睛都已经脱落，掉在地上，三个小坑留在脸上。天空阴沉的厉害，直到中午也没有亮堂起来。整个厂里，或者整个县城，安静的似乎什么声音都没有，即便你出门，向天空，向地面喊一声，也很快被稀薄空气和蓬松的雪地吸收了，又恢复了该有的安静。&lt;/p&gt;

&lt;p&gt;老莫还是和往常那样，带着我们在锅巴线上工作，年底的工作总是忙，老莫说今年提前了半个月就进入了繁忙的阶段。但不管怎样，所有的订单到时候都能完成。&lt;/p&gt;

&lt;p&gt;锅巴车间里的顶棚，新换的两块石棉瓦与周围的旧石棉瓦差距很大。这次厂里面只买了很少的备用石棉瓦，老莫说，厂领导决定明年春天开始重新用土木砖瓦修复厂区的所有顶棚。&lt;/p&gt;

&lt;p&gt;星期二的晚上，我突然感觉肚子中空空的，回想自己下午吃了什么。这才想起来，下午的时候，我把从食堂领的一个大馒头放在锅炉房的火炉口，晚饭可以就着白菜稀饭吃烤馍。但吃饭的时候却忘了拿出来，我想去看看馒头现在还在不在。走去锅炉房的路上，心里想着即便是馒头还在，恐怕也已经被烤成黑炭。&lt;/p&gt;

&lt;p&gt;锅炉房在厂区的西北角，夏天时候，锅炉房基本上不开，但现在每天从早烧到晚，给工厂车间，办公室供暖。平时车间人都在的时候，我们就会到锅炉房里转一圈，工人们总是喜欢三三五五聚集在一起抽烟、谝闲传。锅炉房的西边是一栋二层的楼房，南北纵向的延伸到锅炉房门口。&lt;/p&gt;

&lt;p&gt;跟锅炉房晚上值班的师傅打了声招呼，从火炉口拿出了了烧黑了一半的馒头。走出锅炉房门，一边掰下黑炭的烤馍丢到雪地里，一边吃着另一多半的馍，还是有浓重的焦炭味道。&lt;/p&gt;

&lt;p&gt;路过锅炉房西边的两层楼房，透过窗户，借着对面昏暗的灯光，我看到了三个人，在对面后排的窗户口徘徊。车间的大理石板上，映着他们来来去去的影子。我立刻意识到，这就是老莫和他的偷卖面粉的集团。我甚至可以根据影子，分辨出来哪一个是低矮微胖，平头的老莫，哪一个是身材瘦长的锅巴线原料库负责人，和另一个我不认识的人。他们每个星期都把一些面粉慢慢从库房转移到这里，一个月攒多了再整体卖出去。我看到他们已经把两袋面粉装到后门口的三轮车上。从这侧看了十几秒钟，我便匆匆离开了。回到宿舍前，手中的馒头也吃完了。&lt;/p&gt;

&lt;p&gt;第二天一大早，八点的开工铃声响起没多久，车间外传来争吵和嚎叫的声音。锅巴线和水晶饼线的两个工人打架了，打架的人不是普通工人，而是两个车间的原料库的两个负责人。最终两个负责人在厂房面粉仓库里扭打起来。倒在面粉袋子上，身上，脸上全糊满了面粉。两个人，从仓库里打到仓库门外，又倒在门外的雪地里，又是身上，脸上全糊满了雪。打到外面的时候，两边的工人们才看见。&lt;/p&gt;

&lt;p&gt;打架的原因就是因为抢面粉。今年水晶饼线上的面粉需求很大，但锅巴线上也有些供不应求。厂里新进的面粉，需要两个车间申请领用。锅巴线这次申请的500斤的面粉，新进的面粉只有1500斤。本来是可以够锅巴线领用的，可剩下来的1000斤面对于水晶饼车间申请的2000斤还是显得太少了。水晶饼线负责人说，应该按照申请的比例分配面粉，水晶饼线领1500斤中的1200斤，锅巴线领剩下的300斤。&lt;/p&gt;

&lt;p&gt;为了现在的200斤面粉应该先给谁，两边互不相让。&lt;/p&gt;

&lt;p&gt;老莫和车间主任一起偷卖面粉的合作关系，被别人抢了去。告发这个消息的人是水晶饼线的仓库主任，也就是前两天和锅巴线上仓库主任打架的人。&lt;/p&gt;

&lt;p&gt;厂长知道这件事情后，并没有感到惊奇，没有大张旗鼓的处理这件事。只是把老莫叫到厂办谈了一个多小时，至于说什么内容就不得而知了，但是老莫回到车间线上时，也是满脸的严肃和沉默。&lt;/p&gt;

&lt;p&gt;车间里的所有人，厂里面的大部分人都知道老莫偷卖面粉，也都知道他卖面粉是和锅巴线车间主任分成销赃的。大家都记在心里，但是从不说出口。一方面是觉得车间主任是老员工，做什么事情恣意一点没什么可说。老莫本身是一个老实人，家庭压力大，收入却很少，没有功劳也有苦劳的工作了十多年，从厂里揩点油水也就没什么了。可偏偏跟水晶饼线上的人闹了矛盾，本来也是没多大事。但是打架的两个人互相不服气，最后为打架而打架，相互憋着劲。水晶饼线的仓库主任也有上级，事情发展到现在，成了两个上级争利益的事情。最终的结果就是，锅巴线偷买面粉的事情被发现，而且被工人检举了。老莫以后不能参与仓库进出货，锅巴线的的仓库主任降职，位置空缺。实际上水晶饼线上的主任还是会偷卖，只不过他有保护伞，不怕别人告发，或者说，告发了其实也没什么用。&lt;/p&gt;

&lt;p&gt;老莫这几天上班看起来也闷闷不乐。跟我们车间的主任好像也有了嫌隙。也基本上不去厂房对面的办公室里坐了，往常这样的阴雨雪天气，老莫有时候在那里一待就是半天的功夫。车间主任来了锅巴厂房也是一句话都不多说，依旧端着他的搪瓷杯子，走来走去，并不知道他们为什么东西而转。我和老莫一起工作，还是像往常那样打招呼，可心里面多一点谨慎。晚上，我在吃完饭回宿舍的路上，和老莫一起走。聊着聊着，老莫突然说了一句：“我觉得待在这个厂里不开心。”&lt;/p&gt;

&lt;p&gt;我当时一愣，脑子里想着，这和老莫偷买面粉的事情有什么关系，我脑海里突然快速的闪过前几天晚上厂房后门的灯光，以及三个晃动的人影。&lt;/p&gt;

&lt;p&gt;腊月来了，盼望着的农历新年要来了。厂里的新订单也来了，预订水晶饼的人多，过年买锅巴的人也多，锅巴线的工人上班时间也没闲着，虽然还是只开了一台机器。老莫说，厂里今年也如同往年那样的繁忙。&lt;/p&gt;

&lt;p&gt;12月29日，星期五。&lt;/p&gt;

&lt;p&gt;窗外是灰蒙蒙一片，机器依然在百无聊赖的转着。&lt;/p&gt;

&lt;p&gt;老莫的手被末端的滚轴夹住了，但是机器还在运行，一瞬间，几乎把整个小臂全部卷到两个滚轴里面。手臂活生生的夹在只有锅巴那么厚的滚轴里。&lt;/p&gt;

&lt;p&gt;刚出来的锅巴上，沾满了全是血迹，我几乎不能想象，血肉模糊的手臂怎么被一团衣服包着，外面还衬着报纸。厂里唯一的一辆车，军绿色的中号卡车，拉着老莫去了医院，我和车间主任骑着自行车去老莫家里，叫上老莫老婆，老莫老婆疯了一样的冲到县医院。&lt;/p&gt;

&lt;h3 id=&quot;第八节&quot;&gt;第八节&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
过去了半个多小时，老莫被送到了县医院，手臂上的血浸透了毛巾和报纸，在卡车的前排座椅上，地板上流了很多。&lt;/p&gt;

&lt;p&gt;县医院的血库里面没有血了，准确的说，县医院的血库这半个月早就没有可用的血液了。老莫的血型是O型血，医院所剩的O血存量非常少。而且时间过去很久，血液早已经不能使用。医生看老莫失血过多，让我们尽快将他转院到西安。厂里的领导问医生，可不可以让工人们来献血，医生说，血型要必须是O型，而且验证这些血能用，献血人必须没有隐藏的疾病，采集的血液也不能直接使用，必须经过一系列的处理才能使用，即便是现在就开始采血，估计到明天才能供上血，还是早点转院到西安的大医院比较好。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gallery/1989/1989_05.webp&quot; alt=&quot;1989_05&quot; /&gt;&lt;/p&gt;

&lt;p&gt;厂里的卡车又一次狂奔在去城里的路上，中间一段到“老牛坡”的路一向很难走，路面崎岖颠簸。终于把老莫搬到了唐都医院，但不幸的是，失血过多，等连上输血管，人已经昏迷，几乎快不行了。匆匆忙忙地用担架抬上了抢救的一楼病房，很快的用上了呼吸仪和输液器，但手臂的血仍然外流不止，流出来的血又不能直接回输，输入的血还没有手臂流出的血多。&lt;/p&gt;

&lt;p&gt;老莫的手臂完全被卷机夹住，并卷入机器里面，一直到小臂的中间，都被压扁了。医生们一时也想不到好的办法处理和止血。想着只能能从胳膊肘的关节处截肢。兴许是现在能保住命的唯一办法。很快就和老莫老婆达成了截肢的处理方式，关于手术失败和其他意外的情况，老莫老婆也考虑清楚了，并签了字。&lt;/p&gt;

&lt;p&gt;我和几个工人，在医院一楼的外面等着手术，但，没等多久，手术就结束了，老莫被推出来了，失血过多，死了。&lt;/p&gt;

&lt;p&gt;本来是想用医院的救护车拉回到村里的，但是一个写着“急救120”的车。急救车拉着病人不去医院，而回村里去，让人看见了未免也不合适，最后，我们只能联系一辆小面包车紧忙得把老莫往自己村里送。&lt;/p&gt;

&lt;p&gt;拉着老莫尸体的小面包车，飞速的踏上回乡的公路上，老莫手上还插着输液的点滴，众人抬着老莫到家里，嘴里还喊着“老莫，坚持住，到家了，到家了！”村里人惊愕的看着飞驰的面包车，才知道是老莫没了。村里人大概都知道是什么一回事，大概就是人死了装做人还活着，只是都不说罢了。在外面死了，断气的人是进不了村的，也不能埋到村里祖坟里。&lt;/p&gt;

&lt;p&gt;我父亲是两年前去世的，那时我十六岁，刚上高一。父亲在我10岁的时候，就进城打工了。只有农忙的夏末才回家，还有冬天过年的时候会在家十多天。&lt;/p&gt;

&lt;p&gt;有一年过年，我父亲给我买了新衣服，一身蓝色的运动套装，化纤材质的。我喜欢的不得了，初一上午天还没亮，就穿在身上，穿着新鞋，在床上踏来踏去。那件衣服穿着很漂亮，但是走起路上，衣服摩擦的“莎莎”的响个不停。别人都说我，背了一堆“柴”。&lt;/p&gt;

&lt;p&gt;父亲有时候脾气很暴躁，我小时候没少挨过他的打。但我很庆幸的是，小时候我犯的重大错误的时候，他都没有在身边。因此有他在的不多的几次挨打，我记忆都非常深刻。&lt;/p&gt;

&lt;p&gt;我12岁那年的夏天，和隔壁家的孩子，他是比我还匪的孩子。我们去玉米地里偷玉米，拿着衣服包着四五个玉米棒子，回来的路上碰见了他家大大的小儿子，5岁多的小娃儿，也跟着我们。我们到村里山沟最下面的一排房子，找了一家人的麦子秸秆堆，背对着那家房门，就在秸秆堆后面的小坡上烤玉米。&lt;/p&gt;

&lt;p&gt;夏天的麦秸杆被烘烤的非常干燥，我们刚没点着多久，飘起的火苗带着烟就往麦秸堆飘。没烧完全的一些麦子秸秆灰，飘到上面，引燃了秸秆堆，当我们发现时，那秸秆堆已经开始冒烟了，迅速的起火。看着大事不妙，我和隔壁孩子赶忙抱着烤好的玉米，已经不是我能控制的火势了，我们抛下没烤的玉米，以及那个5岁的孩儿，然后跑了。&lt;/p&gt;

&lt;p&gt;在跑开的最后一刻，我大声告诉那5岁娃，让他跑上去给大人们说底下的秸秆堆着火了，叫人下来。我们跑出去几十米，就发现带着玉米跑是多么愚蠢的决定，不是因为抱着东西跑不动，而是这样直接告诉别人我们就是烤玉米的人。&lt;/p&gt;

&lt;p&gt;等我们跑上山坡的时候，看见麦秸杆堆已经开始冒着很大的烟了，几个在我家门口的大人都跑下来救火，也都知道了我和隔壁孩子在这里烤玉米的罪行，我父亲也被叫到了山坡底下。&lt;/p&gt;

&lt;p&gt;我父亲，知道我是主谋，远远的看见我在半山坡上，顾不得救火，非常愤怒地拿着铁锨就向我跑过来。可谁让我那么聪明，我看着他跑来，也并不着急逃跑，我知道等他离我近了，他跑上半山腰，就累了。我再用力气向上走，果然，等我开始跑的时候，他看我又开始跑了，他明显慢了很多。边跑还一边破口大骂。&lt;/p&gt;

&lt;p&gt;”你个狗湿的，跑，跑你妈的屁。你再给我跑，再跑我打断你的腿。耐球的！”&lt;/p&gt;

&lt;p&gt;父亲并没有放弃抓我，也跟着我跑上了山坡。在山坡上，我们沿着坡顶的路跑了很远很远，他也没有放弃手中的铁锨，父亲是真想拿手里的铁锨拍我啊。太阳斜斜的照在山坡，映着对面坡上的树，草和几只山羊。每次我回头都能看见父亲黑黑的额头和脸，以及上面闪烁的汗珠。&lt;/p&gt;

&lt;p&gt;我和父亲把村子从坡顶绕了整整一圈，然后再下来，他也没有抓住我，然后，他先回家了。当天晚上的打，真的很疼，但现在我已经忘了。&lt;/p&gt;

&lt;h3 id=&quot;第九节&quot;&gt;第九节&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
那一年，也是下着大雪，我和母亲一起去参加我表姐的婚礼，来的时候还是大晴天，走的一路，翻山越岭好几道山沟。但是，回家的时候，雪开始下的特别大，大路小路上也都没有车，我们继续走回家。&lt;/p&gt;

&lt;p&gt;脚一下又一下埋到深深的雪里。不知道下一脚有多深有多浅，会不会踩空到沟里，风雪下过一夜，雪花一片一片的累积着，山上山下也分不清了，树上也落满了沉甸甸的雪，压弯了树枝。&lt;/p&gt;

&lt;p&gt;还是我们来时的那几个人，我的母亲和表妹走在最前面，母亲让我们尽量踩她踩过的地方，踩她们走过的的脚印。雪月下越大，越积越多，大片的雪花倾斜的打在脸上，风呼呼地吹，我们只能识别出大路的方向。&lt;/p&gt;

&lt;p&gt;到了中午，终于走到回村里的公路上了，太阳似乎也升到了最高处，透过层层的云，照在深雪覆盖的麦地上，白色的雪看着有些刺眼了，只能看见顺着公路的两排黑色的电线杆，绵延的很远很远到前面的山上。&lt;/p&gt;

&lt;p&gt;在我上高中之前，我家也养了一头牛，一头羊。我们家的牛很听话。夏天的傍晚，母亲都会去放牛放羊，我拉不动那头牛，只能牵那头羊。羊不听我的话，说它不听我的话，其实是它怕我。&lt;/p&gt;

&lt;p&gt;羊栓在我家门前时，我时不时假装捡地上的石头向它砸过去，它吓得一躲，被脖子上的绳子勒住。我有时候把它够不到的槐树枝拿到手里给它喂，它吃的最开心的时候，就会从它嘴里夺下树枝，然后抽打它的脸，它也吓得一躲，每每在这个时候，我心里总会默读一句“温水煮青蛙”。然后，我把树枝放在它刚好够不到的地方，走开。躲在一个角落里，看它是如何干瞪着槐树枝，却不能吃到。&lt;/p&gt;

&lt;p&gt;所以我家这头羊怕我，每次我牵着它放羊的时候，要么它在前面硬拽着绳子跑，要么它在后面死扛着不肯走。&lt;/p&gt;

&lt;p&gt;我挺喜欢那时候不上课的周末傍晚帮母亲放羊，山坡上，我们总是走得很远，因为越远处的草越是好，二十多米的绳子一头绑在羊身上，一头绑在锥子上，插到瓷实的地里，然后我就可以手背在头后面，躺在山坡上，看着慢慢下垂的落日。&lt;/p&gt;

&lt;p&gt;我们家隔壁壁有另一户人家，我家和他们家同门，我爷爷和他们家的爷爷是亲兄弟。两家的孩子是玩尿泥的小伙伴。我们家比他家的情况好一些。有一次隔壁叫孩子趴在家门口的大石头上吃午饭，平时那石头就是用来洗衣服或者纳凉的。&lt;/p&gt;

&lt;p&gt;有一次，妈妈和我坐在大石头上吃饭，我碗里的一根萝卜丝掉在石头上，依我妈的想法，是不让我吃掉在地上的东西的，我也就没有在意，准备用手拨去石头上洒上的胡萝卜。这时他过来，竟然抓起胡萝卜丝，吃了。我妈问他，”没吃饭吗？”他点头说吃过了。但那就是一副没吃饱饭的样子，我妈把手里碗放在石头上，拽着他的手，就往屋里走，盛了一碗汤面，让他端着和我们坐在大石头上一起吃。&lt;/p&gt;

&lt;p&gt;他的妈妈出来看到儿子端着碗在吃饭，就问是谁给的饭，隔壁的孩子吃完饭回家去了，回到家里还让他妈训了一顿。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gallery/1989/1989_06.webp&quot; alt=&quot;1989_06&quot; /&gt;&lt;/p&gt;

&lt;p&gt;我的父亲在村里的砖厂工作，我小时候经常去那个砖厂，也常常自己钻到砖厂的窑洞里玩，也帮父亲码烧好的转头。&lt;/p&gt;

&lt;p&gt;这个砖厂有些年头了，供应着附近几十公里村子盖房子用的红砖，这些年，越来越多的家庭条件好的人家已经把自己家的土坯房拆了，盖了砖房。因此，砖厂的生意也很好。砖厂就地取材，挖空了我们村旁边的一大块山坡，而它旁边是一段坡度很陡的公路，挖掉的那一块与公路相比，越来越成为一个大坑，走在公路右侧，就像是身临着悬崖。&lt;/p&gt;

&lt;p&gt;两年多前，我16岁，那时候刚上高一。&lt;/p&gt;

&lt;p&gt;有一天中午，我父亲很早就来工作，他在一辆搅拌车里，清理已经凝固的沙石。到下午一点多钟，其他的工人来到砖厂上班。外面的工人并不知道父亲还在搅拌车里面，电闸被一个人推上去了，搅拌车开始工作，我的父亲在车里持续呼喊了几秒钟，但呼喊的声音被机器的声音埋没，等电闸被拉下来的时候，时间早已经来不及了，搅拌车在惯性作用下又转了半圈才停了下来。&lt;/p&gt;

&lt;p&gt;我没有见到父亲最后的面容。那天中午，我大伯找了村里几个人，每个人给了一百块钱，进到搅拌车里，捡了父亲的遗骸，拼凑出了一个人形来，下午就草率地入棺，准备后事。&lt;/p&gt;

&lt;p&gt;我父亲的死算是工伤，砖厂一把给了抚恤金和丧葬费，母亲伤心得什么也顾不上，也没有找砖厂闹事，多要一点钱，出事的第三天，父亲就下葬了，送行的人只有一些关系很近的亲戚。父亲死的这么突然，有一些亲戚甚至是下葬后才知道他去世的消息的。&lt;/p&gt;

&lt;h3 id=&quot;第十节&quot;&gt;第十节&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
我回了趟自己家，每天都百无聊赖的吃了睡睡了吃。第三天下午，老莫老婆说让我在老莫下葬前一天晚上来他们家。我睡在老莫家里的炕上，听着窗外面戏班女人唱到后半夜戏。昏昏的不知道什么时候睡着了。&lt;/p&gt;

&lt;p&gt;我已经忘了自己那冰冻的双脚，风就这样吹过来，又快速地吹过去。还是一大早，送葬的队伍稀稀拉拉的，没多少人，却扯拉着近一百米的队伍，只有前面吹乐的乐人们凑在一起，一个调地吹着。我孤零零的一个人走着。其实觉得自己还挺尴尬的，因为大部分人其实并不知道我是谁，是老莫的什么人。&lt;/p&gt;

&lt;p&gt;老莫的儿子小莫也穿着白大衣，跟在前面的他大大后。最前面还有四个端着匾额、白酒、果盘的人。妇女小孩子们排在队伍的最后，缓慢地在后面走，小雨拽着妈妈白大衣的口袋，低着头，脚步快速的跟着。&lt;/p&gt;

&lt;p&gt;到老莫坟头的田梗边上，行进的人全部停下来，又唱了一通戏。这次是乐班里一个上了年纪的男人唱，我虽然是土生土长的陕西关中人，但我听不太懂秦腔戏的唱词，只言片语的能捕捉一些词，连不起来，也不懂意思。这乐师的嗓音粗狂沙哑，在一声声撕扯中，黎明就像猛的被划破，天色也缓缓地变白了。&lt;/p&gt;

&lt;p&gt;老莫家的祖坟在一处陡坡上，距离家里住地方只有不到五百米远。离着不远地方是都是上一辈的亲人，我听着旁边的老莫的亲戚说，这边是老莫的二娘，那个是老莫的二伯的，就像是在聊农贸市场的摊位一样。或许是在陡坡上的缘故，怕以后下大雨水土滑坡，老莫的墓穴挖的出奇的深，离地足足有三米多。我站在墓穴上面的边沿上，抻着脖子也仅仅看到了墓道口。&lt;/p&gt;

&lt;p&gt;许久，棺材已经推进去了，但几个男人却还在墓坑里没出来。老莫的棺木，在墓穴里半天怎么也放不平稳。前两天挖墓穴的时候太着急了，墓穴地砖看着是打平了，其实内侧有一角是斜着向下的。垫一页红砖太高，不垫又有点晃，最后从上地面铲了一抔土，垫在棺木一角。小莫的大大是最后一个留在墓穴口的人，他负责填墓穴口的石砖。要封砖的时候，老莫老婆嚎啕的哭声回荡在冬日的朝阳里，震着所有在场的人。还好，在这阳光下站了足够久，身子也总算变暖和了。&lt;/p&gt;

&lt;p&gt;二田也辞职了，不过他又回到了学校，重新读了高三。这一次，他没有读理科，而是换到了文科班，他原本高中就想读文科，可高一的文理考试结束后，他看看了自己文理科的总成绩，理科比文科多了三分，于是他选了理科。可他那时并不知道，比他理科成绩高的人有很多，而文科比他成绩高的人却几乎没有。&lt;/p&gt;

&lt;p&gt;所有东西的影子，在昏黄的灯光下，斑斑驳驳。四处的飘散游荡，相互交替，遮挡，然后又换去追随另外一个影子。&lt;/p&gt;

&lt;p&gt;在慌乱中选择一条道路，很可能会得到你想不到结果，那就试着走走看吧。&lt;/p&gt;

&lt;p&gt;当所有的人，和所有的事，都那么清晰的出现、发生在你面前了，你仍然可以有质疑的权利，因为那是你自己的路。&lt;/p&gt;

&lt;p&gt;这是我的1989。&lt;/p&gt;

&lt;h3 id=&quot;写在最后&quot;&gt;写在最后&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;老莫死了，将我心里最后一点，对于父亲的感情，以及所有的向往与愿望，全部带走了。&lt;/p&gt;

  &lt;p&gt;人都有缺陷，都有不堪的思想和行径，老莫也偷公有的资产，但他爱家人，爱身边的很多人，二田思想激进，他热爱生活，喜欢读书，尊重知识，但他倔强执拗，不喜欢和别人打交道。他我们要探讨这些会不会影响一个人被定义为善良的，温暖且坚定。&lt;/p&gt;

  &lt;p&gt;文学、电影等，要成为好的作品，似乎一定要有矛盾，不仅仅要有人与人之间矛盾，思想与社会现实间的矛盾，还要有主人公自我的矛盾。人物与人物间的矛盾让故事更精彩，人物内心的矛盾则让故事更深刻。那么我的文章里，主人公的自身矛盾是什么呢？&lt;/p&gt;

  &lt;p&gt;二田的矛盾在于，他想自己出去闯一闯，但是有奶奶的牵绊，他明知道这个奶奶和自己没有血缘关系，但他已经找不到世界上和他有血缘关系的人，他想让自己的奶奶快点死，但是他更不愿意失去最后一个亲人。&lt;/p&gt;

  &lt;p&gt;老莫的矛盾在于老实本分的生活着，没有任何进步，却常受到别人欺负，他想有一些改变和反抗。老莫，老莫小女儿，老莫儿子，他们都是同一个人。他们只要稍微的逾越一点点，快乐或胜利一点点，就会遭到生活的痛击。他们只是吃了野萝卜，他们只是用了新的暖炉，他们只是…&lt;/p&gt;

  &lt;p&gt;另外关于人物：我、老莫、二田，这还不够，故事主角还有我的父亲。二田只是年轻时候的父亲，老莫只是壮年时候的父亲，我在这两个身上看到了父亲的影子。他们是在同一空间、同一时间经历了一个，远离这个时间空间的“我”死去的父亲一生。这也就是为什么我第二页写的：谨以此书献给我和我的父亲。&lt;/p&gt;

  &lt;p&gt;嗨，我的读者，或许，下个故事再见吧！&lt;/p&gt;
&lt;/blockquote&gt;</content><author><name>Kell</name></author><category term="文学" /><category term="小说" /><category term="故事" /><category term="生活" /><summary type="html">谨以此文献给我所热爱的全部生活</summary></entry><entry><title type="html">Kaldi的HCLG构图过程可视化</title><link href="http://kellwang.com/%E8%AF%AD%E9%9F%B3%E8%AF%86%E5%88%AB/2020/09/28/Kaldi%E7%9A%84HCLG%E6%9E%84%E5%9B%BE%E8%BF%87%E7%A8%8B%E5%8F%AF%E8%A7%86%E5%8C%96/" rel="alternate" type="text/html" title="Kaldi的HCLG构图过程可视化" /><published>2020-09-28T17:34:49+00:00</published><updated>2020-09-28T17:34:49+00:00</updated><id>http://kellwang.com/%E8%AF%AD%E9%9F%B3%E8%AF%86%E5%88%AB/2020/09/28/Kaldi%E7%9A%84HCLG%E6%9E%84%E5%9B%BE%E8%BF%87%E7%A8%8B%E5%8F%AF%E8%A7%86%E5%8C%96</id><content type="html" xml:base="http://kellwang.com/%E8%AF%AD%E9%9F%B3%E8%AF%86%E5%88%AB/2020/09/28/Kaldi%E7%9A%84HCLG%E6%9E%84%E5%9B%BE%E8%BF%87%E7%A8%8B%E5%8F%AF%E8%A7%86%E5%8C%96/">&lt;p&gt;基于DNN-HMM的语音识别系统，需要在深度网络的推理之后外接解码来实现最后的语句识别，相关的语音识别理论基础不在此赘述，需要简单描述的是，解码实际上是得到音素状态转移的声学判决后，在一个HMM模型（H），Context Dependent Phone（C），Lexicon（L）和语言模型（G）合并的WFST（Weighted Finite-State Transducers，加权有限状态机）上进行路径寻优。WFST的基本概念和操作请查看：从WFST到语音识别。&lt;/p&gt;

&lt;h3 id=&quot;语料准备&quot;&gt;语料准备&lt;/h3&gt;

&lt;h4 id=&quot;文本语料与发音词典&quot;&gt;文本语料与发音词典&lt;/h4&gt;

&lt;p&gt;train.txt ：经过分词的中文语料&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;语音 识别 技术
语音 识别 算法 公式
作战 防御 工事
&lt;/code&gt;&lt;/pre&gt;

&lt;blockquote&gt;
  &lt;p&gt;注：（1）第一句的和第二句均出现“语音 识别”，为观察相同“语音 识别”在模型中存储的情况；（2）第二句的”公式“和第三句的”工事“输入同音异形词，它们的的音素（包括声调）序列完全一致。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;lexicon.txt：发音词典文件&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;!SIL SIL
&amp;lt;SPOKEN_NOISE&amp;gt; SPN
&amp;lt;SPOKEN_NOISE&amp;gt; sil
&amp;lt;UNK&amp;gt; SPN
语音 vv v3 ii in1
识别 sh ix2 b ie2
技术 j i4 sh u4
算法 s uan4 f a3
公式 g ong1 sh ix4
作战 z uo4 zh an4
防御 f ang2 vv v4
工事 g ong1 sh ix4
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;语言模型arpa训练&quot;&gt;语言模型（ARPA）训练&lt;/h4&gt;

&lt;p&gt;执行命令统计1元词频，获取到1元语法模型，如下所示，获得2元语法模型和3元语法模型。&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ngram-count &lt;span class=&quot;nt&quot;&gt;-text&lt;/span&gt; train.txt &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 1 &lt;span class=&quot;nt&quot;&gt;-write&lt;/span&gt; train-1gram.count
ngram-count &lt;span class=&quot;nt&quot;&gt;-text&lt;/span&gt; train.txt &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 2 &lt;span class=&quot;nt&quot;&gt;-write&lt;/span&gt; train-2gram.count
ngram-count &lt;span class=&quot;nt&quot;&gt;-text&lt;/span&gt; train.txt &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 3 &lt;span class=&quot;nt&quot;&gt;-write&lt;/span&gt; train-3gram.count
ngram-count &lt;span class=&quot;nt&quot;&gt;-read&lt;/span&gt; train-1gram.count &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 1 &lt;span class=&quot;nt&quot;&gt;-lm&lt;/span&gt; train-1gram.arpa
ngram-count &lt;span class=&quot;nt&quot;&gt;-read&lt;/span&gt; train-2gram.count &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 2 &lt;span class=&quot;nt&quot;&gt;-lm&lt;/span&gt; train-2gram.arpa
ngram-count &lt;span class=&quot;nt&quot;&gt;-read&lt;/span&gt; train-3gram.count &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 3 &lt;span class=&quot;nt&quot;&gt;-lm&lt;/span&gt; train-3gram.arpa
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;注：训练步骤详见：&lt;a href=&quot;https://wangkaisine.github.io/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/2019/08/20/%E4%BD%BF%E7%94%A8Srilm%E8%AE%AD%E7%BB%83ARPA%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/&quot;&gt;使用Srilm训练ARPA语言模型&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;构建语法模型gfst&quot;&gt;构建语法模型（G.fst）&lt;/h3&gt;

&lt;h4 id=&quot;arpa转fst&quot;&gt;arpa转fst&lt;/h4&gt;

&lt;p&gt;执行命令将arpa格式1元语法模型转换为fst格式。如下所示，获得2元语法模型和3元语法模型。&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/sine/kaldi/src/lmbin/arpa2fst &lt;span class=&quot;nt&quot;&gt;--disambig-symbol&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#0 --read-symbol-table=words.txt train-1gram.arpa G-1gram.fst&lt;/span&gt;
/home/sine/kaldi/src/lmbin/arpa2fst &lt;span class=&quot;nt&quot;&gt;--disambig-symbol&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#0 --read-symbol-table=words.txt train-2gram.arpa G-2gram.fst&lt;/span&gt;
/home/sine/kaldi/src/lmbin/arpa2fst &lt;span class=&quot;nt&quot;&gt;--disambig-symbol&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#0 --read-symbol-table=words.txt train-3gram.arpa G-3gram.fst&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;语法模型可视化&quot;&gt;语法模型可视化&lt;/h4&gt;

&lt;p&gt;执行如下命令将语法模型fst文件输出为dot格式文件：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/sine/kaldi/tools/openfst/bin/fstdraw &lt;span class=&quot;nt&quot;&gt;--isymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;words.txt &lt;span class=&quot;nt&quot;&gt;--osymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;words.txt G-1gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; G-1gram.dot
/home/sine/kaldi/tools/openfst/bin/fstdraw &lt;span class=&quot;nt&quot;&gt;--isymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;words.txt &lt;span class=&quot;nt&quot;&gt;--osymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;words.txt G-2gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; G-2gram.dot
/home/sine/kaldi/tools/openfst/bin/fstdraw &lt;span class=&quot;nt&quot;&gt;--isymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;words.txt &lt;span class=&quot;nt&quot;&gt;--osymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;words.txt G-3gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; G-3gram.dot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;注：其中–osymbols=words.txt指定了fst的输出标识，words.txt的生成见发音词典模型的构建中dict与lang文件的生成，鉴于大流程（HCLG）的统一，words.txt文件需要提前生成，请先移步3.2。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;由于默认的dot文件定义的图像大小为：size:”8.5,11”，需要改变其大小，size=“20,32”。&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vim G-1gram.dot
digraph FST &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
rankdir &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; LR&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
size &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;20,32&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
label &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
center &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 1&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
orientation &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; Landscape&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
ranksep &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;0.4&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
nodesep &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;0.25&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
0 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;label &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;0/1.4663&quot;&lt;/span&gt;, shape &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; doublecircle, style &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; bold, fontsize &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 14]
        0 -&amp;gt; 0 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;label &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;作战:作战/2.5649&quot;&lt;/span&gt;, fontsize &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 14]&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        0 -&amp;gt; 0 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;label &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;公式:公式/2.5649&quot;&lt;/span&gt;, fontsize &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 14]&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        0 -&amp;gt; 0 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;label &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;工事:工事/2.5649&quot;&lt;/span&gt;, fontsize &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 14]&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        0 -&amp;gt; 0 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;label &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;技术:技术/2.5649&quot;&lt;/span&gt;, fontsize &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 14]&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        0 -&amp;gt; 0 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;label &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;算法:算法/2.5649&quot;&lt;/span&gt;, fontsize &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 14]&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        0 -&amp;gt; 0 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;label &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;识别:识别/1.8718&quot;&lt;/span&gt;, fontsize &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 14]&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        0 -&amp;gt; 0 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;label &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;语音:语音/1.8718&quot;&lt;/span&gt;, fontsize &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 14]&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        0 -&amp;gt; 0 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;label &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;防御:防御/2.5649&quot;&lt;/span&gt;, fontsize &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 14]&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;分别编辑并保存1元，2元和3元语法模型的dot文件，执行如下命令输入图片：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dot &lt;span class=&quot;nt&quot;&gt;-Tjpg&lt;/span&gt; G-1gram.dot &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; G-1gram.jpg
dot &lt;span class=&quot;nt&quot;&gt;-Tjpg&lt;/span&gt; G-2gram.dot &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; G-2gram.jpg
dot &lt;span class=&quot;nt&quot;&gt;-Tjpg&lt;/span&gt; G-3gram.dot &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; G-3gram.jpg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;语法模型图像如下：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gallery/hclg/G-1gram.jpg&quot; alt=&quot;1元语法模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;1元语法模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;
&lt;img src=&quot;/gallery/hclg/G-2gram.jpg&quot; alt=&quot;2元语法模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;2元语法模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;
&lt;img src=&quot;/gallery/hclg/G-3gram.jpg&quot; alt=&quot;3元语法模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;3元语法模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;构建发音词典模型lfst&quot;&gt;构建发音词典模型（L.fst）&lt;/h3&gt;

&lt;h4 id=&quot;构造dict目录&quot;&gt;构造dict目录&lt;/h4&gt;

&lt;p&gt;手动创建dict文件夹，生成如下7个文件：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;发音词典文件：lexicon.txt，复制如上所述文件。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;发音词典概率文件：lexiconp.txt，即在lexicon.txt文件中词语与音素序列之间添加1。&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;!SIL 1 SIL
&amp;lt;SPOKEN_NOISE&amp;gt; 1 SPN
&amp;lt;SPOKEN_NOISE&amp;gt; 1 sil
&amp;lt;UNK&amp;gt; 1 SPN
语音 1 vv v3 ii in1
识别 1 sh ix2 b ie2
技术 1 j i4 sh u4
算法 1 s uan4 f a3
公式 1 g ong1 sh ix4
作战 1 z uo4 zh an4
防御 1 f ang2 vv v4
工事 1 g ong1 sh ix4
&lt;/code&gt;&lt;/pre&gt;

&lt;ol&gt;
  &lt;li&gt;音素问题划分文件：extra_question.txt，相同声调的不同音素放在一行，分组排列。&lt;/li&gt;
&lt;/ol&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;SIL SPN
vv ii sh b j s f g z zh
in1 ong1
ix2 ie2 ang2
v3 a3
v4 ix4 i4 u4 uan4 uo4 an4
&lt;/code&gt;&lt;/pre&gt;

&lt;ol&gt;
  &lt;li&gt;非静音音素文件：nonsilence_phones.txt&lt;/li&gt;
&lt;/ol&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;vv
v3 v4
ii
in1
sh
ix2 ix4
b
ie2
j
i4
u4
s
uan4
f
a3
g
ong1
z
uo4
zh
an4
ang2
sil
&lt;/code&gt;&lt;/pre&gt;

&lt;ol&gt;
  &lt;li&gt;静音音素文件：silence_phones.txt&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;SIL
SPN
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ol&gt;
  &lt;li&gt;可选静音音素文件：optional_silence.txt&lt;/li&gt;
&lt;/ol&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;SIL
&lt;/code&gt;&lt;/pre&gt;

&lt;ol&gt;
  &lt;li&gt;静音音素概率文件：silprob.txt，概率值来源于历史训练数据。&lt;/li&gt;
&lt;/ol&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;&amp;lt;s&amp;gt; 0.97
&amp;lt;/s&amp;gt;_s 2.25287275463452
&amp;lt;/s&amp;gt;_n 0.0751953756044114
overall 0.31
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;lang文件夹与发音词典模型生成&quot;&gt;lang文件夹与发音词典模型生成&lt;/h4&gt;

&lt;p&gt;使用kaldi脚本生成lang文件目录及相关文件。&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cd /home/sine/kaldi/egs/wsj/s5
utils/prepare_lang.sh /home/sine/ngram-test/data/dict &quot;&amp;lt;UNK&amp;gt;&quot; /home/sine/ngram-test/data/lang_tmp /home/sine/ngram-test/data/lang
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;在data/lang目录下的到L.fst和L_disambig.fst，其中L_disambig.fst为添加了消歧音素的发音词典模型。另外，还得到上述步骤需要的words.txt，以及后续步骤需要的topo、phones.txt、phones/disambig.int文件。&lt;/p&gt;

&lt;h4 id=&quot;发音词典模型可视化&quot;&gt;发音词典模型可视化&lt;/h4&gt;

&lt;p&gt;执行如下命令将发音词典模型fst输出为dot格式文件：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/sine/kaldi/tools/openfst/bin/fstdraw &lt;span class=&quot;nt&quot;&gt;--isymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;phones.txt &lt;span class=&quot;nt&quot;&gt;--osymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;words.txt L.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; L.dot
/home/sine/kaldi/tools/openfst/bin/fstdraw &lt;span class=&quot;nt&quot;&gt;--isymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;phones.txt &lt;span class=&quot;nt&quot;&gt;--osymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;words.txt L_disambig.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; L_disambig.dot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;修改dot文件中的的size属性：&lt;/p&gt;

&lt;p&gt;L.dot：size = “25,40”&lt;/p&gt;

&lt;p&gt;L_disambig.dot：size = “25,40”&lt;/p&gt;

&lt;p&gt;执行dot命令输出图片：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dot &lt;span class=&quot;nt&quot;&gt;-Tjpg&lt;/span&gt; L.dot &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; L.jpg
dot &lt;span class=&quot;nt&quot;&gt;-Tjpg&lt;/span&gt; L_disambig.dot &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; L_disambig.jpg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;发音词典模型图像如下：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gallery/hclg/L.jpg&quot; alt=&quot;发音词典模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;发音词典模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;
&lt;img src=&quot;/gallery/hclg/L_disambig.jpg&quot; alt=&quot;消歧发音词典模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;消歧发音词典模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;合并发音词典与语法模型lgfst&quot;&gt;合并发音词典与语法模型（LG.fst）&lt;/h3&gt;

&lt;h4 id=&quot;ldgfst模型生成&quot;&gt;LdG.fst模型生成&lt;/h4&gt;

&lt;p&gt;执行如下命令将L_disambig.fst分别与G-Ngram.fst合并，输出合并的LdG-Ngram.fst模型，同样的，可以将L.fst分别于G-Ngram.fst合并，得到对应的LG-Ngram.fst。&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/sine/kaldi/tools/openfst/bin/fstcompose L_disambig.fst G-1gram.fst LdG-1gram.fst
/home/sine/kaldi/tools/openfst/bin/fstcompose L_disambig.fst G-2gram.fst LdG-2gram.fst
/home/sine/kaldi/tools/openfst/bin/fstcompose L_disambig.fst G-3gram.fst LdG-3gram.fst
/home/sine/kaldi/tools/openfst/bin/fstcompose L.fst G-1gram.fst LG-1gram.fst
/home/sine/kaldi/tools/openfst/bin/fstcompose L.fst G-2gram.fst LG-2gram.fst
/home/sine/kaldi/tools/openfst/bin/fstcompose L.fst G-3gram.fst LG-3gram.fst
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;ldgfst模型可视化&quot;&gt;LdG.fst模型可视化&lt;/h4&gt;

&lt;p&gt;执行如下命令合并的LdG-Ngram.fst输出为dot格式文件：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/sine/kaldi/tools/openfst/bin/fstdraw &lt;span class=&quot;nt&quot;&gt;--isymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;phones.txt &lt;span class=&quot;nt&quot;&gt;--osymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;words.txt LdG-1gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; LdG-1gram.dot
/home/sine/kaldi/tools/openfst/bin/fstdraw &lt;span class=&quot;nt&quot;&gt;--isymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;phones.txt &lt;span class=&quot;nt&quot;&gt;--osymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;words.txt LdG-2gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; LdG-2gram.dot
/home/sine/kaldi/tools/openfst/bin/fstdraw &lt;span class=&quot;nt&quot;&gt;--isymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;phones.txt &lt;span class=&quot;nt&quot;&gt;--osymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;words.txt LdG-3gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; LdG-3gram.dot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;修改dot文件中的的size属性：&lt;/p&gt;

&lt;p&gt;LdG-1gram.dot：size = “30,48”&lt;/p&gt;

&lt;p&gt;LdG-2gram.dot：size = “300,48”&lt;/p&gt;

&lt;p&gt;LdG-3gram.dot：size = “300,48”&lt;/p&gt;

&lt;p&gt;执行dot命令输出图片：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dot &lt;span class=&quot;nt&quot;&gt;-Tjpg&lt;/span&gt; LdG-1gram.dot &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; LdG-1gram.jpg
dot &lt;span class=&quot;nt&quot;&gt;-Tjpg&lt;/span&gt; LdG-3gram.dot &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; LdG-2gram.jpg
dot &lt;span class=&quot;nt&quot;&gt;-Tjpg&lt;/span&gt; LdG-3gram.dot &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; LdG-3gram.jpg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;合并的LdG-Ngram.fst模型图像如下：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gallery/hclg/LdG-1gram.jpg&quot; alt=&quot;合并的LdG-1gram.fst模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;合并的LdG-1gram.fst模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;
&lt;img src=&quot;/gallery/hclg/LdG-2gram.jpg&quot; alt=&quot;合并的LdG-2gram.fst模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;合并的LdG-2gram.fst模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;
&lt;img src=&quot;/gallery/hclg/LdG-3gram.jpg&quot; alt=&quot;合并的LdG-3gram.fst模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;合并的LdG-3gram.fst模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;注：LG-Ngram.fst的可视化同上所述。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;确定化发音词典与语法模型det-lgfst&quot;&gt;确定化发音词典与语法模型（det-LG.fst）&lt;/h3&gt;

&lt;h4 id=&quot;确定化lgfst模型&quot;&gt;确定化LG.fst模型&lt;/h4&gt;

&lt;p&gt;执行如下命令将LdG-Ngram模型进行确定化（determinize）&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/sine/kaldi/tools/openfst/bin/fstdeterminize LdG-1gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; det-LdG-1gram.fst
/home/sine/kaldi/tools/openfst/bin/fstdeterminize LdG-2gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; det-LdG-2gram.fst
/home/sine/kaldi/tools/openfst/bin/fstdeterminize LdG-3gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; det-LdG-3gram.fst
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;确定化lgfst模型可视化&quot;&gt;确定化LG.fst模型可视化&lt;/h4&gt;

&lt;p&gt;使用上述与LdG.fst模型可视化相同的命令，将fst模型转为dot格式文件，修改对应dot文件中的size大小（相同）。使用dot命令输出图片。&lt;/p&gt;

&lt;p&gt;确定化的合并的det-LdG-Ngram.fst模型图像如下：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gallery/hclg/LdG-1gram.jpg&quot; alt=&quot;确定化的合并的det-LdG-1gram.fst模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;确定化的合并的det-LdG-1gram.fst模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;
&lt;img src=&quot;/gallery/hclg/LdG-2gram.jpg&quot; alt=&quot;确定化的合并的det-LdG-2gram.fst模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;确定化的合并的det-LdG-2gram.fst模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;
&lt;img src=&quot;/gallery/hclg/LdG-3gram.jpg&quot; alt=&quot;确定化的合并的det-LdG-3gram.fst模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;确定化的合并的det-LdG-3gram.fst模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;构建上下文模型与发音词典模型语法模型clgfst&quot;&gt;构建上下文模型与发音词典模型、语法模型（CLG.fst）&lt;/h3&gt;

&lt;h4 id=&quot;合并上下文模型与lgfst模型&quot;&gt;合并上下文模型与LG.fst模型&lt;/h4&gt;

&lt;p&gt;执行如下命令构建CLdG-Ngram.fst模型。&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/sine/kaldi/src/fstbin/fstcomposecontext &lt;span class=&quot;nt&quot;&gt;--context-size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1 &lt;span class=&quot;nt&quot;&gt;--central-position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0  &lt;span class=&quot;nt&quot;&gt;--read-disambig-syms&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;lang/phones/disambig.int &lt;span class=&quot;nt&quot;&gt;--write-disambig-syms&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;disambig_ilabels.int disambig_ilabels &amp;lt; ../LdG-1gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; CLdG-1gram.fst
/home/sine/kaldi/src/fstbin/fstcomposecontext &lt;span class=&quot;nt&quot;&gt;--context-size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1 &lt;span class=&quot;nt&quot;&gt;--central-position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0  &lt;span class=&quot;nt&quot;&gt;--read-disambig-syms&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;lang/phones/disambig.int &lt;span class=&quot;nt&quot;&gt;--write-disambig-syms&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;disambig_ilabels.int disambig_ilabels &amp;lt; ../LdG-2gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; CLdG-2gram.fst
/home/sine/kaldi/src/fstbin/fstcomposecontext &lt;span class=&quot;nt&quot;&gt;--context-size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1 &lt;span class=&quot;nt&quot;&gt;--central-position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0  &lt;span class=&quot;nt&quot;&gt;--read-disambig-syms&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;lang/phones/disambig.int &lt;span class=&quot;nt&quot;&gt;--write-disambig-syms&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;disambig_ilabels.int disambig_ilabels &amp;lt; ../LdG-3gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; CLdG-3gram.fst
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;注：（1）其中的–context-size=1 –central-position=0选项表示，单音素模型，中间音素位置为0；（2）其中输入文件lang/phones/disambig.int来自上述3.2 lang文件夹与发音词典模型生成中产生的文件，输入文件LdG-Ngram.fst来自于上一步合并的LdG-Ngram.fst模型。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;上下文clgfst模型可视化&quot;&gt;上下文CLG.fst模型可视化&lt;/h4&gt;

&lt;p&gt;使用上述与LdG.fst模型可视化相同的命令，将fst模型转为dot格式文件，修改对应dot文件中的size大小（相同）。使用dot命令输出图片。&lt;/p&gt;

&lt;p&gt;构建的上下文模型与发音词典模型、语法模型CLdG-Ngram.fst模型图像如下：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gallery/hclg/CLdG-1gram.jpg&quot; alt=&quot;上下文CLdG-1gram.fst模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;上下文CLdG-1gram.fst模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;
&lt;img src=&quot;/gallery/hclg/CLdG-2gram.jpg&quot; alt=&quot;上下文CLdG-2gram.fst模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;上下文CLdG-2gram.fst模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;
&lt;img src=&quot;/gallery/hclg/CLdG-3gram.jpg&quot; alt=&quot;上下文CLdG-3gram.fst模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;上下文CLdG-3gram.fst模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;构建hmm模型hfst&quot;&gt;构建HMM模型（H.fst）&lt;/h3&gt;

&lt;h4 id=&quot;单音素gnmm-hmm模型与hafst生成&quot;&gt;单音素GNMM-HMM模型与Ha.fst生成&lt;/h4&gt;

&lt;p&gt;构建HMM模型，需要先初始化定义GMM-HMM结构，确定音素绑定树结构，执行如下命令，生成初始化的GMM-HMM模型（gmm-init.mdl），和音素绑定树（phone.tree）。&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/sine/kaldi/src/gmmbin/gmm-init-mono lang/topo 40 gmm-init.mdl phone.tree
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;执行如下命令，构建Ha.fst模型&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/sine/kaldi/src/bin/make-h-transducer &lt;span class=&quot;nt&quot;&gt;--disambig-syms-out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;disambig_tid.int disambig_ilabels phone.tree gmm-init.mdl &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Ha.fst
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;注：（1）其中gmm-init-mono是生成单音素GMM模型，和上一步操作的–context-size=1 –central-position=0选项对应，gmm-init-model对应生成三音素GMM模型，对应的选项为–context-size=3 –central-position=1；（2）Ha.fst中的a表示没有自环（self-loop）。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;hafst模型可视化&quot;&gt;Ha.fst模型可视化&lt;/h4&gt;

&lt;p&gt;执行如下命令，将Ha.fst模型输出为dot格式文件：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/sine/kaldi/tools/openfst/bin/fstdraw &lt;span class=&quot;nt&quot;&gt;--osymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;phones.txt Ha.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Ha.dot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;修改dot文件中的的size属性：&lt;/p&gt;

&lt;p&gt;Ha.dot：size = “30,48”&lt;/p&gt;

&lt;p&gt;执行dot命令输出图片：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dot &lt;span class=&quot;nt&quot;&gt;-Tjpg&lt;/span&gt; Ha.dot &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Ha.jpg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/gallery/hclg/Ha.jpg&quot; alt=&quot;HMM Ha.fst模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;HMM Ha.fst模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;合并hmm模型上下文模型发音词典模型语法模型hclgfst&quot;&gt;合并HMM模型，上下文模型、发音词典模型、语法模型（HCLG.fst）&lt;/h3&gt;

&lt;h4 id=&quot;合并hafst模型与cldg-ngramfst模型&quot;&gt;合并Ha.fst模型与CLdG-Ngram.fst模型&lt;/h4&gt;

&lt;p&gt;执行如下命令，合并Ha.fst与CLdG-Ngram.fst模型：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/sine/kaldi/src/fstbin/fsttablecompose Ha.fst CLdG-1gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; HaCLdG-1gram.fst
/home/sine/kaldi/src/fstbin/fsttablecompose Ha.fst CLdG-2gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; HaCLdG-2gram.fst
/home/sine/kaldi/src/fstbin/fsttablecompose Ha.fst CLdG-3gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; HaCLdG-3gram.fst
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;执行如下命令，确定化HaCLdG.fst模型：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/sine/kaldi/src/fstbin/fstdeterminizestar HaCLdG-1gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; det-HaCLdG-1gram.fst
/home/sine/kaldi/src/fstbin/fstdeterminizestar HaCLdG-2gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; det-HaCLdG-2gram.fst
/home/sine/kaldi/src/fstbin/fstdeterminizestar HaCLdG-3gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; det-HaCLdG-3gram.fst
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;执行如下命令，去除HaCLdG.fst模型中与消歧相关的转移：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/sine/kaldi/src/fstbin/fstrmsymbols data/disambig_tid.int det-HaCLdG-1gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; det-HaCLG-1gram.fst
/home/sine/kaldi/src/fstbin/fstrmsymbols data/disambig_tid.int det-HaCLdG-2gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; det-HaCLG-2gram.fst
/home/sine/kaldi/src/fstbin/fstrmsymbols data/disambig_tid.int det-HaCLdG-3gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; det-HaCLG-3gram.fst
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;执行如下命令，最小化HaCLG.fst模型：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/sine/kaldi/tools/openfst/bin/fstminimize det-HaCLG-1gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; min-det-HaCLG-1gram.fst
/home/sine/kaldi/tools/openfst/bin/fstminimize det-HaCLG-2gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; min-det-HaCLG-2gram.fst
/home/sine/kaldi/tools/openfst/bin/fstminimize det-HaCLG-3gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; min-det-HaCLG-3gram.fst
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;执行如下命令，为HaCLG.fst模型添加自环：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/sine/kaldi/src/bin/add-self-loops &lt;span class=&quot;nt&quot;&gt;--self-loop-scale&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0.1 &lt;span class=&quot;nt&quot;&gt;--reorder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true &lt;/span&gt;data/gmm-init.mdl &amp;lt; min-det-HaCLG-1gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; min-det-HCLG-1gram.fst
/home/sine/kaldi/src/bin/add-self-loops &lt;span class=&quot;nt&quot;&gt;--self-loop-scale&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0.1 &lt;span class=&quot;nt&quot;&gt;--reorder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true &lt;/span&gt;data/gmm-init.mdl &amp;lt; min-det-HaCLG-2gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; min-det-HCLG-2gram.fst
/home/sine/kaldi/src/bin/add-self-loops &lt;span class=&quot;nt&quot;&gt;--self-loop-scale&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0.1 &lt;span class=&quot;nt&quot;&gt;--reorder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true &lt;/span&gt;data/gmm-init.mdl &amp;lt; min-det-HaCLG-3gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; min-det-HCLG-3gram.fst
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;min-det-hclg-ngramfst模型可视化&quot;&gt;min-det-HCLG-Ngram.fst模型可视化&lt;/h4&gt;

&lt;p&gt;执行如下命令合并的LdG-Ngram.fst输出为dot格式文件：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/sine/kaldi/tools/openfst/bin/fstdraw &lt;span class=&quot;nt&quot;&gt;--osymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;words.txt min-det-HCLG-1gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; min-det-HCLG-1gram.dot
/home/sine/kaldi/tools/openfst/bin/fstdraw &lt;span class=&quot;nt&quot;&gt;--osymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;words.txt min-det-HCLG-2gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; min-det-HCLG-2gram.dot
/home/sine/kaldi/tools/openfst/bin/fstdraw &lt;span class=&quot;nt&quot;&gt;--osymbols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;words.txt min-det-HCLG-3gram.fst &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; min-det-HCLG-3gram.dot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;修改dot文件中的的size属性：&lt;/p&gt;

&lt;p&gt;min-det-HCLG-1gram.dot：size = “300,48”&lt;/p&gt;

&lt;p&gt;min-det-HCLG-2gram.dot：size = “300,48”&lt;/p&gt;

&lt;p&gt;min-det-HCLG-3gram.dot：size = “300,48”&lt;/p&gt;

&lt;p&gt;执行dot命令输出图片：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dot &lt;span class=&quot;nt&quot;&gt;-Tjpg&lt;/span&gt; min-det-HCLG-1gram.dot &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; min-det-HCLG-1gram.jpg
dot &lt;span class=&quot;nt&quot;&gt;-Tjpg&lt;/span&gt; min-det-HCLG-2gram.dot &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; min-det-HCLG-2gram.jpg
dot &lt;span class=&quot;nt&quot;&gt;-Tjpg&lt;/span&gt; min-det-HCLG-3gram.dot &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; min-det-HCLG-3gram.jpg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;最终的min-det-HCLG-Ngram.fst模型图像如下：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gallery/hclg/min-det-HCLG-1gram.jpg&quot; alt=&quot;min-det-HCLG-1gram.fst模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;min-det-HCLG-1gram.fst模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;
&lt;img src=&quot;/gallery/hclg/min-det-HCLG-2gram.jpg&quot; alt=&quot;min-det-HCLG-2gram.fst模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;min-det-HCLG-2gram.fst模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;
&lt;img src=&quot;/gallery/hclg/min-det-HCLG-3gram.jpg&quot; alt=&quot;min-det-HCLG-3gram.fst模型&quot; /&gt;&lt;/p&gt;
&lt;center&gt;min-det-HCLG-3gram.fst模型&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><author><name>Kell</name></author><category term="语音识别" /><category term="语音识别" /><category term="kaldi" /><category term="WFST" /><category term="HCLG" /><summary type="html">基于DNN-HMM的语音识别系统，需要在深度网络的推理之后外接解码来实现最后的语句识别，相关的语音识别理论基础不在此赘述，需要简单描述的是，解码实际上是得到音素状态转移的声学判决后，在一个HMM模型（H），Context Dependent Phone（C），Lexicon（L）和语言模型（G）合并的WFST（Weighted Finite-State Transducers，加权有限状态机）上进行路径寻优。WFST的基本概念和操作请查看：从WFST到语音识别。</summary></entry><entry><title type="html">从WFST到语音识别</title><link href="http://kellwang.com/%E8%AF%AD%E9%9F%B3%E8%AF%86%E5%88%AB/2020/08/10/%E4%BB%8EWFST%E5%88%B0%E8%AF%AD%E9%9F%B3%E8%AF%86%E5%88%AB/" rel="alternate" type="text/html" title="从WFST到语音识别" /><published>2020-08-10T23:55:29+00:00</published><updated>2020-08-10T23:55:29+00:00</updated><id>http://kellwang.com/%E8%AF%AD%E9%9F%B3%E8%AF%86%E5%88%AB/2020/08/10/%E4%BB%8EWFST%E5%88%B0%E8%AF%AD%E9%9F%B3%E8%AF%86%E5%88%AB</id><content type="html" xml:base="http://kellwang.com/%E8%AF%AD%E9%9F%B3%E8%AF%86%E5%88%AB/2020/08/10/%E4%BB%8EWFST%E5%88%B0%E8%AF%AD%E9%9F%B3%E8%AF%86%E5%88%AB/">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;很多图都是在草稿纸上推演的，所以最后做成文档也导成了图，看起来更清晰。&lt;/center&gt;

&lt;p&gt;&lt;img src=&quot;/gallery/wfst/WFST2ASR_02.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_03.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_04.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_05.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_06.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_07.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_08.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_09.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_10.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_11.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_12.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_13.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_14.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_15.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_16.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_17.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_18.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_19.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;
&lt;img src=&quot;/gallery/wfst/WFST2ASR_20.jpg&quot; alt=&quot;WFST2ASR&quot; /&gt;&lt;/p&gt;</content><author><name>Kell</name></author><category term="语音识别" /><category term="语音识别" /><category term="WFST" /><summary type="html">很多图都是在草稿纸上推演的，所以最后做成文档也导成了图，看起来更清晰。</summary></entry><entry><title type="html">隐秘的角落</title><link href="http://kellwang.com/%E7%BE%8E%E6%9C%AF/2020/06/27/%E9%9A%90%E7%A7%98%E7%9A%84%E8%A7%92%E8%90%BD/" rel="alternate" type="text/html" title="隐秘的角落" /><published>2020-06-27T16:28:02+00:00</published><updated>2020-06-27T16:28:02+00:00</updated><id>http://kellwang.com/%E7%BE%8E%E6%9C%AF/2020/06/27/%E9%9A%90%E7%A7%98%E7%9A%84%E8%A7%92%E8%90%BD</id><content type="html" xml:base="http://kellwang.com/%E7%BE%8E%E6%9C%AF/2020/06/27/%E9%9A%90%E7%A7%98%E7%9A%84%E8%A7%92%E8%90%BD/">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;font size=&quot;3&quot;&gt;年少，跑，跳，闹。&lt;/font&gt;&lt;/center&gt;</content><author><name>Kell</name></author><category term="美术" /><category term="时光" /><summary type="html">年少，跑，跳，闹。</summary></entry><entry><title type="html">一群叶子</title><link href="http://kellwang.com/%E7%BE%8E%E6%9C%AF/2020/06/14/%E4%B8%80%E7%BE%A4%E5%8F%B6%E5%AD%90/" rel="alternate" type="text/html" title="一群叶子" /><published>2020-06-14T23:55:29+00:00</published><updated>2020-06-14T23:55:29+00:00</updated><id>http://kellwang.com/%E7%BE%8E%E6%9C%AF/2020/06/14/%E4%B8%80%E7%BE%A4%E5%8F%B6%E5%AD%90</id><content type="html" xml:base="http://kellwang.com/%E7%BE%8E%E6%9C%AF/2020/06/14/%E4%B8%80%E7%BE%A4%E5%8F%B6%E5%AD%90/">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;font size=&quot;3&quot;&gt;简单是美，复杂也是。&lt;/font&gt;&lt;/center&gt;</content><author><name>Kell</name></author><category term="美术" /><category term="结构" /><summary type="html">简单是美，复杂也是。</summary></entry><entry><title type="html">一场大火</title><link href="http://kellwang.com/%E6%96%87%E5%AD%A6/2020/01/05/%E4%B8%80%E5%9C%BA%E5%A4%A7%E7%81%AB/" rel="alternate" type="text/html" title="一场大火" /><published>2020-01-05T23:55:29+00:00</published><updated>2020-01-05T23:55:29+00:00</updated><id>http://kellwang.com/%E6%96%87%E5%AD%A6/2020/01/05/%E4%B8%80%E5%9C%BA%E5%A4%A7%E7%81%AB</id><content type="html" xml:base="http://kellwang.com/%E6%96%87%E5%AD%A6/2020/01/05/%E4%B8%80%E5%9C%BA%E5%A4%A7%E7%81%AB/">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;font size=&quot;3&quot;&gt;一场大火，一场梦。&lt;/font&gt;&lt;/center&gt;

&lt;p&gt;我母亲捧着我的遗像，走在队伍的最前面。&lt;/p&gt;</content><author><name>Kell</name></author><category term="文学" /><category term="小说" /><category term="社会" /><summary type="html">一场大火，一场梦。</summary></entry><entry><title type="html">使用Srilm训练ARPA语言模型</title><link href="http://kellwang.com/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/2019/08/20/%E4%BD%BF%E7%94%A8Srilm%E8%AE%AD%E7%BB%83ARPA%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/" rel="alternate" type="text/html" title="使用Srilm训练ARPA语言模型" /><published>2019-08-20T00:00:00+00:00</published><updated>2019-08-20T00:00:00+00:00</updated><id>http://kellwang.com/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/2019/08/20/%E4%BD%BF%E7%94%A8Srilm%E8%AE%AD%E7%BB%83ARPA%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B</id><content type="html" xml:base="http://kellwang.com/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/2019/08/20/%E4%BD%BF%E7%94%A8Srilm%E8%AE%AD%E7%BB%83ARPA%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/">&lt;h3 id=&quot;安装srilm工具&quot;&gt;安装SRILM工具&lt;/h3&gt;

&lt;h4 id=&quot;安装tcl&quot;&gt;安装tcl&lt;/h4&gt;

&lt;p&gt;下载tcl安装包：&lt;a href=&quot;http://www.tcl.tk/software/tcltk/download.html&quot;&gt;tcl8.6.8-src.tar.gz&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;执行命令并安装：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;tar&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-zxvf&lt;/span&gt; tcl8.6.8-src.tar.gz
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;tcl8.6.8/
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;unix
make
make &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;安装srilm&quot;&gt;安装srilm&lt;/h4&gt;

&lt;p&gt;执行命令安装依赖&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;apt-get &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;gcc
apt-get &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;make
apt-get &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;gwak
apt-get &lt;span class=&quot;nb&quot;&gt;install gzip
&lt;/span&gt;apt-get &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;bzip2
apt-get &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;p7zip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;下载srilm安装包：&lt;a href=&quot;http://www.speech.sri.com/projects/srilm/download.html&quot;&gt;srilm-1.7.2.tar.gz&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;执行命令并安装：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;pwd&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;/home/sine/
&lt;span class=&quot;nb&quot;&gt;mkdir &lt;/span&gt;srilm
&lt;span class=&quot;nb&quot;&gt;mv &lt;/span&gt;srilm-1.7.2.tar.gz srilm/
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;srilm
vim Makefile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;在：# SRILM = /home/speech/stolcke/project/srilm/devel 后一行添加&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-sehll&quot;&gt;SRILM = $(PWD)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行命令查询机器类型&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;uname&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;x86_64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;如果结果为x86_64，则对应的需要修改common/Makefile.machine.i686-m64文件&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vim common/Makefile.machine.i686-m64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;修改：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;TCL_INCLUDE &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
TCL_LIBRARY &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;为：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;TCL_INCLUDE &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
TCL_LIBRARY &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;

NO_TCL &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; X
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;修改：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;GAWK &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; /usr/bin/awk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;为：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;GAWK &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; /usr/bin/gawk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;执行命令并编译srilm&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;pwd&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;/home/sine/srilm/
make World
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;执行命令修改环境变量&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;pwd&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;/home/sine/
vim .bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;添加：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/home/sine/srilm/bin/i686-m64:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$PATH&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;”
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;并生效环境变量&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;pwd&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;/home/sine/
&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; .bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;安装完毕！&lt;/p&gt;

&lt;h3 id=&quot;训练模型&quot;&gt;训练模型&lt;/h3&gt;

&lt;p&gt;训练模型需要文本原始语料，例如speechocean-train.txt，其内容及格式如下：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;一九九六年 雅虎 上市&lt;/p&gt;

  &lt;p&gt;二零一零年 规模 以上 工业 增长 值 同比 增长 十五点七&lt;/p&gt;

  &lt;p&gt;一 是 社会 政策 的 缺失 包括 社会 保障 医疗 教育 和 住房&lt;/p&gt;

  &lt;p&gt;丈夫 刘天恩 称 当时 调解 后 民兵 赔偿 七百 元&lt;/p&gt;

  &lt;p&gt;上海县 和 闵行区 相继 被 撤销 设 设立 新 的 闵行区&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;词频统计&quot;&gt;词频统计&lt;/h4&gt;

&lt;p&gt;执行命令获取1gram词频统计&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ngram-count &lt;span class=&quot;nt&quot;&gt;-text&lt;/span&gt; speechocean-train.txt &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 1 &lt;span class=&quot;nt&quot;&gt;-write&lt;/span&gt; speechocean-train-1gram.count
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;执行命令获取2gram词频统计&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ngram-count &lt;span class=&quot;nt&quot;&gt;-text&lt;/span&gt; speechocean-train.txt &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 2 &lt;span class=&quot;nt&quot;&gt;-write&lt;/span&gt; speechocean-train-2gram.count
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;执行命令获取3gram词频统计&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ngram-count &lt;span class=&quot;nt&quot;&gt;-text&lt;/span&gt; speechocean-train.txt &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 3 &lt;span class=&quot;nt&quot;&gt;-write&lt;/span&gt; speechocean-train-3gram.count
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;执行命令获取4gram词频统计&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ngram-count &lt;span class=&quot;nt&quot;&gt;-text&lt;/span&gt; speechocean-train.txt &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 4 &lt;span class=&quot;nt&quot;&gt;-write&lt;/span&gt; speechocean-train-4gram.count
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;ngram模型训练&quot;&gt;Ngram模型训练&lt;/h4&gt;

&lt;p&gt;执行命令训练1gram语言模型&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ngram-count &lt;span class=&quot;nt&quot;&gt;-read&lt;/span&gt; speechocean-train-1gram.count &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 1 &lt;span class=&quot;nt&quot;&gt;-lm&lt;/span&gt; speechocean-train-1gram.arpa &lt;span class=&quot;nt&quot;&gt;-interpolate&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-kndiscount&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;其中speechocean-train-1gram.arpa为生成的语言模型，-interpolate和-kndiscount为插值与折回参数&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;执行命令训练2gram语言模型&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ngram-count &lt;span class=&quot;nt&quot;&gt;-read&lt;/span&gt; speechocean-train-2gram.count &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 2 &lt;span class=&quot;nt&quot;&gt;-lm&lt;/span&gt; speechocean-train-2gram.arpa &lt;span class=&quot;nt&quot;&gt;-interpolate&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-kndiscount&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;执行命令训练3gram语言模型&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ngram-count &lt;span class=&quot;nt&quot;&gt;-read&lt;/span&gt; speechocean-train-3gram.count &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 3 &lt;span class=&quot;nt&quot;&gt;-lm&lt;/span&gt; speechocean-train-3gram.arpa &lt;span class=&quot;nt&quot;&gt;-interpolate&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-kndiscount&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;执行命令训练4gram语言模型&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ngram-count &lt;span class=&quot;nt&quot;&gt;-read&lt;/span&gt; speechocean-train-4gram.count &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 4 &lt;span class=&quot;nt&quot;&gt;-lm&lt;/span&gt; speechocean-train-4gram.arpa &lt;span class=&quot;nt&quot;&gt;-interpolate&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-kndiscount&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;模型剪枝&quot;&gt;模型剪枝&lt;/h4&gt;

&lt;p&gt;对3gram语言模型进行剪枝操作&lt;/p&gt;

&lt;p&gt;执行命令剪枝3gram模型，剪枝阈值为0.0000001&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ngram &lt;span class=&quot;nt&quot;&gt;-lm&lt;/span&gt; speechocean-train-3gram.arpa &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 3 &lt;span class=&quot;nt&quot;&gt;-prune&lt;/span&gt; 0.0000001 &lt;span class=&quot;nt&quot;&gt;-write-lm&lt;/span&gt; speechocean-train-3gram-pruned-0.0000001.arpa
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;执行命令剪枝3gram模型，剪枝阈值为0.0000003&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ngram &lt;span class=&quot;nt&quot;&gt;-lm&lt;/span&gt; speechocean-train-3gram.arpa &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 3 &lt;span class=&quot;nt&quot;&gt;-prune&lt;/span&gt; 0.0000003 &lt;span class=&quot;nt&quot;&gt;-write-lm&lt;/span&gt; speechocean-train-3gram-pruned-0.0000003.arpa
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;模型质量困惑度检查&quot;&gt;模型质量（困惑度）检查&lt;/h4&gt;

&lt;p&gt;可以对已经训练的所有模型进行困惑度检查，例如&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ngram &lt;span class=&quot;nt&quot;&gt;-ppl&lt;/span&gt; speechocean-train.txt &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 1 &lt;span class=&quot;nt&quot;&gt;-lm&lt;/span&gt; speechocean-train-1gram.arpa &lt;span class=&quot;nt&quot;&gt;-debug&lt;/span&gt; 2 &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; speechocean-train-1gram.ppl
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;模型文件压缩&quot;&gt;模型文件压缩&lt;/h3&gt;

&lt;p&gt;执行命令压缩arpa文件，可以节省存储空间。&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;gzip &lt;/span&gt;speechocean-train-3gram.arpa
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;speechocean-train-3gram.arpa.gz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;模型合并&quot;&gt;模型合并&lt;/h3&gt;

&lt;p&gt;执行命令，可以将两个已经训练好的arpa模型合并在一起。&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ngram &lt;span class=&quot;nt&quot;&gt;-order&lt;/span&gt; 1 &lt;span class=&quot;nt&quot;&gt;-lm&lt;/span&gt; speechocean-train-1gram.arpa &lt;span class=&quot;nt&quot;&gt;-mix-lm&lt;/span&gt; zhihu-train-1gram.arpa &lt;span class=&quot;nt&quot;&gt;-lambda&lt;/span&gt; 0.5 &lt;span class=&quot;nt&quot;&gt;-write-lm&lt;/span&gt; combine-train-1gram.arpa
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;其中0.5是融合系数。&lt;/p&gt;
&lt;/blockquote&gt;</content><author><name>Kell</name></author><category term="自然语言处理" /><category term="自然语言处理" /><category term="语言模型" /><summary type="html">安装SRILM工具</summary></entry><entry><title type="html">mrcp-plugin-with-freeswitch</title><link href="http://kellwang.com/%E5%B7%A5%E7%A8%8B/2018/11/27/mrcp-plugin-with-freeswitch/" rel="alternate" type="text/html" title="mrcp-plugin-with-freeswitch" /><published>2018-11-27T20:23:13+00:00</published><updated>2018-11-27T20:23:13+00:00</updated><id>http://kellwang.com/%E5%B7%A5%E7%A8%8B/2018/11/27/mrcp-plugin-with-freeswitch</id><content type="html" xml:base="http://kellwang.com/%E5%B7%A5%E7%A8%8B/2018/11/27/mrcp-plugin-with-freeswitch/">&lt;blockquote&gt;
  &lt;p&gt;github非每天登录，如有问题，请联系 wangkaisine@gmail.com，空闲时间回复，谢谢！&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;这是我的第一个Github工程，特别感谢 &lt;a href=&quot;https://cotin.tech&quot;&gt;Cotin网站&lt;/a&gt; 《构建简单的智能客服系统》&lt;a href=&quot;https://cotin.tech/AI/FreeswitchSetting/&quot;&gt;（一）&lt;/a&gt;、 &lt;a href=&quot;https://cotin.tech/AI/UniMRCPASR/&quot;&gt;（二）&lt;/a&gt; 、&lt;a href=&quot;https://cotin.tech/AI/UniMRCPTTS/&quot;&gt;（三）&lt;/a&gt; 对于构建过程的帮助，您在阅读本教程前，可以先行阅读这三篇文章，本教程基于此调整了构建顺序，给出更多的操作细节，错误处理以及其它构建描述。&lt;/p&gt;

&lt;h2 id=&quot;主要目的&quot;&gt;主要目的&lt;/h2&gt;

&lt;p&gt;使用FreeSWITCH接受用户手机呼叫，通过UniMRCP Server集成讯飞开放平台（xfyun）插件将用户语音进行语音识别（ASR），并根据自定义业务逻辑调用语音合成（TTS），构建简单的端到端语音呼叫中心。&lt;/p&gt;

&lt;h4 id=&quot;总体结构如下图所示&quot;&gt;总体结构如下图所示：&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/gallery/mrcp/mrcp_00.png&quot; alt=&quot;mrcp_00&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;构建步骤&quot;&gt;构建步骤&lt;/h2&gt;

&lt;h3 id=&quot;第一步-安装编译freeswitch&quot;&gt;第一步 安装编译FreeSWITCH&lt;/h3&gt;

&lt;p&gt;本次示例的FreeSWITCH在MacOS High Sierra 10.13.4系统版本中进行源码编译安装，未使用软件包安装，具体安装步骤可见 &lt;a href=&quot;https://freeswitch.org/confluence/display/FREESWITCH/macOS+macFI+Installation&quot;&gt;官网安装介绍&lt;/a&gt; ，其他平台如Linux（Ubuntu、CentOS）应均能安装成功。&lt;/p&gt;

&lt;p&gt;以下给出源码编译安装的步骤：&lt;/p&gt;

&lt;p&gt;1.下载 &lt;a href=&quot;https://freeswitch.org/stash/scm/fs/freeswitch.git&quot;&gt;FreeSWITCH源码&lt;/a&gt;：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /usr/local/src
git clone &lt;span class=&quot;nt&quot;&gt;-b&lt;/span&gt; v1.6 https://freeswitch.org/stash/scm/fs/freeswitch.git freeswitch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;2.安装依赖库&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;autoconf
brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;automake
brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;libtool
brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;pkg-config
brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;speexdsp
brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;speex
brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;libldns-dev
brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;OpenSSL
brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;pcre
brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;pkgconfig sqlite3
brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;lua
brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;opus
brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;libsndfile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;注：其他系统平台请自行确认依赖库内容，可能的搜索结果：&lt;a href=&quot;https://blog.csdn.net/u012121105/article/details/74238595&quot;&gt;Ubuntu/CentOS FreeSWITCH 安装依赖&lt;/a&gt;。 在ubuntu下：&lt;a href=&quot;https://blog.csdn.net/aphero/article/details/78309817&quot;&gt;libtool not found&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;3.编译安装&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;freeswitch/
&lt;span class=&quot;c&quot;&gt;# 先执行 bootstrap.sh，生成configure文件&lt;/span&gt;
./bootstrap.sh 
./configure &lt;span class=&quot;nt&quot;&gt;--prefix&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/local/freeswitch
make
make &lt;span class=&quot;nb&quot;&gt;install
&lt;/span&gt;make cd-sounds-install
make cd-moh-install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;4.运行&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /usr/local/freeswitch/bin
./freeswitch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;即可启动应用。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;注：安装过程中可能出现的问题 &lt;a href=&quot;https://blog.csdn.net/singleroot/article/details/52298620&quot;&gt;configure中的错误&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;FreeSWITCH默认配置1000-1019（20个）用户，默认密码1234，您可以提前跳转到“第四步 测试与验证” 的验证步骤，登录并拨打5000，可以听到默认IVR的示例语音菜单指引。&lt;/p&gt;

&lt;h3 id=&quot;第二步-配置编译unimrcp-server&quot;&gt;第二步 配置编译UniMRCP Server&lt;/h3&gt;

&lt;p&gt;本次示例的UniMRCP Server在CentOS 7中进行源码编译安装，感谢由Github用户cotinyang提供的已经写好的集成讯飞SDK的UniMRCP Server源码。&lt;/p&gt;

&lt;p&gt;1.下载 &lt;a href=&quot;https://github.com/cotinyang/MRCP-Plugin-Demo&quot;&gt;UniMRCP Server Plugin Demo 源码&lt;/a&gt;：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /opt
git clone https://github.com/cotinyang/MRCP-Plugin-Demo.git MRCP-Plugin-Demo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;2.编译准备环境&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;MRCP-Plugin-Demo/unimrcp-deps-1.5.0
&lt;span class=&quot;c&quot;&gt;## 编译可能出现错误, 注释掉：107 ~ 109, getopt的set，其中存在不识别的option&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;## 编译生成apr, apr-util, target path: ./libs&lt;/span&gt;
./build-dep-libs.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
  &lt;p&gt;注：1.过程中需要输入两次y，并确认；2.另外，我们为该Demo工程Fork了一个自己维护的工程，地址为https://github.com/wangkaisine/MRCP-Plugin-Demo 您也可以使用这个地址的源码。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;3.编译安装unimrcp&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;unimrcp-1.5.0
./bootstrap
&lt;span class=&quot;c&quot;&gt;## 如果不能自动检测apr，apr-util,请在configure中增加 option：--with-apr=/path/apr --with-apr-util=/path/apr-util/&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;## apr， apr-util由./build-dep-libs.sh 生成&lt;/span&gt;
./configure
make
make &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;即可在/usr/local/中看到安装好的unimrcp。&lt;/p&gt;

&lt;p&gt;4.测试运行&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /usr/local/unimrcp/bin
./unimrcpserver &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; 3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;可以使用client进行验证&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /usr/local/unimrcp/bin
./unimrcpclient
&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;help
&lt;/span&gt;usage:

- run &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;app_name] &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;profile_name] &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;run demo application&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
       app_name is one of &lt;span class=&quot;s1&quot;&gt;'synth'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'recog'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'bypass'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'discover'&lt;/span&gt;
       profile_name is one of &lt;span class=&quot;s1&quot;&gt;'uni2'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'uni1'&lt;/span&gt;, ...

       examples: 
           run synth
           run recog
           run synth uni1
           run recog uni1

- loglevel &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;level] &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;loglevel, one of 0,1...7&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

- quit, &lt;span class=&quot;nb&quot;&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;输入help回车，给出了使用方法，输入run recog运行语音识别测试，run synth进行语音合成测试。&lt;/p&gt;

&lt;h3 id=&quot;第三步-集成讯飞开放平台sdk&quot;&gt;第三步 集成讯飞开放平台SDK&lt;/h3&gt;

&lt;p&gt;1.讯飞开发平台SDK下载&lt;/p&gt;

&lt;p&gt;由于从讯飞开放平台下载的SDK包和用户以及用户创建的应用相关联，因此需要将third-party/xfyun中的文件和文件夹全部删除，重新下载解压属于自己的SDK，目录与源代码基本一致。&lt;/p&gt;

&lt;p&gt;您需要注册并登录 &lt;a href=&quot;https://www.xfyun.cn/&quot;&gt;讯飞开放平台&lt;/a&gt; ，进入控制台页面，并创建应用；&lt;/p&gt;

&lt;p&gt;在“我的应用”界面获得你的APPID，并为该应用“添加新服务”，选择需要的“语音听写”和”在线语音合成“服务（本示例需要）；&lt;/p&gt;

&lt;p&gt;点击右侧“SDK下载”，在跳转页面中确认“选择应用”已经选中了您创建的应用，“选择您需要的AI能力”选中上述两项服务，并点击“SDK下载”等待SDK生成与完成下载。&lt;/p&gt;

&lt;p&gt;将下载的zip包，解压并替换MRCP-Plugin-Demo/unimrcp-1.5.0/plugins/third-party/xfyun/下的所有文件及文件夹。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;注：创建应用页面中的应用平台选择“Linux”。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;2.plugin编写与编译&lt;/p&gt;

&lt;p&gt;本步骤将告诉您如何编写unimrcp的插件代码，即现在MRCP-Plugin-Demo/unimrcp-1.5.0/plugins文件夹下xfyun_recog、xfyun_xynth文件夹下的文件及其相关配置是如何得到的，如果您当前还不关注此细节，可以跳过本步骤至第四步。&lt;/p&gt;

&lt;p&gt;实际上，上述MRCP-Plugin-Demo代码是在  &lt;a href=&quot;http://www.unimrcp.org&quot;&gt;Unimrcp官网&lt;/a&gt; 下载 &lt;a href=&quot;http://www.unimrcp.org/project/release-view/unimrcp-1-5-0/unimrcp-1-5-0-zip&quot;&gt;Unimrcp 1.5.0&lt;/a&gt; 和 &lt;a href=&quot;http://www.unimrcp.org/project/release-view/unimrcp-deps-1-5-0/unimrcp-deps-1-5-0-zip&quot;&gt;Unimrcp Deps 1.5.0&lt;/a&gt; 并在此基础上添加的plugin代码。&lt;/p&gt;

&lt;p&gt;首先编辑configure.ac文件，会在后面的Makefile中使用到的宏定义。XFyun recognizer plugin的添加如下：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dnl XFyun recognizer plugin.
UNI_PLUGIN_ENABLED&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;xfyunrecog&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

AM_CONDITIONAL&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;XFYUNRECOG_PLUGIN],[test &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;enable_xfyunrecog_plugin&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;yes&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;

...

plugins/xfyun-recog/Makefile

...

&lt;span class=&quot;nb&quot;&gt;echo &lt;/span&gt;XFyun recognizer plugin....... : &lt;span class=&quot;nv&quot;&gt;$enable_xfyunrecog_plugin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;注：其中 ··· 是该文件中的其它默认配置，请找到对应位置填写。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;对应地，XFyun synthesizer plugin的添加如下：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dnl XFyun synthesizer plugin.
UNI_PLUGIN_ENABLED&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;xfyunsynth&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

AM_CONDITIONAL&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;XFYUNSYNTH_PLUGIN],[test &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;enable_xfyunsynth_plugin&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;yes&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;

···

plugins/xfyun-synth/Makefile

···

&lt;span class=&quot;nb&quot;&gt;echo &lt;/span&gt;XFyun synthesizer plugin...... : &lt;span class=&quot;nv&quot;&gt;$enable_xfyunsynth_plugin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;新增源码与目录&lt;/p&gt;

&lt;p&gt;在 plugins 目录下，新建 xfyun-recog 目录，并在该目录下新建 src 目录，可以将 demo_recog_engine.c 拷贝到该目录下改名为 xfyun_recog_engine.c，将xfyun_recog_engine.c文件进行修改（已知一个修改的部分：将appid修改成你自己下载sdk的appid,不然会报错：QISRAudioWrite failed! error code:10407），xfyun-synth目录下对应创建并修改。&lt;/p&gt;

&lt;p&gt;在xfyun-recog文件夹下新建Makefile.am文件，内容如下：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;AM_CPPFLAGS                &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;UNIMRCP_PLUGIN_INCLUDES&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;

plugin_LTLIBRARIES         &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; xfyunrecog.la

xfyunrecog_la_SOURCES       &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; src/xfyun_recog_engine.c
xfyunrecog_la_LDFLAGS       &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;UNIMRCP_PLUGIN_OPTS&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
                              &lt;span class=&quot;nt&quot;&gt;-L&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;top_srcdir&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;/plugins/third-party/xfyun/libs/x64 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
                              &lt;span class=&quot;nt&quot;&gt;-lmsc&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-ldl&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-lpthread&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-lrt&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-lstdc&lt;/span&gt;++
xfyunrecog_ladir            &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;libdir&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
xfyunrecog_la_DATA          &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;top_srcdir&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;/plugins/third-party/xfyun/libs/x64/libmsc.so


include &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;top_srcdir&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;/build/rules/uniplugin.am

UNIMRCP_PLUGIN_INCLUDES     +&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-I&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;top_srcdir&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;/plugins/third-party/xfyun/include
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;对应地，在fyun-synth文件夹下新建Makefile.am文件夹，内容如下：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;AM_CPPFLAGS                &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;UNIMRCP_PLUGIN_INCLUDES&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;

plugin_LTLIBRARIES         &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; xfyunsynth.la

xfyunsynth_la_SOURCES       &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; src/xfyun_synth_engine.c
xfyunsynth_la_LDFLAGS       &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;UNIMRCP_PLUGIN_OPTS&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
                              &lt;span class=&quot;nt&quot;&gt;-L&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;top_srcdir&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;/plugins/third-party/xfyun/libs/x64 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
                              &lt;span class=&quot;nt&quot;&gt;-lmsc&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-ldl&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-lpthread&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-lrt&lt;/span&gt;
xfyunsynth_ladir            &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;libdir&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;

include &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;top_srcdir&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;/build/rules/uniplugin.am

UNIMRCP_PLUGIN_INCLUDES     +&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-I&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;top_srcdir&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;/plugins/third-party/xfyun/include
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;修改plugins文件夹下Makefile.am文件，xfyun-recog添加内容如下：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;XFYUNRECOG_PLUGIN
SUBDIRS               +&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; xfyun-recog
endif
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;对应地，xfyun-synth添加内容如下：&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;XFYUNRECOG_PLUGIN
SUBDIRS               +&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; xfyun-synth
endif
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;修改conf/unimrcpserver.xml文件，从默认启用demo engine改为启用我们的两个engine。&lt;/p&gt;

&lt;p&gt;xfyun-recog修改如下：&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;engine&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Demo-Recog-1&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;demorecog&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;enable=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;engine&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;XFyun-Recog-1&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;xfyunrecog&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;enable=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;对应地，xfyun-synth修改如下：&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;engine&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Demo-Synth-1&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;demorecog&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;enable=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;engine&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;XFyun-Synth-1&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;xfyunsynth&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;enable=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;同时，如果您已经准备好将UniMRCP Server和FreeSWITCH对接，您应该在conf/unimrcpserver.xml中配置好server的ip地址，即当前unimrcp安装的子网访问地址。&lt;/p&gt;

&lt;p&gt;重新编译安装unimrcp（第二步 3）。&lt;/p&gt;

&lt;p&gt;当你启动时出现如下问题时：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ol&gt;
    &lt;li&gt;Failed to Load DSO: /usr/local/unimrcp/lib/libmsc.so: undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;fix:&lt;a href=&quot;https://www.jianshu.com/p/3286435124a2&quot;&gt;-lstdc++&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ol&gt;
    &lt;li&gt;./unimrcpserver: error while loading shared libraries: libsofia-sip-ua.so.0: cannot open shared object file: No such file or directory&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;fix:&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;在etc/ld.so.conf 内容增加: /usr/local/lib
ldconfig 将ld.so.conf读入cache
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;第四步-配置与验证&quot;&gt;第四步 配置与验证&lt;/h3&gt;

&lt;h4 id=&quot;配置&quot;&gt;配置&lt;/h4&gt;

&lt;p&gt;配置FreeSWITCH&lt;/p&gt;

&lt;p&gt;我们需要将处理用户语音呼入的FreeSWITCH与向xfyun engine发请求的unimrcp server两者连接起来。&lt;/p&gt;

&lt;p&gt;1.配置unimrcp模块并自动加载；&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 编辑/usr/local/src/freeswitch/modules.conf文件，找到要安装的模块，去掉前面的注释符号#&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /usr/local/src/freeswitch
vim modules.conf
&lt;span class=&quot;c&quot;&gt;#asr_tts/mod_unimrcp&lt;/span&gt;
asr_tts/mod_unimrcp

&lt;span class=&quot;c&quot;&gt;# 执行make mod_xxx-install命令，这样就编译相应模块，并把编译后的动态库安装的/usr/local/freeswitch/mod目录下&lt;/span&gt;
make mod_unimrcp-install

&lt;span class=&quot;c&quot;&gt;# 编辑/usr/local/freeswitch/conf/autoload_configs/modules.conf.xml，去掉注释符号，如果没有发现对应模块，则添加&lt;/span&gt;
&amp;lt;load &lt;span class=&quot;nv&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;mod_unimrcp&quot;&lt;/span&gt;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;2.设置profile文件与conf文件；&lt;/p&gt;

&lt;p&gt;在/usr/local/freeswitch/conf/mrcp_profiles目录新建unimrcpserver-mrcp-v2.xml配置文件：&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;include&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- UniMRCP Server MRCPv2 --&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- 后面我们使用该配置文件，均使用 name 作为唯一标识，而不是文件名 --&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;profile&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;unimrcpserver-mrcp2&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;2&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- MRCP 服务器地址 --&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;server-ip&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;192.168.1.23&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- MRCP SIP 端口号 --&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;server-port&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;8060&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;resource-location&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- FreeSWITCH IP、端口以及 SIP 传输方式 --&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;client-ip&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;192.168.1.24&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;client-port&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;5069&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;sip-transport&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;udp&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;


    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;speechsynth&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;speechsynthesizer&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;speechrecog&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;speechrecognizer&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;&amp;lt;!--param name=&quot;rtp-ext-ip&quot; value=&quot;auto&quot;/--&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;rtp-ip&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;192.168.1.24&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;rtp-port-min&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;4000&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;rtp-port-max&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;5000&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;codecs&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;PCMU PCMA L16/96/8000&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Add any default MRCP params for SPEAK requests here --&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;synthparams&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/synthparams&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Add any default MRCP params for RECOGNIZE requests here --&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;recogparams&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;c&quot;&gt;&amp;lt;!--param name=&quot;start-input-timers&quot; value=&quot;false&quot;/--&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/recogparams&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/profile&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/include&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;配置/usr/local/freeswitch/conf/autoload_configs/unimrcp.conf.xml文件：&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;configuration&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;unimrcp.conf&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;description=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;UniMRCP Client&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;settings&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- UniMRCP profile to use for TTS --&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;default-tts-profile&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;unimrcpserver-mrcp2&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- UniMRCP profile to use for ASR --&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;default-asr-profile&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;unimrcpserver-mrcp2&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- UniMRCP logging level to appear in freeswitch.log.  Options are:
         EMERGENCY|ALERT|CRITICAL|ERROR|WARNING|NOTICE|INFO|DEBUG --&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;log-level&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;DEBUG&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Enable events for profile creation, open, and close --&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;enable-profile-events&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;max-connection-count&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;100&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;offer-new-connection&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;request-timeout&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;3000&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/settings&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;profiles&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;X-PRE-PROCESS&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;cmd=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;include&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;../mrcp_profiles/*.xml&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/profiles&amp;gt;&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
  &lt;p&gt;注：1.unimrcpserver-mrcp-v2.xml中server-ip为unimrcpserver启动的主机ip；2.client-ip和rtp-ip为FreeSWITCH启动的主机，client-port仕FreeSWITCH作为客户端访问unimrcpserver的端口，手机作为客户端访问的FreeSWITCH端口默认为5060，两者不同；3.unimrcpserver-mrcp-v2.xml中的profile name应和unimrcp.conf.xml中的default-tts-profile与default-ars-profile的value一致（有些文档的分析中称mrcp_profiles中的xml文件名也必须和这两者一致，实际上是非必须的）。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Attenion: unimrcpserver 和 freeswitch 部署在同一个网段很重要，最好部署测试的时候在同一台物理机器上进行&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;3.配置IVR与脚本。&lt;/p&gt;

&lt;p&gt;在/usr/local/freeswitch/conf/dialplan/default.xml里新增如下配置：&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;extension&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;unimrcp&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;condition&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;field=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;destination_number&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;expression=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;^5001$&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
   	    &lt;span class=&quot;nt&quot;&gt;&amp;lt;action&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;application=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;answer&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;action&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;application=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;lua&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;names.lua&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/condition&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/extension&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;在/usr/local/freeswitch/scripts目录下新增names.lua脚本：&lt;/p&gt;

&lt;div class=&quot;language-lua highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;answer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;--freeswitch.consoleLog(&quot;INFO&quot;, &quot;Called extension is '&quot;.. argv[1]&quot;'\n&quot;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;welcome&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;ivr/ivr-welcome_to_freeswitch.wav&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;menu&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;ivr/ivr-this_ivr_will_let_you_test_features.wav&quot;&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;--&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;grammar&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;hello&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;no_input_timeout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;80000&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;recognition_timeout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;80000&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;confidence_threshold&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;--&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;streamFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;welcome&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;--freeswitch.consoleLog(&quot;INFO&quot;, &quot;Prompt file is \n&quot;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;tryagain&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
 &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tryagain&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
 &lt;span class=&quot;c1&quot;&gt;--&lt;/span&gt;
       &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;play_and_detect_speech&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;menu&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;..&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;detect:unimrcp {start-input-timers=false,no-input-timeout=&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;..&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;no_input_timeout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;..&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;,recognition-timeout=&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;..&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;recognition_timeout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;..&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;}&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;..&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grammar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
       &lt;span class=&quot;n&quot;&gt;xml&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getVariable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'detect_speech_result'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
 &lt;span class=&quot;c1&quot;&gt;--&lt;/span&gt;
       &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xml&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
               &lt;span class=&quot;n&quot;&gt;freeswitch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;consoleLog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;CRIT&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Result is 'nil'\n&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
               &lt;span class=&quot;n&quot;&gt;tryagain&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
       &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
               &lt;span class=&quot;n&quot;&gt;freeswitch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;consoleLog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;CRIT&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Result is '&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;..&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xml&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;..&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;'\n&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
               &lt;span class=&quot;n&quot;&gt;tryagain&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
 &lt;span class=&quot;c1&quot;&gt;--&lt;/span&gt;
 &lt;span class=&quot;c1&quot;&gt;-- put logic to forward call here&lt;/span&gt;
 &lt;span class=&quot;c1&quot;&gt;--&lt;/span&gt;
 &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;250&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
 &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_tts_params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;unimrcp&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;xiaofang&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
 &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;speak&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;今天天气不错啊&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
 &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hangup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;我们需要在/usr/local/freeswitch/grammar目录新增hello.gram语法文件，可以为空语法文件须满足语音识别语法规范1.0标准（简称 &lt;a href=&quot;https://www.w3.org/TR/speech-grammar/&quot;&gt;SRGS1.0&lt;/a&gt;），该语法文件 ASR 引擎在进行识别时可以使用。&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;grammar&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;1.0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xml:lang=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;zh-cn&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;root=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Menu&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tag-format=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;semantics/1.0&quot;&lt;/span&gt;
  &lt;span class=&quot;err&quot;&gt;　　　　&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;xmlns=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;http://www.w3.org/2001/06/grammar&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;　　　　&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;xmlns:sapi=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://schemas.microsoft.com/Speech/2002/06/SRGSExtensions&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;!- 这些都是必不可少的--&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;rule&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;city&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;scope=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;public&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;one-of&amp;gt;&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- 匹配其中一个短语--&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;item&amp;gt;&lt;/span&gt;北京&lt;span class=&quot;nt&quot;&gt;&amp;lt;/item&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;item&amp;gt;&lt;/span&gt;上海&lt;span class=&quot;nt&quot;&gt;&amp;lt;/item&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/one-of&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/rule&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;rule&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;cross&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;scope=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;public&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;one-of&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;item&amp;gt;&lt;/span&gt;到&lt;span class=&quot;nt&quot;&gt;&amp;lt;/item&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;item&amp;gt;&lt;/span&gt;至&lt;span class=&quot;nt&quot;&gt;&amp;lt;/item&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;item&amp;gt;&lt;/span&gt;飞往&lt;span class=&quot;nt&quot;&gt;&amp;lt;/item&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/one-of&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/rule&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;rule&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Menu&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;scope=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;public&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;item&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;ruleref&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;uri=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;#date&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;         &lt;span class=&quot;c&quot;&gt;&amp;lt;!--指定关联的其他规则的节点--&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;tag&amp;gt;&lt;/span&gt;out.date = reles.latest();&lt;span class=&quot;nt&quot;&gt;&amp;lt;/tag&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/item&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;item&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;repeat=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0-1&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;从&lt;span class=&quot;nt&quot;&gt;&amp;lt;/item&amp;gt;&lt;/span&gt;    &lt;span class=&quot;c&quot;&gt;&amp;lt;!--显示1次或0次--&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;item&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;ruleref&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;uri=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;#city&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;tag&amp;gt;&lt;/span&gt;out.city = rulels.latest();&lt;span class=&quot;nt&quot;&gt;&amp;lt;/tag&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/item&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;item&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;ruleref&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;uri=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;#cross&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;tag&amp;gt;&lt;/span&gt;out.cross = rulels.latest();&lt;span class=&quot;nt&quot;&gt;&amp;lt;/tag&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/item&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;item&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;ruleref&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;uri=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;#city&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;tag&amp;gt;&lt;/span&gt;out.city = rulels.latest();&lt;span class=&quot;nt&quot;&gt;&amp;lt;/tag&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/item&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/rule&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/grammar&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;注：lua脚本中，”play_and_detect_speech” 调用了 ASR 服务，”speak” 调用了 TTS 服务。&lt;a href=&quot;https://www.jianshu.com/p/6aa2140937b2&quot;&gt;配置启动中遇到问题&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;验证&quot;&gt;验证&lt;/h4&gt;

&lt;p&gt;下载测试工具：Adore SIP Client&lt;/p&gt;

&lt;p&gt;在App Store（其他手机系统请到对应应用市场）中搜索“Adore SIP Client”，并下载。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/gallery/mrcp/mrcp_01.png&quot; alt=&quot;mrcp_01&quot; /&gt;&lt;/p&gt;

&lt;p&gt;其中SIP IP是FreeSWITCH服务开启的主机IP与port（默认为5060），USER NAME如上所述可选1000-1019，PASSWORD默认为1234。点击”Login”（请确保手机连接的网络与FreeSWITCH在同一个子网内），并拨打5001进行语言测试验证（如果您是从第一步跳转过来的，请拨打5000）。&lt;/p&gt;

&lt;h2 id=&quot;其他相关资料&quot;&gt;其他相关资料&lt;/h2&gt;

&lt;p&gt;FreeSWITCH主页：https://freeswitch.com/&lt;/p&gt;

&lt;p&gt;Unimrcp主页：http://www.unimrcp.org/&lt;/p&gt;

&lt;p&gt;Apache APR：https://apr.apache.org/&lt;/p&gt;

&lt;p&gt;讯飞SDK包导入方式：https://doc.xfyun.cn/msc_linux/SDK%E5%8C%85%E5%AF%BC%E5%85%A5.html&lt;/p&gt;</content><author><name>Kell</name></author><category term="工程" /><category term="语音识别" /><category term="IVR" /><category term="UniMRCP" /><category term="FreeSwitch" /><summary type="html">github非每天登录，如有问题，请联系 wangkaisine@gmail.com，空闲时间回复，谢谢！</summary></entry><entry><title type="html">在CentOS上安装SGE</title><link href="http://kellwang.com/%E5%B7%A5%E7%A8%8B/2018/10/10/%E5%9C%A8CentOS%E4%B8%8A%E5%AE%89%E8%A3%85SGE/" rel="alternate" type="text/html" title="在CentOS上安装SGE" /><published>2018-10-10T10:22:06+00:00</published><updated>2018-10-10T10:22:06+00:00</updated><id>http://kellwang.com/%E5%B7%A5%E7%A8%8B/2018/10/10/%E5%9C%A8CentOS%E4%B8%8A%E5%AE%89%E8%A3%85SGE</id><content type="html" xml:base="http://kellwang.com/%E5%B7%A5%E7%A8%8B/2018/10/10/%E5%9C%A8CentOS%E4%B8%8A%E5%AE%89%E8%A3%85SGE/">&lt;p&gt;Install SGE On CentOS&lt;/p&gt;

&lt;p&gt;本工程主要介绍了如何在CentOS上安装并使用SGE（Sun Grid Engine）。使用配合使用NFS的SGE搭建计算集群，可以实现任务多机器并行运行，例如语音识别开源框架kaldi的使用。&lt;/p&gt;

&lt;h2 id=&quot;安装&quot;&gt;安装&lt;/h2&gt;

&lt;p&gt;SGE安装包下载地址：  https://arc.liv.ac.uk/downloads/SGE/releases/8.1.9/sge-8.1.9.tar.gz&lt;/p&gt;

&lt;h4 id=&quot;主控节点安装&quot;&gt;主控节点安装&lt;/h4&gt;

&lt;p&gt;命令行执行，修改hostname&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;hostnamectl set-hostname qmaster.local
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;命令行执行，修改hosts文件，添加主控节点和两个计算节点信息&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vi /etc/hosts
192.168.98.134 qmaster.local qmaster
192.168.98.135 compute01.local compute01
192.168.98.136 compute02.local compute02
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;命令行执行，创建共享目录&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; /BiO/src
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;命令行执行，安装epel源&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;yum &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;epel-release
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;命令行执行，安装依赖库&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;yum &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;jemalloc-devel openssl-devel ncurses-devel pam-devel libXmu-devel hwloc-devel hwloc hwloc-libs java-devel javacc ant-junit libdb-devel motif-devel csh ksh xterm db4-utils perl-XML-Simple perl-Env xrog-x11-fonts-ISO8859-1-100dpi xrog-x11-fonts-ISO8859-1-75dpi
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;命令行执行，添加sgeadmin用户组，及sgeadmin用户&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;groupadd &lt;span class=&quot;nt&quot;&gt;-g&lt;/span&gt; 490 sgeadmin
useradd &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; 495 &lt;span class=&quot;nt&quot;&gt;-g&lt;/span&gt; 490 &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; /home/sgeadmin &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; /bin/bash &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;SGE Admin&quot;&lt;/span&gt; sgeadmin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;命令行执行，修改sudo文件，添加一行配置&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;visudo
%sgeadmin &lt;span class=&quot;nv&quot;&gt;ALL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;ALL&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; NOPASSWD: ALL
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;命令行执行，下载并编译SGE。（如果您下载不了SGE安装包，请到本工程/softwares目录下获取）&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /BiO/src
wget https://arc.liv.ac.uk/downloads/SGE/releases/8.1.9/sge-8.1.9.tar.gz
&lt;span class=&quot;nb&quot;&gt;tar&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-zxvf&lt;/span&gt; sge-8.1.9.tar.gz
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;sge-8.1.9/source/
sh scripts/bootstrap.sh &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; /.aimk &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; /.aimk &lt;span class=&quot;nt&quot;&gt;-man&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SGE_ROOT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/Bio/gridengine &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$SGE_ROOT&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo &lt;/span&gt;Y | ./scripts/distinst &lt;span class=&quot;nt&quot;&gt;-local&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-allall&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-libs&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-noexit&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;chown&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-R&lt;/span&gt; sgeadmin.ageadmin /BiO/gridengine
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;命令行执行，安装SGE qmaster节点&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$SGE_ROOT&lt;/span&gt;
./install_qmaster
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;安装过程中，需要同意一些默认配置。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;press enter at the intro screen&lt;/p&gt;

  &lt;p&gt;press “y” and then specify sgeadmin as the user id&lt;/p&gt;

  &lt;p&gt;leave the install dir as /BiO/gridengine&lt;/p&gt;

  &lt;p&gt;You will now be asked about port configuration for the master, normally you would choose the default (2) which uses the /etc/services file&lt;/p&gt;

  &lt;p&gt;Accept the sge_qmaster info&lt;/p&gt;

  &lt;p&gt;You will now be asked about port configuration for the master, normally you would choose the default (2) which uses the /etc/services file&lt;/p&gt;

  &lt;p&gt;Accept the sge_execd info&lt;/p&gt;

  &lt;p&gt;Leave the cell name as “default”&lt;/p&gt;

  &lt;p&gt;Enter an appropriate cluster name when requested&lt;/p&gt;

  &lt;p&gt;Leave the spool dir as is&lt;/p&gt;

  &lt;p&gt;Press “n” for no windows hosts!&lt;/p&gt;

  &lt;p&gt;Press “y” (permissions are set correctly)&lt;/p&gt;

  &lt;p&gt;Press “y” for all hosts in one domain&lt;/p&gt;

  &lt;p&gt;If you have Java available on your Qmaster and wish to use SGE Inspect or SDM then enable the JMX MBean server and provide the requested information - probably answer “n” at this point!&lt;/p&gt;

  &lt;p&gt;Press enter to accept the directory creation notification&lt;/p&gt;

  &lt;p&gt;E nter “classic” for classic spooling (berkeleydb may be more appropriate for large clusters)&lt;/p&gt;

  &lt;p&gt;Press enter to accept the next notice&lt;/p&gt;

  &lt;p&gt;Enter “20000-20100” as the GID range (increase this range if you have execution nodes capable of running more than 100 concurrent jobs)&lt;/p&gt;

  &lt;p&gt;Accept the default spool dir or specify a different folder (for example if you wish to use a shared or local folder outside of SGE_ROOT&lt;/p&gt;

  &lt;p&gt;Enter an email address that will be sent problem reports&lt;/p&gt;

  &lt;p&gt;Press “n” to refuse to change the parameters you have just configured&lt;/p&gt;

  &lt;p&gt;Press enter to accept the next notice&lt;/p&gt;

  &lt;p&gt;Press “y” to install the startup scripts&lt;/p&gt;

  &lt;p&gt;Press enter twice to confirm the following messages&lt;/p&gt;

  &lt;p&gt;Press “n” for a file with a list of hosts&lt;/p&gt;

  &lt;p&gt;Enter the names of your hosts who will be able to administer and submit jobs (enter alone to finish adding hosts)&lt;/p&gt;

  &lt;p&gt;Skip shadow hosts for now (press “n”)&lt;/p&gt;

  &lt;p&gt;Choose “1” for normal configuration and agree with “y”&lt;/p&gt;

  &lt;p&gt;Press enter to accept the next message and “n” to refuse to see the previous screen again and then finally enter to exit the installer&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;命令行执行，安装NFS，将主控节点目录共享&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;yum &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;nfs-utils
vi /etc/exports
/BiO 192.168.98.134/24&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;rw,no_root_squash&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;命令行执行，&lt;/p&gt;
&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;systemctl start rpcbind nfs-server
systemctl &lt;span class=&quot;nb&quot;&gt;enable &lt;/span&gt;rpcbind nfs-server
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;至此qmaster主控节点安装配置完毕！&lt;/p&gt;

&lt;h4 id=&quot;计算节点安装以compute01为例&quot;&gt;计算节点安装（以compute01为例）&lt;/h4&gt;

&lt;p&gt;命令行执行，安装依赖库&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;yum &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;hwloc-devel
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;命令行执行，修改hostname&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;hostnamectl set-hostname compute01.local
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;命令行执行，修改hosts文件，添加主控节点和两个计算节点信息&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vi /etc/hosts
192.168.98.134 qmaster.local qmaster
192.168.98.135 compute01.local compute01
192.168.98.136 compute02.local compute02
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;命令行执行，添加sgeadmin用户组，添加sgeadmin用户&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;groupadd &lt;span class=&quot;nt&quot;&gt;-g&lt;/span&gt; 490 sgeadmin
useradd &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; 495 &lt;span class=&quot;nt&quot;&gt;-g&lt;/span&gt; 490 &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; /home/sgeadmin &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; /bin/bash &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;SGE Admin&quot;&lt;/span&gt; sgeadmin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;命令行执行，安装NFS，并启动服务&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;yum &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;nfs-utils
systemctl start rpcbind
systemctl &lt;span class=&quot;nb&quot;&gt;enable &lt;/span&gt;rpcbind
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;命令行执行，创建共享目录，将主控节点目录共享至计算节点&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; /BiO
mount &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; nfs 192.168.56.101:/BiO /BiO
vi /etc/fstab
192.168.98.134:/BiO /BiO nfs defaults 0 0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;命令行执行，安装计算节点&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SGE_ROOT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/BiO/gridengine
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SGE_CELL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;default
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$SGE_ROOT&lt;/span&gt;
./install_execd
&lt;span class=&quot;nb&quot;&gt;cp&lt;/span&gt; /BiO/gridengine/default/common/settings.sh /etc/profile.d/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;测试&quot;&gt;测试&lt;/h2&gt;

&lt;p&gt;命令行执行，在qmaster或两台compute01、compute02均可执行qhost，查看集群主机列表&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;qhost
HOSTNAME        ARCH       NCPU NSOC NCOR NTHR  LOAD  MEMOUT  MEMUSE  SWAPTO   SWPUS
&lt;span class=&quot;nt&quot;&gt;------------------------------------------------------------------------------------&lt;/span&gt;
global          -             -    -    -    -     -       -       -       -       -
compute01       lx-amd64     32    2   16   32  2.07  377.7G   42.4G    4.0G   82.5M
compute02       lx-amd64     32    2   16   32  0.04  377.7G    2.8G    4.0G   77.2M
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;可以通过提交一个简单的任务（job），测试SGE的功能。&lt;/p&gt;

&lt;p&gt;这个任务是打印当前执行及其的Linux内核版本号。在任意一个计算节点（如compute01），命令行执行，vi编辑任务执行脚本&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vi name.sge
&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;uname&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;命令行执行，使用qsub提交任务并执行&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;qsub uname.age
You job 1&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;uname.age&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; has been submitted
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;执行完毕后，您可以在执行任务的路径下看到任务运行得到的日志输出（包括错误日志）&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;ls
&lt;/span&gt;uname.sge.e1  uname.sge.o1
&lt;span class=&quot;nb&quot;&gt;cat &lt;/span&gt;uname.sge.o1
Linux compute01.local 3.10.0-862.el7.x86_64 &lt;span class=&quot;c&quot;&gt;#1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 GUN/Linux&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;sge操作&quot;&gt;SGE操作&lt;/h2&gt;

&lt;p&gt;qhost  查看集群主机列表&lt;/p&gt;

&lt;p&gt;qstat  查看集群任务执行状态（可使用watch -n 10 -d qstat 持查看执行状态）&lt;/p&gt;

&lt;p&gt;qdel [jobid] 通过jobid删除任务&lt;/p&gt;

&lt;p&gt;qsub  提交任务
  qsub -cwd ./run.sh
其中-cwd表示以当前目录作为执行目录，否则命令将以sgeadmin用户目录作为当前目录。&lt;/p&gt;</content><author><name>Kell</name></author><category term="工程" /><category term="语音识别" /><category term="kaldi" /><category term="分布式计算" /><summary type="html">Install SGE On CentOS</summary></entry><entry><title type="html">放学路上</title><link href="http://kellwang.com/%E6%96%87%E5%AD%A6/2017/06/12/%E6%94%BE%E5%AD%A6%E8%B7%AF%E4%B8%8A/" rel="alternate" type="text/html" title="放学路上" /><published>2017-06-12T08:15:31+00:00</published><updated>2017-06-12T08:15:31+00:00</updated><id>http://kellwang.com/%E6%96%87%E5%AD%A6/2017/06/12/%E6%94%BE%E5%AD%A6%E8%B7%AF%E4%B8%8A</id><content type="html" xml:base="http://kellwang.com/%E6%96%87%E5%AD%A6/2017/06/12/%E6%94%BE%E5%AD%A6%E8%B7%AF%E4%B8%8A/">&lt;p&gt;&lt;br /&gt;
小学时候上学走路去，放学走路回。&lt;/p&gt;

&lt;p&gt;上学第一天，我爸骑着“28大驴”载着我，那时候我还只能坐在前面的横梁上。到学校门口，他告诉我：”以后就不送你了，你自己记着回家的路。”我默然，结果后来真的没有再接送过我。&lt;/p&gt;

&lt;p&gt;小学的回家路上，小伙伴很多，一个人说“谁最后一个到前面的商店谁是王八蛋。”然后大家都背着书包往前跑。谁要是跑最后一名，还真会被骂一路的“王八蛋”。所以，我那时跑着摔倒了，磕破了皮，都二话不说立刻站起来继续跑，为的就是不落最后，何况，我还姓“王”，更不能当这个最后。&lt;/p&gt;

&lt;p&gt;学校门口有一个推着三轮车卖东西的老大爷，总是穿着一身深蓝的上衣裤子，和一顶深蓝的鸭舌帽。我们一两个在大爷车这边假装买东西，大爷只要看到你把东西拿到手里了，就会过来，问你要不要。然后就我们拿了东西就跑，老大爷紧忙赶过来抓，我们跑出一两步就把东西扔到大爷手里，大爷顾他的东西，连忙俯身在地上捡，也不知道自己已经离开了三轮车，我们另外的两个人，就在他摊位另一边拿走了东西，这次是真的。&lt;/p&gt;

&lt;p&gt;那时候除了“大宝”可以天天见，无论刮风下雨大爷也都能见。记得有一个东西叫“大礼包”。一块、两块的两种，里面是大爷自己包装的各种玩具，谁也不知道自己会买的大礼包会装什么，可能有陀螺，拼图，卡片，弹力球。那时候我零花钱少的很，两块钱买一个大礼包就是一学期的梦想。终于拿着两块钱，买了最贵的大礼包，精心选了一个最鼓鼓囊囊的，开开心心的在教室打开，取出了一团报纸。后来六年级的时候，有一段时间大爷就没有出来摆摊，说是他生病或者怎么着，再后来就是他儿子在那里了。&lt;/p&gt;

&lt;p&gt;三四年级那时候，路边有公共电话厅，我们挨着个用沿途的公共电话。拨打10000号的服务台热线，每次接听人工电话的姑娘开口说一话，我就笑着把电话挂了。有一次下午放学，一个姑娘接通了电话，我让她等一下，拿出了我没做完的数学作业本，读了一道没算完的数学题。“阿姨，能不能帮我算一下这道题啊，我们这个是列一元一次方程的题哦！”没想到，那天我就是在放学路上做完了数学作业。&lt;/p&gt;

&lt;p&gt;快到家的一个拐角有一家大饭店，那时候对我来说真是豪华的地方，后来长大了才知道，那不过是一家自助餐，那家门口有一排石雕像，小小的半身人像和一些动物，我走过去时，总要用手点一点它们的脑袋。有一个微笑的半坐的人，我也总会伸出手，“啪啪啪”的拍打它的脸。直到现在，那家餐厅门口的那个被“打脸”的人还在哪里半坐者，脸颊已经被摸的透亮。&lt;/p&gt;

&lt;p&gt;我那时候自己买不起可口可乐，夏天的时候可乐有活动，瓶盖里面会中奖，听装的可乐或雪碧。记得有好几次，在回家的路上，一路把一只可乐瓶踢到家门口。自己偶然间打开瓶盖，发现中了奖，我就把瓶盖塞到书包一侧，下午去学校门口的商店兑换。兑换的听装可乐，就摆在自己课桌上，听课，写作业，迟迟也不打开它。&lt;/p&gt;

&lt;p&gt;上初中第一天，我坐第一排，听我前面坐“特座”同学说，有一次他和他哥在回家路上，他哥用车子载着他，路边押钞车在马上要下班的银行里取钱，车后门的两个警卫持枪观望，在自行车后座的他用手指比划成手枪的模样，手指对着其中一个警卫“biubiu”的喊了半天。警卫把手中的抢上了膛，对着天，空放了一枪。我那同学，当时就吓尿，拍着他哥的屁股，赶紧骑上车跑了。那时候西安的押运配枪是“来复”，那种只装两发子弹，打中人头能打爆，打中身子能打退整个人好几米。&lt;/p&gt;

&lt;p&gt;小学上下学不让骑自行车，六年级的男生都把骑来的自行车存在学校旁边的社区里。我上初中，每天都骑自行车，我骑车子非常匪，当然也就费车子。每年都买一辆二手车，记得有一辆掉漆严重的黑车，我爸爸用宝蓝色的漆给它刷了全身，没有设备打磨光亮，就像是抹在墙上坑坑洼洼的底漆，看起来真的“土爆了”。我就是骑着这个车子，在新修好的西二环的高架桥上飞奔的。&lt;/p&gt;

&lt;p&gt;那时候初中学生放学最怕什么，被高中生抢劫。哪些经常去“摇杆”游戏厅的高中生就会拦住骑着比较好的自行车学生，就是我骑的这车子，都有人劫。还好为数不多的三次都让让我逃脱了。&lt;/p&gt;

&lt;p&gt;有一次我被在路边拦住，留着长发非主流的哥哥对我说：“哥哥借的车子到前面买包烟。”&lt;/p&gt;

&lt;p&gt;我说，“你旁边这个，就是商店啊。”&lt;/p&gt;

&lt;p&gt;“我刚问了，没有白沙。”&lt;/p&gt;

&lt;p&gt;然后，我就对着离我有点距离的商店的老板，“老板，老板！你这儿有没有白沙。”&lt;/p&gt;

&lt;p&gt;老板说，“有么”。&lt;/p&gt;

&lt;p&gt;然后，我就告诉老板，“这个哥哥要买白沙。”&lt;/p&gt;

&lt;p&gt;当时他也是懵了，没反应上来，我便骑上车子溜了。&lt;/p&gt;

&lt;p&gt;然后，就没有然后了。&lt;/p&gt;

&lt;p&gt;后来啊，高一的时候买了一辆看起来不怎么样，但是做工很好、很贵的德国自行车，骑到我大学快毕业，6年多，依然看起来像新的，只有后车灯裂了，车漆一点都没掉，在西交大的东南门被偷了。&lt;/p&gt;

&lt;p&gt;其实，更多有趣的，细节的小事，在我的脑海里慢慢浮现出来了，有机会再和大家讲讲吧。&lt;/p&gt;</content><author><name>Kell</name></author><category term="文学" /><category term="生活" /><summary type="html">小学时候上学走路去，放学走路回。</summary></entry></feed>