mirror of
https://github.com/ggerganov/whisper.cpp.git
synced 2024-12-27 15:58:50 +00:00
d03c60dd7f
* Add support for Swift * Make it build in Xcode * Use the SPM package in the SwiftUI example app
77 lines
2.4 KiB
Swift
77 lines
2.4 KiB
Swift
import Foundation
|
|
import whisper
|
|
|
|
enum WhisperError: Error {
|
|
case couldNotInitializeContext
|
|
}
|
|
|
|
// Meet Whisper C++ constraint: Don't access from more than one thread at a time.
|
|
actor WhisperContext {
|
|
private var context: OpaquePointer
|
|
|
|
init(context: OpaquePointer) {
|
|
self.context = context
|
|
}
|
|
|
|
deinit {
|
|
whisper_free(context)
|
|
}
|
|
|
|
func fullTranscribe(samples: [Float]) {
|
|
// Leave 2 processors free (i.e. the high-efficiency cores).
|
|
let maxThreads = max(1, min(8, cpuCount() - 2))
|
|
print("Selecting \(maxThreads) threads")
|
|
var params = whisper_full_default_params(WHISPER_SAMPLING_GREEDY)
|
|
"en".withCString { en in
|
|
// Adapted from whisper.objc
|
|
params.print_realtime = true
|
|
params.print_progress = false
|
|
params.print_timestamps = true
|
|
params.print_special = false
|
|
params.translate = false
|
|
params.language = en
|
|
params.n_threads = Int32(maxThreads)
|
|
params.offset_ms = 0
|
|
params.no_context = true
|
|
params.single_segment = false
|
|
|
|
whisper_reset_timings(context)
|
|
print("About to run whisper_full")
|
|
samples.withUnsafeBufferPointer { samples in
|
|
if (whisper_full(context, params, samples.baseAddress, Int32(samples.count)) != 0) {
|
|
print("Failed to run the model")
|
|
} else {
|
|
whisper_print_timings(context)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func getTranscription() -> String {
|
|
var transcription = ""
|
|
for i in 0..<whisper_full_n_segments(context) {
|
|
transcription += String.init(cString: whisper_full_get_segment_text(context, i))
|
|
}
|
|
return transcription
|
|
}
|
|
|
|
static func createContext(path: String) throws -> WhisperContext {
|
|
var params = whisper_context_default_params()
|
|
#if targetEnvironment(simulator)
|
|
params.use_gpu = false
|
|
print("Running on the simulator, using CPU")
|
|
#endif
|
|
let context = whisper_init_from_file_with_params(path, params)
|
|
if let context {
|
|
return WhisperContext(context: context)
|
|
} else {
|
|
print("Couldn't load model at \(path)")
|
|
throw WhisperError.couldNotInitializeContext
|
|
}
|
|
}
|
|
}
|
|
|
|
fileprivate func cpuCount() -> Int {
|
|
ProcessInfo.processInfo.processorCount
|
|
}
|