SwiftWhisper
在 Swift 中使用 Whisper 最简单的方法
轻松添加转录到您的应用程序或包。由 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
在 "Swift Package Manager" 选项卡中添加 https://github.com/exPHAT/SwiftWhisper.git
用法
import SwiftWhisper
let whisper = Whisper(fromFileURL: /* 模型文件URL */)
let segments = try await whisper.transcribe(audioFrames: /* 16kHz PCM 音频帧 */)
print("转录的音频:", segments.map(\.text).joined())
委托方法
您可以通过实现 WhisperDelegate
并设置 whisper.delegate = ...
来订阅段落、转录进度和错误。
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)
}
其它事项
下载模型 :inbox_tray:
您可以在 这里 下载预训练模型。
CoreML 支持 :brain:
要使用 CoreML,您需要包括一个后缀为 -encoder.mlmodelc
的 CoreML 模型文件,文件名与 Whisper 模型相同(例如:tiny.bin
旁边还应有一个 tiny-encoder.mlmodelc
文件)。除了额外的模型文件,您还需要使用 Whisper(fromFileURL:)
初始化器。您可以通过在转录期间检查控制台输出来验证 CoreML 是否处于活动状态。
将音频转换为 16kHz PCM :wrench:
将音频帧导入 SwiftWhisper 最简单的方法是使用 AudioKit。以下示例获取输入音频文件,进行转换和重采样,并返回一个 16kHz PCM floats 数组。
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))
}
}
提升开发速度 :rocket:
在为 Debug
构建配置编译应用时,您可能会发现转录性能较慢。这是因为编译器不会完全优化 SwiftWhisper,除非将构建配置设置为 Release
。
您可以通过安装一个使用 .unsafeFlags(["-O3"])
来强制进行最大优化的 SwiftWhisper 版本来解决这个问题。最简单的方法是使用 fast
分支上的最新提交。或者,您可以将方案配置为在 Release
配置中构建。
...
dependencies: [
// 使用 `fast` 分支的最新提交哈希:
.package(url: "https://github.com/exPHAT/SwiftWhisper.git", revision: "deb1cb6a27256c7b01f5d3d2e7dc1dcc330b5d01"),
],
...