早上好,我是まさきん。
我把一次兴趣班的体验说明录了音,用 Whisper 转成了文字。文章读起来像模像样,唯独金额的数字不对。我想这件事和把录音当作家庭收支判断依据的人有关,所以结合官方信息整理一下。
※本文内容以发布时为准。最新条件请以官方网站为准。
- 用 faster-whisper 转写约11分钟的说明录音,small 模型下金额全都不对
- medium 下费用的数字仍然是别的数字,到 large-v3 才终于和宣传单一致
- 在 initial_prompt 里加了提示之后,安静的片段里提示词本身被反复输出
- 我觉得确认金额时,只把相关部分截出来交给 large-v3 比较安全
- 设置以不加 prompt 和 condition_on_previous_text=False 为基础,最后再和纸质资料核对
语音转写会把金额的数字听错
我把某个兴趣班的体验说明录了约11分钟。因为想事后静下心来比较月费等内容。
转写用的是 faster-whisper。出来的文字,从说话的脉络来看读着很自然。可是和发下来的宣传单放在一起一比,金额对不上。
比如,几千日元档的月费,千位变成了别的数字。作为句子是成立的,所以如果没有宣传单,我想我是发现不了的。
small 和 medium 的数字都不对
最先用的是 small。作为金额出来的数字,全都和宣传单不一样。
接着用 medium 重新转写。这次费用的数字也还是别的数字。看来并不是把尺寸提高一档就能解决的事。
麻烦的是,错误看起来不像错误。“月费是◯千日元”这样的形式保留着。只有数字被换掉了,所以读起来不会觉得别扭。
用 large-v3 转写截出的片段,和宣传单一致
最后,我只把讲金额的部分截了出来。把这段很短的音频用 large-v3 转写,结果和宣传单上的金额一致。
所以在我手头,得出的结果是“确认数字用 large-v3”。话虽如此,这只是一段录音的情况。我觉得还不能说用 large-v3 就一定对得上。
之所以能核实,是因为手头有纸质的宣传单。没有只凭转写就把金额定下来,从结果看或许是对的。
模型尺寸的比较(官方README的数值)
OpenAI 的 Whisper 官方仓库里,列有模型尺寸的一览。我把 README 里的表原样整理了一下。
| 尺寸 | 参数量 | 所需VRAM参考值 | 相对速度 |
|---|---|---|---|
| tiny | 39 M | 约1GB | 约10倍 |
| base | 74 M | 约1GB | 约7倍 |
| small | 244 M | 约2GB | 约4倍 |
| medium | 769 M | 约5GB | 约2倍 |
| large | 1550 M | 约10GB | 1倍 |
| turbo | 809 M | 约6GB | 约8倍 |
相对速度是以 large 为1时的参考值。README 里写着,这是在名为 A100 的GPU上转写英语音频测得的数值。同时也提醒,实际速度会因语言、语速和设备而有很大差异。
表里的 large 有不同版本。据模型卡介绍,large-v2 于2022年12月推出。large-v3 则是2023年11月发布。
turbo 是2024年9月新增的。README 说明它是 large-v3 的优化版。据说精度下降极小,而速度有所提升。顺便一提,turbo 的参数量在 README 里是 809 M,在模型卡里却是 798 M。
faster-whisper 有什么不同
faster-whisper 是用另一种推理引擎来运行 Whisper 的重新实现。官方 README 说明,它使用名为 CTranslate2 的高速推理引擎。
同一份 README 里写着,在与原版相同精度的前提下最高快4倍。内存占用据说也更少。还提到通过8位量化可以进一步提高效率。
模型名像 WhisperModel("large-v3") 这样指定。据说这样写的话,转换好的模型会自动下载。
initial_prompt 和 condition_on_previous_text 的含义
这次涉及的设置有2个。两者在原版和 faster-whisper 里都有。
initial_prompt 是传给第一个窗口的提示文本。原版源码的说明里,举的例子是让专有名词和特有词汇更容易识别对。
condition_on_previous_text 是指是否把上一段的输出当作下一段的提示。默认值是 True。说明里提到,关掉之后各段之间的写法可能会不统一。另一方面也写着,这样更不容易陷入重复同一句话之类的失败循环。
| 设置 | 含义(官方说明) | 确认金额时的推荐 |
|---|---|---|
| 模型尺寸 | 越大越慢,所需内存也越多 | 只对相关部分用 large-v3 |
| initial_prompt | 传给第一个窗口的提示文本 | 不加 |
| condition_on_previous_text | 把上一段的输出当作下一段的提示(默认为 True) | 设为 False |
| vad_filter | 去掉没有人声的部分(faster-whisper) | 设为 True |
| language | 指定所说的语言 | 指定为 ja |
右边一列是我根据官方说明和这次的体验选的。并不是说官方推荐这个组合。
传了提示词,结果提示词本身被重复输出
为了让数字识别得准,我试着在 initial_prompt 里传了提示。结果在安静的片段里,出现了重复提示词本身的输出。
也就是说,没有人说过的话,以文字的形式排在了那里。明明想确认金额,返回的却是提示的原文。这就起不到确认的作用了。
所以我认为,确认金额时不加提示词更安全。在提示里写上数字,恐怕也有混进输出的风险。
官方关于幻觉的说明
输出没有人说过的话这一现象,官方的模型卡里也有记载。这就是所谓的幻觉。
据模型卡介绍,Whisper 是用大量夹杂噪声的数据训练的。因此,输出里有时会包含音频中实际并没有说过的文字。
关于重复也有说明。由于模型结构的原因,它容易反复生成同样的文字。用束搜索等方法可以在一定程度上抑制,但并不彻底。
语音转写的错误,是以看似合理的文字形式出现的。即使数字不对,作为句子也读得通,我觉得这是最大的陷阱。
无声片段可以用 vad_filter 去掉
faster-whisper 有一个叫 VAD 过滤器的功能。它会在转写之前把没有人声的部分去掉。官方 README 说明,它内置了名为 Silero VAD 的模型。
用法只需加上 vad_filter=True。README 里写着,默认行为比较保守,只去掉超过2秒的无声。细节可以通过 vad_parameters 调整。
另外还有一个叫 hallucination_silence_threshold 的设置。它在启用单词级时间戳时可以使用。说明是:在怀疑出现幻觉的地方,跳过比指定秒数更长的无声。
官方关于日语精度的说明
官方 README 里写着,精度会因语言而有很大差异。large-v3 和 large-v2 各语言的成绩是用图表示的。
模型卡里还有训练数据的构成。68万小时中,65%是英语音频和英语转写文本。英语以外的音频及其对应语言的转写文本占17%。
里面也提到,数据较少的语言精度会下降。据说幻觉和重复在这些语言里恶化的可能性也更高。至于日语处于什么水平的具体数字,本文没有列出。
按用途区分使用
大概没有必要全部都用 large-v3 来转写。如果只是把握说话的脉络,我想很多场合轻量的模型也够用。
| 用途 | 模型 | 范围 | 确认方法 |
|---|---|---|---|
| 把握整体脉络·做摘要 | 轻量的模型 | 整段录音 | 细节不要过于相信 |
| 确认金额·日期·次数 | large-v3 | 只限相关部分 | 与纸质或官方资料核对 |
| 确认与合同相关的条件 | large-v3 | 只限相关部分 | 最后用自己的耳朵重听 |
关键在于,只把出现数字的部分区别对待。整体的转写可以当作一张地图,用来找“在哪里讲到了金额”。
只确认金额的步骤
把我做的流程写成步骤,是这样的。
- 用轻量的模型转写整体,记下讲到金额的时间点
- 用 ffmpeg 只截出那一段
- 用 large-v3 转写截出的音频
- 不传提示词,把 condition_on_previous_text 设为 False
- 把出来的数字与宣传单或书面资料核对
截取用 ffmpeg 一行就行。据官方文档,放在 -i 前面的 -ss 指的是起始位置。同样,-t 是读取的长度。下面的例子是从5分30秒的位置取出60秒。
ffmpeg -ss 00:05:30 -t 60 -i recording.m4a clip.wav
转写的部分,以官方 README 的写法为基础是这样的。README 里也有没有GPU时的写法,我就照那个来了。
from faster_whisper import WhisperModel
model = WhisperModel("large-v3", device="cpu", compute_type="int8")
segments, info = model.transcribe(
"clip.wav",
language="ja",
condition_on_previous_text=False,
vad_filter=True,
)
for segment in segments:
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
README 里有一条提醒。segments 是生成器,据说要在循环里遍历时才会真正开始处理。
常见的失误·陷阱
回顾这次的事,我觉得容易栽跟头的大概是这些地方。
- 因为文字读起来很自然,就以为数字也是对的
- 以为把模型提高一档就能解决,只从 small 换成 medium
- 为了让数字识别得准,在提示词里写上金额的提示
- 把无声很多的音频原样整段丢进去
- 忘了当场索要用来核对的纸质材料或资料
我中的是前3条。最后一条,因为当时发了宣传单,才算得救。
我想也有只有口头说明、没有资料的场合。这种时候,只把金额当场记下来或许最可靠。录音终究只是用来重听的材料。
开始之前要确认的事
为想用语音转写来核实说明录音的朋友整理了一下。
- 已当场确认是否可以录音
- 已拿到写有金额的纸质材料或资料
- 已记下讲到金额的时间点
- 已只截出相关部分并用 large-v3 转写
- 转写时没有传提示词
- 已把出来的数字与纸质材料核对
我觉得第二项尤其重要。只要有可以核对的对象,语音转写用起来就轻松得多。
把语音转写用于家庭收支判断时的分寸
说明会和合同的说明,信息太多根本记不全。录下来转成文字,事后就能静下心来比较。我觉得这非常方便。
不过,对家庭收支的判断起作用的是金额和日期。而这恰恰是最容易出错的地方,这就是这次的发现。方便的部分和可以信任的部分,原来并不是同一块。
在工作中,数字也是要对照原始数据来确认的。摘要用来把握脉络,数字看原件。在家里或许也可以用同样的界线。
关于处理纸质信息的事,我在把学校通知单登记到日历的机制里也写过。至于交给AI的范围该怎么划线,我觉得拜托AI完成需要登录的预约那件事比较接近。关于汇总通话内容的功能,还有一篇Rakuten Link 的AI通话摘要功能的文章。
- 整体脉络:用轻量的模型转写,用于摘要和检索
- 金额和日期:截出相关部分,用 large-v3 转写
- 最终确认:与纸质或官方资料放在一起比对。没有的话就用自己的耳朵重听
常见问题
Q. Whisper 为什么会把数字弄错?
我没能找到明确写出原因的官方说明。模型卡里写着,输出里有时会包含没有说过的文字。这并不是专门针对数字的说明,所以原因我不下定论。
Q. small 和 medium 哪个更准确?
官方 README 说明,各个尺寸在速度和精度之间存在权衡。在我的录音里,两者的金额数字都不对。如果目的是确认数字,比起比较尺寸,优先做核对似乎更好。
Q. 用 large-v3 金额就一定对吗?
我觉得不能说一定对。我的情况是,截出的片段和宣传单一致。话虽如此,这只是一段录音的结果,所以与纸质材料的核对还是不要省略比较安全。
Q. turbo 和 large-v3 有什么不同?
官方 README 说明,turbo 是 large-v3 的优化版。精度下降极小,相对速度的参考值约为8倍。我没有用 turbo 试过,所以它对数字的识别情况我不清楚。
Q. 是不是最好不要用 initial_prompt?
让专有名词更容易识别对的用法,官方说明里也有记载。所以我觉得使用它本身并没有什么不好。只是我在安静的片段里遇到了提示词被重复输出的情况。所以在确认金额时我把它去掉了。
Q. 把 condition_on_previous_text 设为 False 会有什么变化?
上一段的输出不再被用作下一段的提示。据官方说明,各段之间的写法可能会不统一。相应地,更不容易陷入重复的循环。
Q. vad_filter 一开始就是启用的吗?
在普通的 transcribe 里,默认值是 False。所以要用的时候得自己指定为 True。据 README 介绍,在批处理那边它是默认启用的。
Q. 使用 faster-whisper 需要 ffmpeg 吗?
faster-whisper 的 README 说明,不需要另外安装 ffmpeg。因为它已经包含在用于读取音频的库里。不过,如果要用命令来截取片段,就需要 ffmpeg 本体。
参考的官方信息
- openai/whisper README(OpenAI 官方仓库)
- Model Card: Whisper(OpenAI 官方仓库)
- whisper/transcribe.py(OpenAI 官方仓库)
- faster-whisper README(SYSTRAN 官方仓库)
- faster_whisper/transcribe.py(SYSTRAN 官方仓库)
- ffmpeg Documentation(FFmpeg 官方网站)
总结
语音转写是保留说话脉络时非常得力的工具。不过,金额的数字无论 small 还是 medium 都不对。用 large-v3 转写截出的片段,才终于和宣传单一致。
所以我决定整体用轻量的模型来转写。只有数字的地方另外确认。不传提示词,最后和纸质材料放在一起比对。
手头有说明录音的朋友,不妨哪怕只把金额的部分和资料对照着看一看。
本文包含联盟营销广告。如果您通过本站链接申请相关商品或服务,我们可能会从合作企业获得报酬。此外,运营者是乐天集团的员工,也可能通过员工推荐计划获得报酬。文章内容与评价均基于运营者的真实体验与调查完成,与是否存在广告无关,但请您在阅读前了解上述关系。详情请参阅免责声明与联盟营销说明。 免责声明与联盟营销说明
本文包含机器翻译内容。正式条件请以乐天移动官方网站的多语言页面为准。
如果您对乐天移动的通信区域·信号状况有疑问,可以通过官方的 电波改善调查申请表 进行咨询。