Spaces:
Running
Running
| extern "C" { | |
| struct whisper_coreml_context { | |
| const void * data; | |
| }; | |
| struct whisper_coreml_context * whisper_coreml_init(const char * path_model) { | |
| NSString * path_model_str = [[NSString alloc] initWithUTF8String:path_model]; | |
| NSURL * url_model = [NSURL fileURLWithPath: path_model_str]; | |
| // select which device to run the Core ML model on | |
| MLModelConfiguration *config = [[MLModelConfiguration alloc] init]; | |
| // config.computeUnits = MLComputeUnitsCPUAndGPU; | |
| //config.computeUnits = MLComputeUnitsCPUAndNeuralEngine; | |
| config.computeUnits = MLComputeUnitsAll; | |
| const void * data = CFBridgingRetain([[whisper_encoder_impl alloc] initWithContentsOfURL:url_model configuration:config error:nil]); | |
| if (data == NULL) { | |
| return NULL; | |
| } | |
| whisper_coreml_context * ctx = new whisper_coreml_context; | |
| ctx->data = data; | |
| return ctx; | |
| } | |
| void whisper_coreml_free(struct whisper_coreml_context * ctx) { | |
| CFRelease(ctx->data); | |
| delete ctx; | |
| } | |
| void whisper_coreml_encode( | |
| const whisper_coreml_context * ctx, | |
| int64_t n_ctx, | |
| int64_t n_mel, | |
| float * mel, | |
| float * out) { | |
| MLMultiArray * inMultiArray = [ | |
| [MLMultiArray alloc] initWithDataPointer: mel | |
| shape: @[@1, @(n_mel), @(n_ctx)] | |
| dataType: MLMultiArrayDataTypeFloat32 | |
| strides: @[@(n_ctx*n_mel), @(n_ctx), @1] | |
| deallocator: nil | |
| error: nil | |
| ]; | |
| @autoreleasepool { | |
| whisper_encoder_implOutput * outCoreML = [(__bridge id) ctx->data predictionFromLogmel_data:inMultiArray error:nil]; | |
| memcpy(out, outCoreML.output.dataPointer, outCoreML.output.count * sizeof(float)); | |
| } | |
| } | |
| } | |