从 FunASR 到 Whisper:多语言 ASR 的部署与端到端模型解析
之前我一直在用着 FunASR 的 Paraformer 模型,它真的相当方便,不需要脑子的那种。
对于中英文长段落混合,夹杂词语的混合,以及超长音频,不同音频格式都支持得很好。而我需要做的只有 pip install FunASR
。
而它有个局限就是仅支持中英文。而我大概一年前就计划要引入日文语种,但是一直停滞,这点现在想起来还是会有些无地自容。
我用引用包裹的一般是查阅得来的结论或者 gemini 告诉我的,感谢 gemini。
Q&A
Q:它是否只支持 wav?
A: 不,它支持更多,不需要手动转 wav.
使用它需要 openai-whisper
和 ffmpeg
, 一个是 python 依赖,一个是系统依赖。
转 wav 应该是 openai-whisper 自己调用的。
而在我的项目里,对于 ffmpeg 是不需要用户手动安装并且添加到 system_path 的,所以,我需要了解 whisper 是否支持手动传入 FFMPEG_PATH.
根据 gemini 解释,它不直接调用 FFMPEG_PATH, 而是通过 ffmpeg-pyton 实现了类似的功能。
但是还需要再了解一下如果用户系统路径中没有 ffmpeg 是否可以运行。
ffmpeg-python
不能在没有 ffmpeg bin 的情况下单独运行。
ffmpeg-python
的原理:ffmpeg-python
是一个 Python 封装库,它不包含ffmpeg
的二进制文件。它的作用是根据 Python 代码,生成并执行相应的ffmpeg
命令行指令。
不过似乎可以通过这种方式来写入 ffmpeg 的 PATH,似乎可以等价于 ffmpeg
。这样看来我其实当初也不必直接修改 yutto 来支持 ffmpeg 直接调用。
import os
ffmpeg_path = '/path/to/your/custom/ffmpeg/bin' # 假设这是您项目的 ffmpeg 路径
os.environ['PATH'] += os.pathsep + ffmpeg_path
# 此时再运行 whisper 核心逻辑,它就能在 PATH 中找到 ffmpeg 了
不过,对于 mac 和 linux 是否需要不同的操作? or 它都叫 PATH?
它是跨平台可用的,Python 的
os
模块 会自动处理这些差异,确保您的代码在所有主流操作系统上都能正确工作。
以及, 调用 ffmpeg-python 库的,如果 pyinstaller 打包为 exe 那么是否会出现由于缺少 ffmpeg 而无法执行的情况。我觉得大概率会。
可以通过 add-binary 来避免这个错误。
更深入地考虑,设置 PATH 时如果使用相对路径是不生效的,所以这里要动态解析 ffmpeg 位置(通过相对路径解析绝对路径)。
这样一方面避免了 PATH 在相对路径传入时不工作,另一方面避免写死了然后打包后给别人用找不到 ffmpeg 位置。
Q: 它是否需要强指定 ja, en 等参数?
A: 可以指定,但不是推荐的和必要的。
它支持直接选择目标语言,但是可能影响它长段落混合和夹杂词语混合的转录精度。
为什么自动检测是更好的?
比如 FunASR 模型运行通常分 vad(Voice Activity Detection) 和 asr(Automatic Speech Recognition) 。前者将模型切片(Segmenting), 即根据语音活动,切出连续的语言活动片段,比如一句话,而每句话之间的间歇,比如规定长于 500ms(这个只是举例),通常认为这句话结束了。
然后模型会对片段进行 asr, 这步应该是批处理的,它一次会识别几个片段的具体内容(这应该也是长音频不会爆显存的原因)。语言检测应该也是发生在这里,而如果用户给了一个 japanese 的强约束,那么可能会影响这种分步骤的颗粒读和精细度,当一个音频中语言不止一种的时候这种现象会更明显。
对于 FunASR 它还提供了 punc 模型用于标点预测,预测对象是纯文本,目标是填充标点的文本。
而相比于 FunASR 的组合模型, whisper 的模型似乎是混合模型。即一个模型就可以完成以上任务。比如这次我要使用的 whisper-turbo。
那么混合模型的工作方式和我之前使用的 FunASR 是否会有不同?
whisper 的模型的工作方式也叫做 End-to-End,端到端。它训练时的素材就直接是音频(source) - 带时间戳和标点的文本(target),VITS 系列模型也是这样的端到端模型,不过它们正好相反, VITS 的 source 是文本,target 是目标人音色的音频。
无疑来说 End-to-End 的模型训练起来难度更大,因为要兼顾各方面表现的均衡而且 whisper 的语言数量简直惊人,而 FunASR 可以针对单个任务进行优化。
切片:Whisper 将音频分为 30 秒/块进行处理。
批处理:Whisper 同样每次只处理一小批,避免长音频爆显存。
连续性: Whisper 解码过程中,上一块和下一块的隐藏状态和文本是共享的。