本仓库是对 exPHAT/SwiftWhisper 的 fork,目标是在 Swift 侧尽可能完整映射 whisper.cpp 的常用参数,并增加 Token 级回调,便于做流式识别与实时 UI 渲染。
Powered by whisper.cpp。
SPM 方式与原版一致;将依赖指向本仓库地址即可。
import SwiftWhisper
let modelData: Data = ... // 从 Bundle 读取 .bin
let params = WhisperParams.default
params.nThreads = 3
params.noContext = true
params.tokenTimestamps = true
params.suppressBlank = true
params.suppressNonSpeechTokens = true
let whisper = Whisper(fromData: modelData, withParams: params)
whisper.delegate = self
let segments = try await whisper.transcribe(audioFrames: pcm16kMono)
print("Transcribed:", segments.map(\.text).joined())当 params.tokenTimestamps = true 时,将触发 token 级回调:
extension MyHandler: WhisperDelegate {
func whisper(_ aWhisper: Whisper, didProcessNewTokens tokens: [Token], inSegmentAt index: Int) {
// 建议:做最长公共前缀 + 时间戳单调 去重后再上屏
}
}不同 whisper.cpp 版本字段可能略有变化;以下映射基于较新的版本:
- 线程与上下文
nThreads⇔n_threadsnoContext⇔no_contextmaxTextContext⇔n_max_text_ctxoffsetMs/durationMsaudioCtx⇔audio_ctx
- 采样/束搜索
greedyBestOf⇔greedy.best_ofbeamSize/beamPatience⇔beam_search.beam_size/patiencemaxLen/maxTokenstemperature/temperatureInclengthPenalty
- 抑制与阈值
suppressBlanksuppressNonSpeechTokens(旧版可能命名suppress_nst)suppressRegex(字符串)entropyThreshold/logprobThreshold/noSpeechThresholdmaxInitialTs/splitOnWord
- 语言与提示
language/translateinitialPrompt(字符串)tokenTimestamps(启用 token 级时间戳)
注:依赖的 whisper.cpp 子模块需要 git submodule update --init --recursive 拉齐后编译。
- 滑窗 + 无上下文:
noContext = true,窗口 0.7–1.5s;结合你方 VAD/带宽比策略。 - Token 实时上屏:开启
tokenTimestamps,批次内做 LCP 去重与时间戳单调过滤。 - 抑制:
suppressBlank = true,suppressNonSpeechTokens = true;必要时suppressRegex。 - 性能:
nThreads控制在 2–3;积压严重时跳过一次窗口解码以追上实时。
- 增加 Token 结构与回调(
didProcessNewTokens) - 为常用 whisper.cpp 字段增加便捷属性(
WhisperParams扩展) - 管理
initialPrompt/suppressRegex的 C 字符串内存 - README:参数覆盖范围 / 流式建议 / 示例
- 跨版本兼容:旧名
suppress_nst等字段别名支持 - 文档补充:字段与 whisper.cpp 版本对照表
- 示例工程(可选)
- 模型下载:可参考 Hugging Face
ggerganov/whisper.cpp。 - CoreML:保留与原版一致的
-encoder.mlmodelc约定;仅在从文件 URL 初始化时自动检测。 - Debug 性能:可参考原版
fast分支或使用 Release 构建。