package com.whispercppdemo.whisper
+import android.content.res.AssetManager
import android.os.Build
import android.util.Log
import kotlinx.coroutines.*
}
return WhisperContext(ptr)
}
+
+ fun createContextFromAsset(assetManager: AssetManager, assetPath: String): WhisperContext {
+ val ptr = WhisperLib.initContextFromAsset(assetManager, assetPath)
+
+ if (ptr == 0L) {
+ throw java.lang.RuntimeException("Couldn't create context from asset $assetPath")
+ }
+ return WhisperContext(ptr)
+ }
}
}
// JNI methods
external fun initContextFromInputStream(inputStream: InputStream): Long
+ external fun initContextFromAsset(assetManager: AssetManager, assetPath: String): Long
external fun initContext(modelPath: String): Long
external fun freeContext(contextPtr: Long)
external fun fullTranscribe(contextPtr: Long, audioData: FloatArray)
#include <jni.h>
+#include <android/asset_manager.h>
+#include <android/asset_manager_jni.h>
#include <android/log.h>
#include <stdlib.h>
#include <sys/sysinfo.h>
#define TAG "JNI"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
+#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
static inline int min(int a, int b) {
return (a < b) ? a : b;
return (jlong) context;
}
+static size_t asset_read(void *ctx, void *output, size_t read_size) {
+ return AAsset_read((AAsset *) ctx, output, read_size);
+}
+
+static bool asset_is_eof(void *ctx) {
+ return AAsset_getRemainingLength64((AAsset *) ctx) <= 0;
+}
+
+static void asset_close(void *ctx) {
+ AAsset_close((AAsset *) ctx);
+}
+
+static struct whisper_context *whisper_init_from_asset(
+ JNIEnv *env,
+ jobject assetManager,
+ const char *asset_path
+) {
+ LOGI("Loading model from asset '%s'\n", asset_path);
+ AAssetManager *asset_manager = AAssetManager_fromJava(env, assetManager);
+ AAsset *asset = AAssetManager_open(asset_manager, asset_path, AASSET_MODE_STREAMING);
+ if (!asset) {
+ LOGW("Failed to open '%s'\n", asset_path);
+ return NULL;
+ }
+
+ whisper_model_loader loader = {
+ .context = asset,
+ .read = &asset_read,
+ .eof = &asset_is_eof,
+ .close = &asset_close
+ };
+
+ return whisper_init(&loader);
+}
+
+JNIEXPORT jlong JNICALL
+Java_com_whispercppdemo_whisper_WhisperLib_00024Companion_initContextFromAsset(
+ JNIEnv *env, jobject thiz, jobject assetManager, jstring asset_path_str) {
+ UNUSED(thiz);
+ struct whisper_context *context = NULL;
+ const char *asset_path_chars = (*env)->GetStringUTFChars(env, asset_path_str, NULL);
+ context = whisper_init_from_asset(env, assetManager, asset_path_chars);
+ (*env)->ReleaseStringUTFChars(env, asset_path_str, asset_path_chars);
+ return (jlong) context;
+}
+
JNIEXPORT jlong JNICALL
Java_com_whispercppdemo_whisper_WhisperLib_00024Companion_initContext(
JNIEnv *env, jobject thiz, jstring model_path_str) {