SenseVoice 手机端 ASR 与 WhisperKit 对比

App 识别回显页:两条语音转写结果,「本雪长海拔 2100 米,当前风速每秒 12 米」与「缆车下午 4 点半停止运行」,各带对端 ASR 段号与时间戳

给 LoRa 文字对讲机配了个 iOS App:声音从 BLE 收上来,在手机上离线转成文字,再发回对讲机。识别引擎一开始用 WhisperKit(whisper-base),现在换成了 SenseVoice-Small。

iPhone 17 Pro Max,同一批 10 句音频,两个引擎各跑了一遍。

下面是 App 的识别回显页,最近三条就是这轮测试里的原话。

识别回显页:三条转写结果与历史记录。第三条「十四是十四,四十是四十」被写成「1四是14,四0是40。」

数据

口径WhisperKit baseSenseVoice int8
原样逐字71.7%80.3%
去标点75.6%87.1%
去标点 + 数字统一80.1%95.9%
模型加载6378 ms301 ms
单句中位耗时92 ms48 ms

逐句胜负:SenseVoice 胜 7 句,平 3 句,一句没输。

三个口径差这么多,是因为 SenseVoice 默认开了 ITN,会把「二十四度」直接写成 24度。只按「原样」口径比,等于在罚它把数字写对。

错在哪儿

挑几句最典型的。同一条音频,左边是参考,右边是 WhisperKit 写出来的:

参考WhisperKit
请把对讲机调到三频道请把对奖机调到三频道
我们从北京西站出发去香山我们从北京西站出发去乡山
缆车下午四点半停止运行拦车下午 4 点半停止运行
本雪场海拔两千一百米,当前风速每秒十二米分学长海把两千一百米,当前封宿每秒十二米

错得很整齐,全是同音字。音是听对了的,字选错了。

这类错对文字对讲机尤其要命。满屏乱码你一眼就知道「识别失败了,再喊一遍」;同音字错出来还是通顺的中文,你可能顺着就读下去了。「缆车」变「拦车」还能猜,「本雪场海拔」变「分学长海把」就纯粹是编了。

最难的一句

「十四是十四,四十是四十」:

引擎输出
参考十四是十四,四十是四十
WhisperKit14144144144
SenseVoice1四是14,四0是40。

两个都翻车。中英数字混排是老大难,连纯中文数字都规整不利索。不过 SenseVoice 好歹留下了「是」和逗号,看得出原文的形状。

一个反直觉的点

SenseVoice 的模型更大:228 MB 对 144 MB,差不多 1.6 倍。但加载快了 21 倍,推理也快一倍。

差别在结构上。Whisper 是自回归的,一个字一个字往外吐,说得越多越慢;SenseVoice 不是自回归,一次前向出全部文本,耗时基本只跟音频多长有关。

推理快一倍我其实感觉不强——按一下说三秒话,等 100 ms 和等 50 ms 用户分不出来。但冷启动 6.4 秒对 0.3 秒是能感觉到的:App 刚点开那两秒,WhisperKit 还没醒,说的话就白说了。