Spaces:
Sleeping
Sleeping
| 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 | |
| } | |