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]; | |
| const void * data = CFBridgingRetain([[whisper_encoder_impl alloc] initWithContentsOfURL:url_model 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, | |
| float * mel, | |
| float * out) { | |
| MLMultiArray * inMultiArray = [ | |
| [MLMultiArray alloc] initWithDataPointer: mel | |
| shape: @[@1, @80, @3000] | |
| dataType: MLMultiArrayDataTypeFloat32 | |
| strides: @[@(240000), @(3000), @1] | |
| deallocator: nil | |
| error: nil | |
| ]; | |
| whisper_encoder_implOutput * outCoreML = [(__bridge id) ctx->data predictionFromLogmel_data:inMultiArray error:nil]; | |
| memcpy(out, outCoreML.output.dataPointer, outCoreML.output.count * sizeof(float)); | |
| } | |
| } | |