Palmier Pro本地转录引擎揭秘:MLX语音识别如何实现带词级时间戳的转写
【免费下载链接】palmier-promacOS video editor built for AI项目地址: https://gitcode.com/GitHub_Trending/pa/palmier-pro
Palmier Pro是一款为 AI 而生的 macOS 视频编辑器,它的本地转录引擎能在不上传任何素材的前提下,把视频里的语音转写成带词级时间戳的文字,并自动标注说话人。下面用 3 张图 + 4 个模块,讲清楚这套"离线语音识别"背后的设计。
一句话概括:ASR 转写由 Apple 的 Speech 框架负责,MLX 负责"哪里在说话"和"是谁在说话",两者拼出完整的本地转写能力。
一、为什么强调"本地"转录
大多数剪辑工具把音频上传到云端转写,既慢又涉及隐私。Palmier Pro 的本地转写直接在 Apple Silicon 芯片上完成:
- 素材不出机器,适合采访、会议等敏感内容;
- 首次使用自动下载 on-device 语音模型(
AssetInventory负责安装),之后完全离线; - 转写结果带词级时间戳,可直接驱动"删气口""按词剪片"等 AI 剪辑功能。
核心数据结构就定义在 Transcription.swift 里:
TranscriptionWord:单个词,含text、start、end、speaker;TranscriptionSegment:一句(endpoint 分句),含起止时间;TranscriptionResult:全文 + 语言 + 词表 + 句表。
二、词级时间戳到底从哪来
很多人以为时间戳要自己"算",其实关键在于给 Speech 框架"开了一个开关"。
在 Transcription.swift 中,创建SpeechTranscriber时传入了attributeOptions: [.audioTimeRange]。这个选项让框架在输出文字的同时,为每个 token 附带一段音频时间区间。
随后在 Transcription.swift 的decodeResults里,代码遍历attributed.runs,把每个 run 的audioTimeRange换算成秒,得到TranscriptionWord:
let range = run.audioTimeRange let start = range.map(\.start.seconds) let end = range.map { ($0.start + $0.duration).seconds } words.append(TranscriptionWord(text: trimmed, start: start, end: end, ...))也就是说:词级时间戳不是估算出来的,而是语音模型直接给出的,精度天然达到"单个词"级别。
三、MLX 在其中扮演什么角色
真正跑在 MLX 上的,是转写之外、却决定转写质量的两块音频分析能力。它们统一通过 MLXRuntime.swift 做推理串行化,避免并发踩到 Metal 后端的竞态。
1. Silero VAD:判断哪里有人在说话
VoiceActivity.swift 用SileroVADModel(明确指定engine: .mlx)对音频做"有无人说话"检测:
- 输入统一为16 kHz 单声道;
- 按 32 ms 的 chunk 逐段推理,输出概率序列;
- 再用 VAD 管线二值化,得到一段段"语音 span"(起止秒数)。
这套 span 有两个用途:确认说话人识别命中的片段真实有人声、以及标记"死气"(dead air)。
2. WeSpeaker:识别"是谁"在说话
SpeakerIdentity.swift 用WeSpeakerModel(同样走 MLX)对每段发言提取声纹向量,再用余弦相似度(阈值 0.45)跨文件比对,让同一个人在不同素材里拿到同一标签。这样转写结果里每个词都带上了speaker。
小提醒:这两个模型在开发构建里由编译开关
BUNDLED_SPEECH控制,MLXRuntime还会在"未打包构建"时直接跳过 MLX 加载,避免崩溃。
四、时间戳如何变成"自动剪辑"
词级时间戳最大的价值,是让"按词剪片"成为可能。WordCutPlanner.swift 的cutRanges直接把词的startFrame/endFrame交给剪辑引擎:
- 按tight / balanced / loose三档保留 60 / 150 / 320 ms 气口;
- 选出要保留的词,回算出要删除的静音区间;
- 交给
RippleEngine.mergeRanges合并成最终剪辑范围。
这一步就是"删除口癖、一键去静音"的底层逻辑——全靠前面那套词级时间戳支撑。
五、完整流程走一遍
把上面串起来,一次本地转写的旅程是这样的:
- 抽音轨:Transcription.swift 用
AVAssetReader把视频解码成 16 kHz 单声道 16-bit PCM; - 转写:
SpeechAnalyzer跑 on-device 模型,逐词产出时间戳; - 语音检测:Silero VAD(MLX)标出哪些区间有人声;
- 说话人:WeSpeaker(MLX)给每段话贴上说话人标签;
- 缓存:结果写入磁盘 + 内存两级缓存(见 TranscriptCache.swift),下次秒开;
- 剪辑:时间戳喂给 WordCutPlanner,生成去静音/按词剪片方案。
云端也有一路并行方案:
TranscriptionProvider区分.local与.cloud,后者通过 TranscriptionBackend.swift 提交远端任务。本地与云端结果可互相替换,接口完全一致。
六、如何上手体验
- 需要macOS 26(Tahoe)+ Apple Silicon;
- 打开项目,导入含语音的素材;
- 触发转写,首次会自动下载 on-device 语音模型;
- 转写完成后,即可在时间轴上按词选中、删除气口、识别说话人。
依赖清单可在 Package.swift 中查看:mlx-swift(MLX 推理)、speech-swift(Silero VAD / WeSpeaker)、swift-transformers(分词器)等,都是本地推理的关键拼图。
小结:Palmier Pro 的本地转录并不是"一个模型干所有活",而是Speech 框架给词级时间戳 + MLX 补上"哪里在说话、是谁在说话"的组合拳。理解了这套分工,你就能明白它的静音移除、说话人分离、按词剪辑为何能又快又准。
【免费下载链接】palmier-promacOS video editor built for AI项目地址: https://gitcode.com/GitHub_Trending/pa/palmier-pro
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考