SwiftWhisper 项目介绍
项目概览
SwiftWhisper 是一种简便的方式,在 Swift 应用或包中添加语音转文本功能。它由 whisper.cpp 提供强大的技术支持,旨在帮助开发者轻松实现语音转文本功能。
安装步骤
通过 Swift Package Manager 安装
开发者可以在 Package.swift
文件中将 SwiftWhisper 添加为依赖项。具体步骤如下:
let package = Package(
...
dependencies: [
// 将包添加至依赖项中
.package(url: "https://github.com/exPHAT/SwiftWhisper.git", branch: "master"),
],
...
targets: [
// 在任意希望使用的目标中添加 SwiftWhisper
.target(name: "MyTarget",
dependencies: [.byName(name: "SwiftWhisper")])
]
...
)
通过 Xcode 安装
在 Xcode 中,通过 "Swift Package Manager" 标签页,使用仓库地址 https://github.com/exPHAT/SwiftWhisper.git
添加依赖。
使用方法
开发者可以参考API 文档获取更多信息。基本使用方法如下:
import SwiftWhisper
let whisper = Whisper(fromFileURL: /* 模型文件URL */)
let segments = try await whisper.transcribe(audioFrames: /* 16kHz PCM 音频帧 */)
print("已转录的音频:", segments.map(\.text).joined())
代理方法
通过实现 WhisperDelegate
,开发者可以订阅到文本片段更新、转录进度及错误等信息。
protocol WhisperDelegate {
// 进度更新,范围从0到1
func whisper(_ aWhisper: Whisper, didUpdateProgress progress: Double)
// 当新文本片段被转录时触发
func whisper(_ aWhisper: Whisper, didProcessNewSegments segments: [Segment], atIndex index: Int)
// 完成转录,返回所有已转录的文本片段
func whisper(_ aWhisper: Whisper, didCompleteWithSegments segments: [Segment])
// 转录过程中出现错误
func whisper(_ aWhisper: Whisper, didErrorWith error: Error)
}
其他注意事项
模型下载
开发者可以在此处找到预训练的模型进行下载。
CoreML 支持
如需使用 CoreML,需在与 Whisper 模型同一目录下包含一个后缀为 -encoder.mlmodelc
的 CoreML 模型文件。通过初始化函数 Whisper(fromFileURL:)
来加载模型,并可在转录时通过控制台输出确认 CoreML 是否已激活。
音频转换为 16kHz PCM
使用 AudioKit 是处理音频数据进入 SwiftWhisper 的最简单方法。以下示例展示如何转换和重采样音频文件得到 16kHz PCM 数组:
import AudioKit
func convertAudioFileToPCMArray(fileURL: URL, completionHandler: @escaping (Result<[Float], Error>) -> Void) {
var options = FormatConverter.Options()
options.format = .wav
options.sampleRate = 16000
options.bitDepth = 16
options.channels = 1
options.isInterleaved = false
let tempURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(UUID().uuidString)
let converter = FormatConverter(inputURL: fileURL, outputURL: tempURL, options: options)
converter.start { error in
if let error {
completionHandler(.failure(error))
return
}
let data = try! Data(contentsOf: tempURL) // 这里处理错误
let floats = stride(from: 44, to: data.count, by: 2).map {
return data[$0..<$0 + 2].withUnsafeBytes {
let short = Int16(littleEndian: $0.load(as: Int16.self))
return max(-1.0, min(Float(short) / 32767.0, 1.0))
}
}
try? FileManager.default.removeItem(at: tempURL)
completionHandler(.success(floats))
}
}
提高开发速度
在 Debug
构建配置下,可能会遇到转录性能较慢的问题。这是因为编译器默认不会完全优化 SwiftWhisper。可以通过安装使用 .unsafeFlags(["-O3"])
强制最大优化版本的 SwiftWhisper 来解决。最简单的方法是使用 fast
分支的最新提交。此外,也可以配置方案以 Release
配置进行构建。
...
dependencies: [
// 使用 `fast` 分支的最新提交哈希:
.package(url: "https://github.com/exPHAT/SwiftWhisper.git", revision: "deb1cb6a27256c7b01f5d3d2e7dc1dcc330b5d01"),
],
...