用 macOS 26 原生 API 做实时翻译字幕

小Max爱学习 高级 1小时前 805 浏览 12 点赞 约 2 分钟

很多人习惯用 Electron 快排原型,但我这次折腾实时翻译字幕时,发现 Electron 简直是性能噩梦。每句话转译得花 2 秒,字幕出来的时候对方早就把下一段话讲完了。直到我试了 macOS 26 刚更新的几套原生框架,才发现 Apple 其实把整套实时翻译的链路都给铺好了,而且全部在本地跑,完全不用传到云端,这对处理公司内部机密会议来说简直是刚需。

我把这个工具命名为 Wakaru,核心逻辑就是把系统音频截获后,通过本地模型直接转成字幕飘在屏幕上。

核心技术链路

这个流程不需要任何外部 API Key,也不用担心每分钟多少钱的 Token 费。整个数据流是这么走的:

ScreenCaptureKit (截取系统音频)SpeechAnalyzer (语音转文字)Translation framework (机器翻译) 或 FoundationModels (LLM 润色)NSPanel (透明字幕覆盖层)

最关键的一点是,我选了截取系统音频而不是麦克风,这样无论你在开 Zoom、Teams 还是看 YouTube,它都能直接生效,不需要去适配任何第三方软件。

避坑指南:如何让字幕不像“聊天记录”

如果只是简单地把翻译结果贴出来,体验会非常糟糕。在开发过程中我踩了几个坑,建议打算实操的开发者参考:

  • 禁止在句子形成时实时翻译:尤其是像德语这种动词在句尾的语言,如果你在实时翻译,字幕会随着每个词的出现而疯狂跳变,根本没法看。现在的逻辑是:等一个句子或长从句完整结束,才触发一次翻译。
  • 动态计算字幕停留时间:不能设置固定时长。我用了这个公式:停留时间 = 文本长度 / 7 + 2 秒(限制在 4-12 秒之间)。短句快闪,长句留久一点,才像真正的电影字幕。
  • UI 穿透处理:字幕层必须使用 NSPanel 并设置为透明且 click-through,否则字幕挡住屏幕时,你没法点击下面的窗口。

实现代码参考

如果你想尝试调用 macOS 的翻译框架,可以参考这个简单的 Swift 结构:

import Translation

// 简单的翻译调用示例
func translateText(source: String, targetLanguage: Locale.Language) async {
    let configuration = TranslationSession.Configuration(target: targetLanguage)
    do {
        // 使用系统原生的 TranslationSession 进行本地翻译
        let session = TranslationSession() 
        let response = try await session.translate(source, to: targetLanguage)
        print("翻译结果: \(response.targetText)")
    } catch {
        print("本地翻译失败: \(error)")
    }
}

目前整个项目大约 3000 行 Swift 代码,没有任何第三方依赖。用原生框架最大的感受就是:只要你愿意花时间去对齐 API,性能和隐私保护真的能甩掉跨平台框架好几条街。

AI编程macOSWakaruSwiftScreenCaptureKit

全部回复 (3)

小阿伟的日常 初级 1小时前
原生 API 的内存占用确实低,跑久了也不像 Electron 那样吃资源。
0 回复
产品经理大熊 高级 1小时前
本地跑确实稳,而且没网络延迟,比调云端接口响应快多了。
0 回复
副业中创业者 初级 1小时前
那这个 API 对多语言混合识别支持得怎么样?
0 回复

发表回复

支持 Markdown 格式