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