diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 0000000..cf439b0 --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,27 @@ + +name: Android CI + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: set up JDK 8 + uses: actions/setup-java@v3 + with: + java-version: '8' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Build with Gradle + run: ./gradlew build diff --git a/app/build.gradle b/app/build.gradle index f5d7aea..62f19b3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,6 +22,12 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + + sourceSets { + main { + jniLibs.srcDirs = ['src/main/jniLibs'] + } + } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -41,5 +47,6 @@ dependencies { //litongjava implementation 'com.litongjava:android-view-inject:1.0' + implementation 'com.litongjava:jfinal-aop:1.0.1' implementation 'com.litongjava:litongjava-android-utils:1.0.0' } \ No newline at end of file diff --git a/app/src/main/java/com/litongjava/whisper/cpp/android/java/bean/WhisperSegment.java b/app/src/main/java/com/litongjava/whisper/cpp/android/java/bean/WhisperSegment.java new file mode 100644 index 0000000..fd84355 --- /dev/null +++ b/app/src/main/java/com/litongjava/whisper/cpp/android/java/bean/WhisperSegment.java @@ -0,0 +1,47 @@ +package com.litongjava.whisper.cpp.android.java.bean; + +/** + * Created by litonglinux@qq.com on 10/21/2023_7:48 AM + */ +public class WhisperSegment { + private long start, end; + private String sentence; + + public WhisperSegment() { + } + + public WhisperSegment(long start, long end, String sentence) { + this.start = start; + this.end = end; + this.sentence = sentence; + } + + public long getStart() { + return start; + } + + public long getEnd() { + return end; + } + + public String getSentence() { + return sentence; + } + + public void setStart(long start) { + this.start = start; + } + + public void setEnd(long end) { + this.end = end; + } + + public void setSentence(String sentence) { + this.sentence = sentence; + } + + @Override + public String toString() { + return "["+start+" --> "+end+"]:"+sentence; + } +} diff --git a/app/src/main/java/com/litongjava/whisper/cpp/android/java/demo/MainActivity.java b/app/src/main/java/com/litongjava/whisper/cpp/android/java/demo/MainActivity.java index be2b673..3aa1faf 100644 --- a/app/src/main/java/com/litongjava/whisper/cpp/android/java/demo/MainActivity.java +++ b/app/src/main/java/com/litongjava/whisper/cpp/android/java/demo/MainActivity.java @@ -1,118 +1,95 @@ package com.litongjava.whisper.cpp.android.java.demo; import android.content.Context; -import android.content.res.AssetManager; import android.os.Build; import android.os.Bundle; +import android.view.View; import android.widget.TextView; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; +import com.blankj.utilcode.util.ThreadUtils; import com.litongjava.android.view.inject.annotation.FindViewById; import com.litongjava.android.view.inject.annotation.FindViewByIdLayout; +import com.litongjava.android.view.inject.annotation.OnClick; import com.litongjava.android.view.inject.utils.ViewInjectUtils; -import com.litongjava.whisper.cpp.android.java.demo.media.WaveEncoder; -import com.litongjava.whisper.cpp.android.java.demo.utils.AssetUtils; -import com.whispercppdemo.whisper.WhisperContext; -import com.whispercppdemo.whisper.WhisperCpuConfig; +import com.litongjava.jfinal.aop.Aop; +import com.litongjava.jfinal.aop.AopManager; +import com.litongjava.whisper.cpp.android.java.services.OutputTextViewService; +import com.litongjava.whisper.cpp.android.java.services.WhisperService; +import com.litongjava.whisper.cpp.android.java.task.TranscriptionTask; +import com.whispercppdemo.whisper.WhisperLib; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.File; -import java.io.IOException; -import java.util.Arrays; -import java.util.concurrent.ExecutionException; - @FindViewByIdLayout(R.layout.activity_main) public class MainActivity extends AppCompatActivity { - private Logger log = LoggerFactory.getLogger(this.getClass()); - private WhisperContext whisperContext; - @FindViewById(R.id.textHelloWorld) - private TextView textHelloWorld; + @FindViewById(R.id.sample_text) + private TextView tv; + + Logger log = LoggerFactory.getLogger(this.getClass()); + OutputTextViewService outputTextViewService; + private WhisperService whisperService; @RequiresApi(api = Build.VERSION_CODES.O) @Override protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - ///setContentView(R.layout.activity_main); + //setContentView(R.layout.activity_main); ViewInjectUtils.injectActivity(this, this); - int preferredThreadCount = WhisperCpuConfig.getPreferredThreadCount(); - log.info("preferredThreadCount:{}", preferredThreadCount); - - Context baseContext = getBaseContext(); - File filesDir = baseContext.getFilesDir(); - log.info("filesDir:{}", filesDir); - AssetManager assets = baseContext.getAssets(); - try { - String[] models = assets.list("models"); - log.info("models:{}", Arrays.toString(models)); - } catch (IOException e) { - e.printStackTrace(); - } - - try { - String[] samples = assets.list("samples"); - log.info("samples:{}", Arrays.toString(samples)); - } catch (IOException e) { - e.printStackTrace(); - } - String modelFilePath = "models/ggml-tiny.bin"; - File modelFile = AssetUtils.copyFileIfNotExists(baseContext, filesDir, modelFilePath); - modelFilePath = modelFile.getAbsolutePath(); - // 加载模型 - loadModel(modelFilePath); + outputTextViewService = new OutputTextViewService(this.tv); + //add to aop container + AopManager.me().addSingletonObject(outputTextViewService); + whisperService= Aop.get(WhisperService.class); + showSystemInfo(); + } + @RequiresApi(api = Build.VERSION_CODES.O) + @OnClick(R.id.loadModelBtn) + public void loadModelBtn_OnClick(View v) { + Context context = getBaseContext(); + whisperService.loadModel(); + } + @OnClick(R.id.transcriptSampleBtn) + public void transcriptSampleBtn_OnClick(View v) { + Context context = getBaseContext(); String sampleFilePath = "samples/jfk.wav"; - File sampleFile = AssetUtils.copyFileIfNotExists(baseContext, filesDir, sampleFilePath); - // 识别样本 - transcribeSample(sampleFile); + ThreadUtils.executeByIo(new TranscriptionTask(context, tv, sampleFilePath)); + } + + @OnClick(R.id.transcriptLongSampleBtn) + public void transcriptLongSampleBtn_OnClick(View v) { + Context context = getBaseContext(); + String sampleFilePath = "samples/A1_APartyInvitation__lesson_1368784253.wav"; + ThreadUtils.executeByIo(new TranscriptionTask(context, tv, sampleFilePath)); + } + + + @RequiresApi(api = Build.VERSION_CODES.O) + @OnClick(R.id.systemInfoBtn) + public void systemInfoBtn_OnClick(View v) { + showSystemInfo(); } @RequiresApi(api = Build.VERSION_CODES.O) - private void loadModel(String modelPath) { - log.info("load model from :{}", modelPath); - whisperContext = WhisperContext.createContextFromFile(modelPath); + public void showSystemInfo() { + String systemInfo = WhisperLib.getSystemInfo(); + Aop.get(OutputTextViewService.class).println(systemInfo); } - private void transcribeSample(File sampleFile) { - log.info("transcribe file from :{}", sampleFile.getAbsolutePath()); - float[] audioData = new float[0]; // 读取音频样本 - try { - audioData = WaveEncoder.decodeWaveFile(sampleFile); - } catch (IOException e) { - e.printStackTrace(); - } - - String transcription = null; // 转录音频数据 - try { - transcription = whisperContext.transcribeData(audioData); - } catch (ExecutionException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - log.info("Transcription: {}", transcription); // 打印转录结果 - textHelloWorld.setText(transcription); + @OnClick(R.id.clearBtn) + public void clearBtn_OnClick(View v) { + Aop.get(OutputTextViewService.class).clear(); } @RequiresApi(api = Build.VERSION_CODES.O) @Override protected void onDestroy() { super.onDestroy(); - if (whisperContext != null) { - try { - whisperContext.release(); - } catch (ExecutionException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - whisperContext = null; - } + whisperService.release(); } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/litongjava/whisper/cpp/android/java/demo/app/App.java b/app/src/main/java/com/litongjava/whisper/cpp/android/java/demo/app/App.java new file mode 100644 index 0000000..3383f81 --- /dev/null +++ b/app/src/main/java/com/litongjava/whisper/cpp/android/java/demo/app/App.java @@ -0,0 +1,13 @@ +package com.litongjava.whisper.cpp.android.java.demo.app; + +import android.app.Application; + +import com.blankj.utilcode.util.Utils; + +public class App extends Application { + @Override + public void onCreate() { + super.onCreate(); + Utils.init(this); + } +} diff --git a/app/src/main/java/com/litongjava/whisper/cpp/android/java/demo/media/WaveEncoder.java b/app/src/main/java/com/litongjava/whisper/cpp/android/java/media/WaveEncoder.java similarity index 97% rename from app/src/main/java/com/litongjava/whisper/cpp/android/java/demo/media/WaveEncoder.java rename to app/src/main/java/com/litongjava/whisper/cpp/android/java/media/WaveEncoder.java index 6c934ad..c45318f 100644 --- a/app/src/main/java/com/litongjava/whisper/cpp/android/java/demo/media/WaveEncoder.java +++ b/app/src/main/java/com/litongjava/whisper/cpp/android/java/media/WaveEncoder.java @@ -1,4 +1,4 @@ -package com.litongjava.whisper.cpp.android.java.demo.media; +package com.litongjava.whisper.cpp.android.java.media; import java.io.ByteArrayOutputStream; import java.io.File; diff --git a/app/src/main/java/com/litongjava/whisper/cpp/android/java/demo/recoder/Recorder.java b/app/src/main/java/com/litongjava/whisper/cpp/android/java/recoder/Recorder.java similarity index 95% rename from app/src/main/java/com/litongjava/whisper/cpp/android/java/demo/recoder/Recorder.java rename to app/src/main/java/com/litongjava/whisper/cpp/android/java/recoder/Recorder.java index 3b27c8c..4e6bd9e 100644 --- a/app/src/main/java/com/litongjava/whisper/cpp/android/java/demo/recoder/Recorder.java +++ b/app/src/main/java/com/litongjava/whisper/cpp/android/java/recoder/Recorder.java @@ -1,11 +1,11 @@ -package com.litongjava.whisper.cpp.android.java.demo.recoder; +package com.litongjava.whisper.cpp.android.java.recoder; import android.annotation.SuppressLint; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; -import com.litongjava.whisper.cpp.android.java.demo.media.WaveEncoder; +import com.litongjava.whisper.cpp.android.java.media.WaveEncoder; import java.io.File; import java.util.ArrayList; diff --git a/app/src/main/java/com/litongjava/whisper/cpp/android/java/services/OutputTextViewService.java b/app/src/main/java/com/litongjava/whisper/cpp/android/java/services/OutputTextViewService.java new file mode 100644 index 0000000..3fe2782 --- /dev/null +++ b/app/src/main/java/com/litongjava/whisper/cpp/android/java/services/OutputTextViewService.java @@ -0,0 +1,19 @@ +package com.litongjava.whisper.cpp.android.java.services; + +import android.widget.TextView; + +public class OutputTextViewService { + private TextView tv; + + public OutputTextViewService(TextView tv) { + this.tv = tv; + } + + public void println(String text) { + tv.append(text + "\n"); + } + + public void clear(){ + tv.setText(""); + } +} diff --git a/app/src/main/java/com/litongjava/whisper/cpp/android/java/services/WhisperService.java b/app/src/main/java/com/litongjava/whisper/cpp/android/java/services/WhisperService.java new file mode 100644 index 0000000..96e43d3 --- /dev/null +++ b/app/src/main/java/com/litongjava/whisper/cpp/android/java/services/WhisperService.java @@ -0,0 +1,95 @@ +package com.litongjava.whisper.cpp.android.java.services; + +import android.content.Context; +import android.os.Build; +import android.widget.TextView; + +import androidx.annotation.RequiresApi; + +import com.litongjava.jfinal.aop.Aop; +import com.litongjava.whisper.cpp.android.java.bean.WhisperSegment; +import com.litongjava.whisper.cpp.android.java.media.WaveEncoder; +import com.litongjava.whisper.cpp.android.java.single.LocalWhisper; +import com.litongjava.whisper.cpp.android.java.utils.AssetUtils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class WhisperService { + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + @RequiresApi(api = Build.VERSION_CODES.O) + public void loadModel() { + + String modelFilePath = LocalWhisper.modelFilePath; + String msg = "load model from :" + modelFilePath ; + outputMsg(msg); + + long start = System.currentTimeMillis(); + LocalWhisper.INSTANCE.init(); + long end = System.currentTimeMillis(); + msg = "model load successful:" + (end - start) + "ms"; + outputMsg(msg); + + } + + public void transcribeSample(Context context, TextView tv, String sampleFilePath) { + String msg = ""; + long start = System.currentTimeMillis(); + + File filesDir = context.getFilesDir(); + File sampleFile = AssetUtils.copyFileIfNotExists(context, filesDir, sampleFilePath); + long end = System.currentTimeMillis(); + msg = "copy file:" + (end - start) + "ms"; + outputMsg(msg); + + msg = "transcribe file from :" + sampleFile.getAbsolutePath(); + outputMsg(msg); + + start = System.currentTimeMillis(); + float[] audioData = new float[0]; // 读取音频样本 + try { + audioData = WaveEncoder.decodeWaveFile(sampleFile); + } catch (IOException e) { + e.printStackTrace(); + return; + } + end = System.currentTimeMillis(); + msg = "decode wave file:" + (end - start) + "ms"; + outputMsg(msg); + + start = System.currentTimeMillis(); + List transcription = null; + try { + + //transcription = LocalWhisper.INSTANCE.transcribeData(audioData); + transcription = LocalWhisper.INSTANCE.transcribeDataWithTime(audioData); + } catch (ExecutionException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + end = System.currentTimeMillis(); + msg = "Transcript successful:" + (end - start) + "ms"; + outputMsg(msg); + + msg = "Transcription:" + transcription.toString(); + outputMsg(msg); + } + + private void outputMsg(String msg) { + Aop.get(OutputTextViewService.class).println(msg); + log.info(msg); + } + + @RequiresApi(api = Build.VERSION_CODES.O) + public void release() { + //noting to do + } +} diff --git a/app/src/main/java/com/litongjava/whisper/cpp/android/java/single/LocalWhisper.java b/app/src/main/java/com/litongjava/whisper/cpp/android/java/single/LocalWhisper.java new file mode 100644 index 0000000..ba41879 --- /dev/null +++ b/app/src/main/java/com/litongjava/whisper/cpp/android/java/single/LocalWhisper.java @@ -0,0 +1,48 @@ +package com.litongjava.whisper.cpp.android.java.single; + +import android.app.Application; +import android.os.Build; + +import androidx.annotation.RequiresApi; + +import com.blankj.utilcode.util.Utils; +import com.litongjava.whisper.cpp.android.java.bean.WhisperSegment; +import com.litongjava.whisper.cpp.android.java.utils.AssetUtils; +import com.whispercppdemo.whisper.WhisperContext; + +import java.io.File; +import java.util.List; +import java.util.concurrent.ExecutionException; + +//import com.litongjava.whisper.android.java.bean.WhisperSegment; +//import com.litongjava.whisper.android.java.utils.AssetUtils; + +public enum LocalWhisper { + INSTANCE; + + public static final String modelFilePath = "models/ggml-tiny.bin"; + private WhisperContext whisperContext; + + @RequiresApi(api = Build.VERSION_CODES.O) + LocalWhisper() { + Application context = Utils.getApp(); + File filesDir = context.getFilesDir(); + File modelFile = AssetUtils.copyFileIfNotExists(context, filesDir, modelFilePath); + String realModelFilePath = modelFile.getAbsolutePath(); + whisperContext = WhisperContext.createContextFromFile(realModelFilePath); + } + + public synchronized String transcribeData(float[] data) throws ExecutionException, InterruptedException { + return whisperContext.transcribeData(data); + } + + public List transcribeDataWithTime(float[] audioData) throws ExecutionException, InterruptedException { + return whisperContext.transcribeDataWithTime(audioData); + } + + public void init() { + //noting to do.but init + } + + +} diff --git a/app/src/main/java/com/litongjava/whisper/cpp/android/java/task/SimpleTaskAdapter.java b/app/src/main/java/com/litongjava/whisper/cpp/android/java/task/SimpleTaskAdapter.java new file mode 100644 index 0000000..2ba4455 --- /dev/null +++ b/app/src/main/java/com/litongjava/whisper/cpp/android/java/task/SimpleTaskAdapter.java @@ -0,0 +1,17 @@ +package com.litongjava.whisper.cpp.android.java.task; + +import com.blankj.utilcode.util.ThreadUtils; + +public abstract class SimpleTaskAdapter extends ThreadUtils.Task { + @Override + public void onSuccess(T result) { + } + + @Override + public void onCancel() { + } + + @Override + public void onFail(Throwable t) { + } +} diff --git a/app/src/main/java/com/litongjava/whisper/cpp/android/java/task/TranscriptionTask.java b/app/src/main/java/com/litongjava/whisper/cpp/android/java/task/TranscriptionTask.java new file mode 100644 index 0000000..f4dfe02 --- /dev/null +++ b/app/src/main/java/com/litongjava/whisper/cpp/android/java/task/TranscriptionTask.java @@ -0,0 +1,39 @@ +package com.litongjava.whisper.cpp.android.java.task; + +import android.content.Context; +import android.widget.TextView; + +import com.blankj.utilcode.util.ThreadUtils; +import com.litongjava.jfinal.aop.Aop; +import com.litongjava.whisper.cpp.android.java.services.WhisperService; + +public class TranscriptionTask extends ThreadUtils.Task { + private final Context context; + private final TextView tv; + private final String sampleFilePath; + + public TranscriptionTask(Context context, TextView tv,String sampleFilePath) { + this.context = context; + this.tv = tv; + this.sampleFilePath = sampleFilePath; + + } + + @Override + public Object doInBackground() { + Aop.get(WhisperService.class).transcribeSample(context, tv, sampleFilePath); + return null; + } + + @Override + public void onSuccess(Object result) { + } + + @Override + public void onCancel() { + } + + @Override + public void onFail(Throwable t) { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/litongjava/whisper/cpp/android/java/demo/utils/AssetUtils.java b/app/src/main/java/com/litongjava/whisper/cpp/android/java/utils/AssetUtils.java similarity index 97% rename from app/src/main/java/com/litongjava/whisper/cpp/android/java/demo/utils/AssetUtils.java rename to app/src/main/java/com/litongjava/whisper/cpp/android/java/utils/AssetUtils.java index e42f3fa..cacdd44 100644 --- a/app/src/main/java/com/litongjava/whisper/cpp/android/java/demo/utils/AssetUtils.java +++ b/app/src/main/java/com/litongjava/whisper/cpp/android/java/utils/AssetUtils.java @@ -1,4 +1,4 @@ -package com.litongjava.whisper.cpp.android.java.demo.utils; +package com.litongjava.whisper.cpp.android.java.utils; import android.content.Context; diff --git a/app/src/main/java/com/whispercppdemo/whisper/WhisperContext.java b/app/src/main/java/com/whispercppdemo/whisper/WhisperContext.java index 1f415b5..f3ff60f 100644 --- a/app/src/main/java/com/whispercppdemo/whisper/WhisperContext.java +++ b/app/src/main/java/com/whispercppdemo/whisper/WhisperContext.java @@ -6,7 +6,11 @@ import androidx.annotation.RequiresApi; +import com.litongjava.whisper.cpp.android.java.bean.WhisperSegment; + import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; @@ -33,17 +37,53 @@ public String call() throws Exception { } int numThreads = WhisperCpuConfig.getPreferredThreadCount(); Log.d(LOG_TAG, "Selecting " + numThreads + " threads"); - WhisperLib.fullTranscribe(ptr, numThreads, data); - int textCount = WhisperLib.getTextSegmentCount(ptr); + StringBuilder result = new StringBuilder(); - for (int i = 0; i < textCount; i++) { - result.append(WhisperLib.getTextSegment(ptr, i)); + synchronized (this) { + + WhisperLib.fullTranscribe(ptr, numThreads, data); + int textCount = WhisperLib.getTextSegmentCount(ptr); + for (int i = 0; i < textCount; i++) { + String sentence = WhisperLib.getTextSegment(ptr, i); + result.append(sentence); + } } return result.toString(); } }).get(); } + public List transcribeDataWithTime(float[] data) throws ExecutionException, InterruptedException { + return executorService.submit(new Callable>() { + @RequiresApi(api = Build.VERSION_CODES.O) + @Override + public List call() throws Exception { + if (ptr == 0L) { + throw new IllegalStateException(); + } + int numThreads = WhisperCpuConfig.getPreferredThreadCount(); + Log.d(LOG_TAG, "Selecting " + numThreads + " threads"); + + List segments = new ArrayList<>(); + synchronized (this) { +// StringBuilder result = new StringBuilder(); + WhisperLib.fullTranscribe(ptr, numThreads, data); + int textCount = WhisperLib.getTextSegmentCount(ptr); + for (int i = 0; i < textCount; i++) { + long start = WhisperLib.getTextSegmentT0(ptr, i); + String sentence = WhisperLib.getTextSegment(ptr, i); + long end = WhisperLib.getTextSegmentT1(ptr, i); +// result.append(); + segments.add(new WhisperSegment(start, end, sentence)); + + } +// return result.toString(); + } + return segments; + } + }).get(); + } + @RequiresApi(api = Build.VERSION_CODES.O) public String benchMemory(int nthreads) throws ExecutionException, InterruptedException { return executorService.submit(() -> WhisperLib.benchMemcpy(nthreads)).get(); diff --git a/app/src/main/java/com/whispercppdemo/whisper/WhisperLib.java b/app/src/main/java/com/whispercppdemo/whisper/WhisperLib.java index 7a38177..bf99cc7 100644 --- a/app/src/main/java/com/whispercppdemo/whisper/WhisperLib.java +++ b/app/src/main/java/com/whispercppdemo/whisper/WhisperLib.java @@ -6,41 +6,32 @@ import androidx.annotation.RequiresApi; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.InputStream; @RequiresApi(api = Build.VERSION_CODES.O) public class WhisperLib { private static final String LOG_TAG = "LibWhisper"; - private static Logger log = LoggerFactory.getLogger(WhisperLib.class); static { Log.d(LOG_TAG, "Primary ABI: " + Build.SUPPORTED_ABIS[0]); - log.info("Primary ABI: " + Build.SUPPORTED_ABIS[0]); boolean loadVfpv4 = false; boolean loadV8fp16 = false; - if (Utils.isArmEabiV7a()) { - String cpuInfo = Utils.cpuInfo(); + if (WhisperUtils.isArmEabiV7a()) { + String cpuInfo = WhisperUtils.cpuInfo(); if (cpuInfo != null) { Log.d(LOG_TAG, "CPU info: " + cpuInfo); - log.info("CPU info: " + cpuInfo); if (cpuInfo.contains("vfpv4")) { Log.d(LOG_TAG, "CPU supports vfpv4"); - log.info("CPU supports vfpv4"); loadVfpv4 = true; } } - } else if (Utils.isArmEabiV8a()) { - String cpuInfo = Utils.cpuInfo(); + } else if (WhisperUtils.isArmEabiV8a()) { + String cpuInfo = WhisperUtils.cpuInfo(); if (cpuInfo != null) { Log.d(LOG_TAG, "CPU info: " + cpuInfo); - log.info("CPU info: " + cpuInfo); if (cpuInfo.contains("fphp")) { Log.d(LOG_TAG, "CPU supports fp16 arithmetic"); - log.info("CPU supports fp16 arithmetic"); loadV8fp16 = true; } } @@ -48,15 +39,12 @@ public class WhisperLib { if (loadVfpv4) { Log.d(LOG_TAG, "Loading libwhisper_vfpv4.so"); - log.info("Loading libwhisper_vfpv4.so"); System.loadLibrary("whisper_vfpv4"); } else if (loadV8fp16) { Log.d(LOG_TAG, "Loading libwhisper_v8fp16_va.so"); - log.info("Loading libwhisper_v8fp16_va.so"); System.loadLibrary("whisper_v8fp16_va"); } else { Log.d(LOG_TAG, "Loading libwhisper.so"); - log.info("Loading libwhisper.so"); System.loadLibrary("whisper"); } } @@ -75,6 +63,10 @@ public class WhisperLib { public static native String getTextSegment(long contextPtr, int index); + public static native long getTextSegmentT0(long contextPtr, int index); + + public static native long getTextSegmentT1(long contextPtr, int index); + public static native String getSystemInfo(); public static native String benchMemcpy(int nthread); diff --git a/app/src/main/java/com/whispercppdemo/whisper/Utils.java b/app/src/main/java/com/whispercppdemo/whisper/WhisperUtils.java similarity index 96% rename from app/src/main/java/com/whispercppdemo/whisper/Utils.java rename to app/src/main/java/com/whispercppdemo/whisper/WhisperUtils.java index f825cb1..5781db5 100644 --- a/app/src/main/java/com/whispercppdemo/whisper/Utils.java +++ b/app/src/main/java/com/whispercppdemo/whisper/WhisperUtils.java @@ -8,7 +8,7 @@ import java.io.File; import java.nio.file.Path; -public class Utils { +public class WhisperUtils { private static final String LOG_TAG = "LibWhisper"; diff --git a/app/src/main/jniLibs/arm64-v8a/libwhisper.so b/app/src/main/jniLibs/arm64-v8a/libwhisper.so index d0da8d4..9c2d5ad 100644 Binary files a/app/src/main/jniLibs/arm64-v8a/libwhisper.so and b/app/src/main/jniLibs/arm64-v8a/libwhisper.so differ diff --git a/app/src/main/jniLibs/arm64-v8a/libwhisper_v8fp16_va.so b/app/src/main/jniLibs/arm64-v8a/libwhisper_v8fp16_va.so index 2a43994..13d0bb7 100644 Binary files a/app/src/main/jniLibs/arm64-v8a/libwhisper_v8fp16_va.so and b/app/src/main/jniLibs/arm64-v8a/libwhisper_v8fp16_va.so differ diff --git a/app/src/main/jniLibs/armeabi-v7a/libwhisper.so b/app/src/main/jniLibs/armeabi-v7a/libwhisper.so deleted file mode 100644 index 97c5724..0000000 Binary files a/app/src/main/jniLibs/armeabi-v7a/libwhisper.so and /dev/null differ diff --git a/app/src/main/jniLibs/armeabi-v7a/libwhisper_vfpv4.so b/app/src/main/jniLibs/armeabi-v7a/libwhisper_vfpv4.so deleted file mode 100644 index d44bbfe..0000000 Binary files a/app/src/main/jniLibs/armeabi-v7a/libwhisper_vfpv4.so and /dev/null differ diff --git a/app/src/main/jniLibs/x86/libwhisper.so b/app/src/main/jniLibs/x86/libwhisper.so deleted file mode 100644 index 1a52935..0000000 Binary files a/app/src/main/jniLibs/x86/libwhisper.so and /dev/null differ diff --git a/app/src/main/jniLibs/x86_64/libwhisper.so b/app/src/main/jniLibs/x86_64/libwhisper.so deleted file mode 100644 index 73c5015..0000000 Binary files a/app/src/main/jniLibs/x86_64/libwhisper.so and /dev/null differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index c6d97ef..a435f5c 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,19 +1,64 @@ - + + +