前言
各位好,我是夜莺的作者,江畔。
首先,非常感谢各位对夜莺鹤的支持,说实话,我确实没有想到居然会有那么多的人关注并且想要尝试来使用夜莺的。
这让我很开心,也让我有了一点压力,因为夜莺最开始只是我自己 自用的一个东西。一来说明我的东西确实得到了其他人的认可,二来就是我需要更加注重夜莺的质量把控。
我是谁
我先介绍一下我是谁吧,一般来说大家都称呼江畔,或者二阶堂希罗(?),我大约是2024年开始进入码圈的(实际加群的时间更早,但真正开始把打字当爱好则是24年),一开始学的是小鹤音形,然后因为小鹤的各种问题(比如缺词,有简无全等等),我放弃了小鹤,转而想要学习一门形码,一开始我是想学新世纪五笔的,后来在贴吧冲浪的时候,了解了虎码,就开始学虎。
虎码的时候我是一个打单的用户,巅峰的时候单字水文可以到200,虎杯,jbs的生稿成绩可以在170左右,从这个成绩来看,我大概是一众输入法者里相对比较菜的吧(笑。
动机
为什么想要开发夜莺,这个就不得不提到我的转码经历了。一个是虎转矧,一个是简单鹤的三进三出。
我是一个喜欢新鲜事物的,喜欢自己琢磨东西(或者说,折腾)的人,虎转矧的时候,就是觉得“矧码是神人学的”这个口号有点吸引我,于是我去学了。
说实话,我其实学会了矧码,但这个矧很快让我发现了一个问题:我在被输入法绑架,简单来说就是,矧是多重简码的格式,比如像是没有之类的词,存在简词,可以直接出来上屏,对于矧来说,没有是l然后次选,矧的次选是e,也就是le就直接上屏了。而没这个单字则是lv加空格。这就出现了打没比打没有更慢的情况。其实这个是无可厚非且在竞速为目标的形码中十分常见的情况。但是对我来说,我在日常聊天,水群,打字写文章的时候,几乎没用过“没有”这个词,而是一直用“没”,因为矧的这个输入法的设置,我开始习惯于用“没有”这个词来代替没这个字。
对我来说,这是一个有点别扭的感觉,因为学了一个新的输入法,然后导致我的输入习惯也变了,我就有了一种强烈的“被输入法绑架了输入习惯”的感觉。
再然后就是,矧的小指负担确实有点大,我个人本来就是小指似乎有点问题,所以我很不习惯。于是最终我没能坚持下来,回到了虎的怀抱。
然后就是简单鹤的三进三出,这个其实很有意思,我每次进的理由都是查不多的,每次出的理由却不一样。
想学简单鹤的原因就是:我想学音形。是的,理由就是这么的简单。可能是因为当时最开始学双拼的时候,就被音形这种思想给吸引了吧,这导致我一直对音形方案自带好感滤镜。
而没有坚持下来的原因则是不同的: 第一次,因为没有理解音形的用法,当成了一种“特殊的形码”来用了。体验很不好,于是放弃了 第二次,是因为知道了简单鹤的理念之后(也就是挂接辅助码那一套方法),开始上手,然后又遇到了“输入法绑架输入习惯”的问题 第三次,简单鹤的字词避开的理念是个双刃剑,可能是我个人原因,我经常需要用到那些四码的字,让我不舒服。
夜莺的起步
夜莺的缘起就是第三次学简单鹤,那个时候我在群里发现了简单鹤的1.0的纯单版本,说可以用来diy,于是我就拿来用了,然后diy着diy着,就突然有了一个“要不干脆自己做一个真正符合自己需求”的码吧。
实际上我对音形的码的要求很简单:一,可以挂接在搜狗之类的大厂上(原因是我想用搜狗的皮肤),二,不多重(或者说尽量不多重) 三,不搞强制的字词分离,四:在以上的前提上保证手感要好,三码率等数据要高。
这几条听起来似乎不难,但实际上,市面上居然没有对应的方案可以用,这其实是一个不好的信号,第一个可能是:这四个加起来太难实现了,所以没人做。第二个可能是:音形固有的缺陷导致上述条件里的某些条件不可能实现(事实证明这个可能对了一小半) 无论是哪一种可能,都代表夜莺的起步不会太顺利。
夜莺的思路
夜莺一开始的思路很简单,用算法大力出奇迹,最开始就是按照简单鹤1.0的指标去跑的,后来听了B佬的想法,把字词冲突放在一起跑,最开始跑了版,我觉得可以了,但是被鲸凉大佬指出许多问题,然后开始回炉。
再后来就是将手感,字词无重,以及三码率全都兼顾起来,一开始,我以及这三个指标是无法同时被兼顾的,但后来发现,算法其实可以做到这三个全要,那既然如此,剩下的就是时间问题了,之后就是进行炼蛊式的跑,最终跑出来了一个各方面看都很不错的版本。
夜莺的优点
三码率高的优势是辅助码的效率非常高,以及日常使用的时候也比较省码长。
手感的话,受制于音的部分,肯定是做不到虎之类的形码的手感的,但至少也是可以和简单鹤对齐的样子。
相似即归并,说白了就是,只要是看起来相似的部分,我都归到了一起,比如,宝盖头,秃宝盖,党字头,学字头,帝字头,囊字头,全在一起,只要是个”盖”,那就都在一起。春,差,泰,养,拳,这些字的头,也全都归并在了一起,
字词(基本)无重是夜莺最大的特点,不要小看这个,我在日常使用的时候,对于常用的字,基本上可以做到“不确定有简那就打全码”和“想到一个常用的词,直接打直接出”,这两个结合在一起会有爽感的。
没有多重,不用记候选其实不是主要的原因,最主要的原因是,没有多重,就意味着,夜莺有了更多的空位来给音形用户魔改,加入更多的单简,更多的简词序列,这都是有可能的。说白了就是“魔改的空间更大”
夜莺的缺点
夜莺不是一个完美的音形,或者说,远远谈不上完美,虽然我有自信说夜莺在性能上已经是最好用的那一批之一了,但夜莺的不足还是肉眼可见的
一,字根过量
墨大和我提过一个观点:音形大部分的时间是在打词,如果字根是乱序的,而且字根数量比较多的话,忘根几乎是必然的。 我不敢说这是错的,因为我夜莺的字根确实很多,算上归并还有170多个,还是乱序,我不能保证玩家在长期使用夜莺后,会不会出现忘根问题,以及,忘了根的情况严不严重。
二,冗余字根
这个也是一个问题,夜莺有如厉,音,利,居,缶,莫,等等看起来似乎可以进一步拆分的根,这样会让玩家在实际打字的时候,会想不到这些字的打法。至于方法,我做了一个必拆字的练习表,把所有的字根都按首尾选了一个字来练习,这样那些字根,会随着练习记住,但这样做的实际效果还是存疑的。
三,仍然有一些字根没有做到完全的“相似即归并”的原则。 这个其实真的是我力竭了,汉字的字型,高情商叫千变万化。低情商说法那就不能过审了。比如,用,月,风,以及这三个字的框,还是没有归并,草字头,井字根,在不同的地方,我曾经尝试把所有像草头的东西都归在一起,就是不管几个横,几个竖,都放在一起,然后归着归着,就发现这个字已经变成井了,可井自己又是另一个根,直接积重难返了。
四 ,过度归并 比如上文说道,春,差,泰,养,拳这些的头都归在一个地方,理由是他们都是上面的“一坨”东西,但是我忘了,这些部件有时候也不是看起来在那些地方的:拜,掰,这些字,他的左边其实是看的上面,这两个都是手的变体,可是看的上面已经给了i,这个时候直觉拆“手”的变体就不对了,因为手在另一个键上。还有美这个字,上面这个其实也不能一下子反应过来:美和姜的上面是一样的,
五,手感质量没有实际验证
手感可以通过数据测出来,但是,手感也依赖于实际使用的感觉,在没有长期使用的经验之前,无法断定夜莺的手感就是没有问题的。
关于音形
我一直觉得音形没有被开发完全,音形的潜力我觉得还是很不错的。 虽然音形的问题也很突出,词重,手感,离散,一个个都是大问题。为了解决这些问题,大家想的方案也是五花八门 比如反过来的形音, 比如加了音调的音 比如现在接近根源的音调和笔画检索的根源码。 方法真的很多,有的方法(比如B佬的根源码)确实很有亮点,解决了音形的很多问题。
但我个人还是喜欢让音的部分保持不变,没有什么特别的理由,就是个人的习惯,这注定了夜莺是戴着镣铐跳舞。夜莺注定无法解决词重的问题。
但除此之外,我能想到的,可以进行优化的地方,我都有尝试去优化过,还考虑过“第二码和第三码的过度手感”,以及“五码定二字”的指标等等,这些指标最终都没有使用,要么是效果不大,要么是可以被其他的指标包含。
其他的碎碎念
夜莺肯定还会继续更新的,但是不会那么频繁了,我可能不会再关于字和词的顺序了
下一步的考虑是容错和删根,以及如果有可能的话,会考虑加入一些呼声很高的根 如“万 午”,
一,关于字根:
我在设计夜莺,为夜莺选字根的时候,发现了一个有趣的现象。音型的字根主流是取首末,而取首末这个方式,带来了一些意想不到的结果。
举个例子: 卸,缺,舞,这三个字,如果我们希望这三个字的拆分直观,我们会怎么办?
最直接的办法就是把卸的左边,缺的左边,还有舞的上面都取出来,当根。这样直观了,但是多了三个根,不是太好记。
然后我想到了一个有趣的事:如果我没有这三个根,我会怎么取? 卧人,也就𠂉这个字根。
这时候你就会发现,这三个字的左边其实都有一个更基本的元素, 那么我可以直接取卧人这个根,就可以满足拆分了。 那么这样会不直观,又该怎么办呢?
我想到了归并, 我可以设计一个主根𠂉,然后让这个根归并上缶,卸左边,舞的上边,全都归并到一个键里去,
说白了就是,这个首根,到底取到多大,真的到了码表层,其实是无所谓的,卸就是 一个左边的部件加上一个卩 , 至于左边的这个是卧人,还是卸的完整左边,如果他们都归在一个键上,那其实是完全无所谓的。
同理,我之前考虑过加入林,炎之类的根,后来都取消了,理由就是如此:如果这个字含有林部件,如果我把林和木放在一起,那么取谁都一样了。
我认为这是一种兼顾直观和好记的方法,忘了根不要紧,当你记不起来这个字有更大的根的时候,你可以去尝试的拆这个根更小的部分,然后你发现拆出来了,这何尝不也是一种让玩家在学习上不花太多力气的点呢?
可惜,非常遗憾,这个思路在夜莺里并没有实装,主要原因是我忘了(我是fw,对不起.jpg)
直接的证明就是,群友讨论关于耕这个字左边的耒怎么拆的讨论, 有的人认为可以拆一,有的人认为可以拆二,有的认为可以拆三,还有人觉得可以加一个耒根 而夜莺中,一,二,三,这三个根,其实全在一个键N上,于是我做了一个事:直接让N这个键多了一个耒根,这个加根,在码表层面,其实就是零影响,不管是拆什么,耕都是ggn,
同样的,末根也可以这样来,但是末根的问题比较复杂,主要的原因就是,末根不如首根那么直观,比如尧这个根,鲸凉大佬认为可以拆兀,而我当时其实压根没有看到兀这个部分,我的直觉是拆儿子的儿,但是我又觉得儿不直观,于是加了一个尧根。也就是说,末根到底哪个部分直观,这个其实在不同人那里有争议,所以末根这里要考虑的东西可能还不一样,关于这里我也没有做更深的研究。 (值得一提的是:无论是兀根,还是儿根,其实都在一个键上,这两个本来就是归并的,如果尧也放在同一个键上,那将是绝杀,可惜尧不在)
关于字词无重, 这个是在我算码的时候突然想到的,我们都知道,二字词组用音形打的时候,会退化成双拼,也就是说,我们设计的形的部分就管不到这个词了。 但我发现了另一个事,就是,这个词,其实也是被音限制的。 字音韵的总数大约是400多个,但是这就不代表,所有的二字词的分布加起来,就是16万种,常见的词语的读音组合,其实并没有那么多 我做过一个统计,统计了前20万二字词语的码位组合,结果令人意外:20万个词组中,只有大约7万个音韵组合。与之相对的,是形码例如虎码,他们的字母组合反而达到了13万个以上,而一般来说,我们用chai之类的算法来设计码元排列的时候,如果你考虑字词避重,真正需要拿进来算的,也就是六万个词语左右,所以我萌生了一个想法:相同音韵组合的词对于音形来说,其实没有太大的贡献,因为他们就是一样的,所以我的想法是,这六万个词,我们选四万左右的常用词,然后专门挑选一些,没有出现过的陌生音韵组合的词组,这样的话,我们可以几乎覆盖掉所有常见的词语的音韵组合,从而使得音形在字词避重的方面起到一个“四两拨千斤“的作用。 而事实证明,这个方法是有效的,夜莺的字词避重可以说,就是市面上现有音形中最好的一款,我很有信心说出来这个话
关于挂接和形码模式
挂接就是把这个东西放在搜狗,手心,rime上,然后平时当双拼打,在打对应的单字的时候用自定义短语来实现精准选字。 挂接又分成要不要辅助码,要不要简词,要不要单字锁定等等。
形码模式就是俗话中的四码定长版本,假装这是一个形码,只是这个码的前两位恰好和双拼一样而已。
就目前对音形的理解来看,挂接无论是日用方便,还是竞速上限,都相当的不错,我推荐也只推荐使用挂接打法。至于更多的音形挂接打字细节可以参考简单鹤作者所著的“音形无上圣经”和鲸凉鹤作者的“词库说明”。
那我为什么要留形码模式呢,原因很简单,当前音形最强者还是以形码模式居多,但是他们都是起源于小鹤,而小鹤的作者是推崇形码模式的。所以,这里不能排除“路径依赖”的问题。我们不能假设“如果他们当初就使用挂接会不会更强”。这个是无法验证的事情,也许形码模式在上限这一块确实有其独特的优势。另一点就是岭凉大佬认为在学习初期使用形码模式可以养成良好的拆词拆句的习惯和快速熟悉字形,所以我保留了这个模式。
关于单字
音形需要练单字吗, 对于我这个打单党出身的人来说,这个答案其实毫无疑问是肯定的,但是问题就在于,这个单字要练到什么程度?
我不知道其他的音形作者对于单字的态度,我只知道他们对这方面的理解五花八门,理由往往是“日常使用”“看你追不追求速度”这个东西
其实我的建议是:不管是不是日常使用,不管目前是跟打200速以上,还是日常用起来不卡,都要练单字。
很多人会质疑这个,说日常使用为什么要练,够用不就行了吗。
我的想法是这样的:你以为的够用其实是不够用的。假设熟练使用夜莺的人用夜莺的爽感是100,那么对于完全不练单字,只差不多记了字根的人的爽感可能是40,有的人会觉得:这个40已经足够爽了。但实际上,“这个40也很爽”恰恰来自于:你从未体验过40以上的爽感是什么样的,所以你才会觉得40也很爽,就像打游戏时候的屏幕刷新率,所有觉得高刷新率没用,不爽的人,都是没有高刷屏的人(60hz和144hz连滑动鼠标的感觉都是不一样的),这是一个道理。
所以我很推荐单字要练起来,至少得养生6击以上吧,你的投入会快速的转化为正反馈,这个是一个绝对不亏的交易。
最后的话
说实话,夜莺走到今天这一步,很让我意外,现在这个时代,音形似乎已经有点颓势了,相比于形码圈子,能整的花样是越来越多,不仅花哨,而且活好。
虎码的作者搞出来了一个“根源音码”,我看过那个理念,我认为那个理念可行也可靠。
但我大概不会去研究那个东西了,夜莺是我投入了心血的孩子,我肯定会好好维护她,即使将来有一天,夜莺也许不再维护了,但是,如何“诞生”一个夜莺的思路,也全都在里面了,我已经在git上开源了夜莺的一切,从字根的选择,到退火的思路,再到各种小想法,全都在里面,我个人还是希望音形这个路字可以继续发展下去,无论是新的音形也好 ,还是“根源”也好。
鸣谢
最后是感谢这一路上帮助过我的人
鲸凉鹤作者鲸凉大佬,在炼根的时候教我怎么分析按键热力图,怎么看手感,以及在定稿之后,对夜莺的单字,简词顺序进行调整,出了相当多的力
感谢百鹤岛群友 阿霄,在夜莺出来后,帮我捉虫,寻找夜莺的拆分里的不合理的地方,找出各种各样的bug,不厌其烦的去看拆分(几天看完了8105所有字的拆分,我不得不跪下来看阿霄的反馈.jpg)
感谢简单鹤的作者简单,给我指点字根的选取和一些实际打字时的原则和方法。
感谢虎码作者B佬,B佬的思维总是超脱于现在,提出独特的见解,不然现在的夜莺也不会有这样的字词避重。
感谢魔虎的作者晴师,没有他的魔虎方案,就没有夜莺的rime整句包
感谢claude 和chatGPT,不到一个月给我搓了十万行代码(?)
以及所有愿意使用夜莺的人。