我有两个名字很容易被搞混:一个是公司名,一个是产品名。它们读音接近,语音识别经常把其中一个听成另一个。
问题不在于识别错——错了我改就是。问题在于:事后我自己也分不清当时说的是哪个。
盯着屏幕上那行字看半天,我说的到底是公司还是产品?想不起来。
我的第一个想法是错的
最直觉的做法:在识别的时候弹出来问。「这两个词我拿不准,你选一个。」
我一开始也是这么想的。后来去查了识别接口到底返回什么,发现这条路从根上就走不通。
接口只给最终文字,不给置信度,也不给备选词。它不会说”这里我拿不准”。所以”我可能听错了这三个词”这句话,系统编不出来——只能拿输出去和词库比对,猜哪个可疑。
在一个猜出来的怀疑上打断用户,代价和收益完全不成比例。
就算真有置信度也不该弹。按住说话、松开出字,这是这个产品的全部价值;弹窗要求你从”思考内容”切换到”思考拼写”,而你正在写东西。更要命的是频率:一个经常出现的确认框,会训练用户闭着眼点掉它——到那时,真正重要的那次提示也会被一起点掉。
还有一层更根本的:说话是流式的,注意力在下一句上,你当下未必分得清自己想的是哪个词。但读那句话的时候,一眼就知道。判断力在阅读时最强、在口述时最弱——把选择放在口述中,等于挑最差的时刻去问。
真正的答案,一直躺在我们没看的地方
查接口的时候我发现了另一件事:返回里除了文字,还有一个 words 数组——每个词的起止时间。
我们从第一天起就在收这份数据,一次都没用过。取完文字就把整份扔了。
有了它,事情就变成另一个样子:
不用回忆。点那个词,直接听你当时说的那半秒。
「Keyus」和「Kuvex」写出来分不清,读出来一听就分得清。用证据代替回忆。
一个不显然的细节
第一版做出来我自己试,发现点中文的词几乎听不见东西。
原因很简单:一个汉字只有 0.06 秒。原样播放就是一声爆音,什么也听不出。
所以播放会自动往前后各扩一点,并保证至少 0.9 秒——你听到的是那个词在句子里的样子,前后带着一点上下文。这才有用。
顺带修掉的一个隐患
同一件事还牵出另一个问题:识别把品牌 A 听成品牌 B,我改回来,Xtype 就会记下一条「以后 B 一律改成 A」的规则。
那意味着我以后每次真说 B,都会被自动改掉。 一个名字从此说不出口。
这套规则本来的前提是:被听错的那个词是识别产生的垃圾串,正常语境里根本不会出现。两边都是合法名字的时候,前提就破了。现在遇到这种情况直接不建规则,并且告诉你为什么、该怎么办——两个词都留在词库里,靠上下文分辨。
宁可不替换,不能替错。
学到的
一开始我要的是一个弹窗。做出来的东西完全不是弹窗。
中间隔着一步:去查清楚系统到底知道什么。 查完发现,我以为要靠”问用户”补上的信息,其实一直躺在返回数据里没人看。
先问”我们手上已经有什么”,再问”要不要打扰用户”。 顺序反了,就会做出一个既打扰人又不准的功能。