各位好,我是亦束, 本期内容讲 Whisper 的安装和使用教程。
首先要安装一个 WSL2 , 需要 win10 及上版本才能使用。 对于 win10 要求: * x64 系统:版本 1903 或更高版本, 内部版本为 18362 或更高版本。 * ARM64 系统:版本 2004 或更高版本, 内部版本为 19041 或更高版本。
在此电脑右击,属性, 在操作系统内部版本后 可以看到对应的数字。 或者用快捷键 win键 + r , 在运行里输入 winver,确定, 然后可以在操作系统内部版本 后面看到相应的数字。
低于 18362 的版本不支持 WSL 2。 要使用 Windows Update 助手 更新 Windows 版本。 如果您的系统刚好是 Win10 的 18362 版本, 那么次要版本号不能低于 1049 , 次要版本号为小数点后面的数字。
Win键 + r, 在运行框里输入 PowerShell , 然后在命令行里输入 start-process PowerShell -verb runas ,回车。 此时便是用管理员身份打开的 PowerShell 。
在命令行里输入 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart, 便可以启用 WSL 。
在命令行里输入 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart ,回车。
如果是 win10 (版本号1903或1909)则输入 Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart ,回车
重启系统后在命令行里输入 systeminfo , 找到 System Type 或者 系统类型 , 如果是 x64 的,则下载x64最新内核 。
如果是 ARM ,则下载ARM最新版内核 。 下载完后双击安装。
再次用管理员身份打开命令行 , 在命令行输入wsl --set-default-version 2,回车。
从 Microsoft Store 中选择并安装 Linux 发行版。
这里你们随便选一个 Linux 就行, 我用的 Ubuntu 。
到官网地址 下载一个 Docker , 按照引导程序一路点击安装就行。
点击链接 ,跳转到百度云盘下载, 下载完之后找个地方放, 这个是 Whisper 的安装位置。
需要注意显卡驱动最好是新版本的, 否则可能会报错。 可以根据相应厂商 点击下面的链接去官网更新显卡驱动,英伟达 ,AMD 。
先保证你的 docker 是打开的状态, 到你下载的文件夹内, shift + 右键 点击空白处,选择启动 powershell, 输入 docker-compose up -d , 然后等待下载完毕。
首先我们打开 docker , 在 Containers 栏里我们可以看到 Whisper-ui 。 我们在右边点击这个开关可以开启, 然后在里面点击这个 Port 下面的数字 进入网页。
在右边第一个框内 就是填你媒体文件的路径。
下面选择转录的模型, 我们选 OpenAI/Whisper 。 当然你们也可以选择其它的模型尝试, 关于不同模型作用在下面都有解释。
在 Model Configs 里, model_type 决定了你转录的质量。 我一般都用 large-v2 , 它是最大的模型, 目前对多种语言支持最好。 当然有关其它模型区别, 我们也可以到相关页面 查看。
驱动有 GPU 的话就选择 cuda 。
前面这些设置路径, 预加载到内存什么的就不讲了, 我们把对转录质量 有影响的参数讲一下。 如果你用来转录英文, 都使用默认设置就行。 当你如果用来转录其它语言时, 可能会出现“幻听”, 这个时候我们要对其中一些参数进行调整。
幻听, 意思是没有声音的片段 被识别出了语音, 或者是转录结果与片段无关。 查了相关资料说是引入 [VAD] 能解决, 这个在后面的高级工具会讲, 另一个办法就是尝试调整相关参数。
compression_ratio_threshold
压缩比的阈值,默认为 2.4 。 当这个值高于预设时, 就不对这个片段进行转录, 也可以降低数值来调整效果。
转录频次的阈值,默认 -1.0 。 当这个值低于预设时, 将不对该片段进行转录。 推荐修改为 None 或更低的值。
这个是无声识别的阈值, 默认为 0.6 。 当这个值高于阈值 且转录频次(logprob_threshold)的阈值低于预设时, 这个片段会被标记为静默。 将它调低可以降低它大段的重复识别。
condition_on_previous_text , 能联系前后文的一个功能。
我这里找了一个张晋的 vlog 视频, 因为视频有上下文相关, 也有大段没有讲话的部分, 方便用来作为例子 展示会出现的问题以及如何调整。
我们先将这个关联前后文的功能关闭, 然后转录, 可以看到字幕里有两处读了“大屿山”, 但是 Whisper 给出来的文字不一样, 第二次识别成了另外一个字。 我们勾上后,它会关联上文, 在第二遍的时候将它翻译成了一个词。
我们继续用这个视频降低一下 相关参数, 来对比一下结果, 会发现他的幻听解决了, 但因为数值低了 导致文字转录的效果非常差, 这个参数得自己根据对应视频 尝试一下, 如果音频是纯语音的效果会好很多。
task 是 Whisper 自带一个 AI 翻译功能, 但是只能其它语言翻译成英文。 当然它翻译成英文的效果是比较好的, 如果有相关需求 可以用这个功能来翻译, 在选项栏里有转录和翻译两个选项。
例如我用一个中文的音频, 然后选项选择翻译, 出来的就是英文。
其它部分的设置我没弄明白 能起到什么作用 就不讲了。
后期处理工具, 需要先有转录的字幕才能使用, 否则会报错。
set time,设置时间用的工具。 字幕索引(subtitle index),设置作用于在字幕的哪一段。 下面两个选项则是设置 每段字幕开始或结束的时间戳。 再往下就是设置时间了。
我们把字幕索引改成 2 , 设置为结束时间, 把秒设置为 4 , 点击 Modify 。 可以看到第三段的结束时间戳 变成了 4 秒。 因为字幕是从 0 段开始的, 所以索引为 2 时,就是第三段字幕。 然后我们再调整一个, 把字幕索引调整为 0 , 设置开始时间, 可以看到第一段开始时间变成了 4 秒, 之前设置过的也会保持不变, 所以要重置的话只能重新转录 或者自己用这个工具改回来。
Shift ,时间戳整体偏移。
我们把秒改成 4 , 点击偏移, 会看到 底下所有的时间戳都增加了 4 秒。
在高级工具里的第一个选项是字幕 同步工具(ffsubsync), 能使语言无关的字幕与视频自动同步, 使字幕与视频中的时间戳 起始点相一致。
同步算法分 3 个步骤操作: * 将视频文件的音频流和字幕都分解成 10ms 的窗口。 * 对于每个 10ms 的窗口, 确定该窗口是否包含语音。 对于字幕来说, 只需确定在每个时间窗口中 是否有任何字幕是 "打开 "的; 对于音频流, 使用现成的语音活动检测器(VAD)。 * 现在有两个二进制字符串: 一个是字幕,另一个是视频。 通过将 0 与 0 、 1 与 1 的匹配来对齐这些字符串。 我们对这些排列进行评分, 计算公式: (#视频 1 与字幕 1 的匹配) -(#视频 1 与字幕 0 的匹配)。
然后通过利用得分高的结果, 来对齐字幕和视频。 为了提高效率 用了卷积操作来计算得分, 即用傅里叶变换 计算所有对齐方式的得分。
如果之前调整了幻听参数 效果还是不理想, 我们可以继续用这个字幕 同步工具来优化结果。
VAD ,中文翻译叫语音端点检测。 作用是从声音信号流里 识别和消除长时间的静音期。 这些选项是选择 VAD 的 Python 接口, webRTC 是谷歌的接口,专门检测语音;auditok 检测所有的音频,但是噪音越大效果也越差; silero 训练过很多种语言,应该是效果最好的, 但我这里用不了,也没法测试了。
其它的参数 大部分按照名字来理解就行。 第一个字幕最大秒数(max-subtitle-seconds), 就是字幕停留的最大时间。 第二个开始秒数(start-seconds), 就是从哪个时间开始转录字幕。 第三个字幕最大偏移秒数(max-offset-seconds), 就是给每段字幕允许的秒数偏移范围。 第四个应用偏移秒数(apply-offset-seconds), 就是你预先给每段时间戳 设定一个偏移量, 整体时间偏移。 第五个是当偏移量小于你设定的数 则抑制输出(suppress-output-if-offset-less-than)。
音频的帧率(frame-rate), 单位时间内对声音信号的采样次数, 采样频率 越高,声音越自然。 不过在这里, 是指输入媒体文件的音频采样率。
可以用视频帧率来理解, 视频帧率是每秒钟画面的帧数, 帧数越高,视频会越流畅, 音频也是同理。
输出编码(output-encoding),就是输出字幕的字符编码, 相关概念比较繁杂, 讲多了容易偏题, 用默认的 utf-8 就行。
跳过推断帧率(skip-infer-framerate- ratio), 不尝试自动识别媒体的帧率。
不修复帧率(no-fix-framerate), 不会纠正媒体的帧率。
序列化语音(serialize-speech), 将参考语音序列化为一个 numpy 数组, 便于算法更快速的评分。
序列化(serialize)是指将一种数据结构 或对象转化为可存储 或传输的格式的过程。
numpy 是一种常用的 Python 库, 用于处理科学计算和数值运算。
其实和转格式一个意思, 比如剪辑软件 PR 无法读取 MKV 格式的视频, 所以我们要把这个格式转换成 MP4 给 PR 使用。
gss,使用黄金分割搜索 来尝试找到 视频和字幕之间的最佳帧率。
在这里我只是把这个工具的功能 都介绍了一遍, 这个工具主要还是用它的 VAD 检测静音段 配合字幕对齐, 效果非常受转录时间戳的影响。
举个例子, 我用我以前录制的音频来测试, 先用 Whisper 转录, 看看直接转录的效果, 然后我们来同步字幕, 再来看看效果, 会发现 只有前 30 秒的时间起点同步是正确的, 后面的很多都是乱的, 原因是这个工具它只能偏移字幕, 而不能更改时间戳起始点。
其它功能的例子我就不展示了, 等之后这个工具更完善了再来补充 例子。
翻译工具, 模型选择这个(facebook/mbart-large-50-many-to-many-mmt), 这个模型是多语言机器翻译 微调的模型, 驱动有 GPU 的还是选择 cuda 。
批大小,一次加载的样本数, 看你显存够不够用,不够用就降低数值。
这个(verbose)是进度条显示; 第二个是下载和创建模型, 这个必须勾选上才会 有下面的语言选项; 一个是源语言, 就是字幕本身的语言, 另一个目标语言, 就是要翻译成的语言。 设置完之后点击翻译就能生成。
这个模型的翻译效果是不及 谷歌翻译的, 优点是保持了字幕的结构进行了翻译 且能离线翻译。
我们用一个英文的音频来测试, 先转录, 然后我们用翻译工具进行翻译, 可以看看翻译的结果,我们用谷歌来对比一下翻译结果。
##快速使用流程及推荐设置
总结一下:
英文类视频,填写路径,选择尾缀 .en 的中型模型( .en 专门针对英文优化), 直接转录就能得到很不错的字幕文件, 如果需要翻译, 按照上面讲的翻译 参数对着调整, 点击翻译, 再到最下面导出,时间戳不够精确 可以用同步字幕工具 进行字幕的同步。
其它语言,模型换成 large-V2 , 然后尝试调整到一个合适的幻听相关参数 , 再进行转录, 也可以继续用同步字幕工具 进行字幕的同步。