Forráskód Böngészése

Support reading files from SD card for Android (#171)

* Support reading files from SD card for android

* fix style issues
Fangjun Kuang 2 éve
szülő
commit
c2c11a04dd

+ 11 - 3
android/SherpaNcnn/app/src/main/java/com/k2fsa/sherpa/ncnn/SherpaNcnn.kt

@@ -36,13 +36,17 @@ data class RecognizerConfig(
 )
 
 class SherpaNcnn(
-    assetManager: AssetManager,
     var config: RecognizerConfig,
+    assetManager: AssetManager? = null,
 ) {
     private val ptr: Long
 
     init {
-        ptr = new(assetManager, config)
+        if (assetManager != null) {
+            ptr = newFromAsset(assetManager, config)
+        } else {
+            ptr = newFromFile(config)
+        }
     }
 
     protected fun finalize() {
@@ -63,11 +67,15 @@ class SherpaNcnn(
     val text: String
         get() = getText(ptr)
 
-    private external fun new(
+    private external fun newFromAsset(
         assetManager: AssetManager,
         config: RecognizerConfig,
     ): Long
 
+    private external fun newFromFile(
+        config: RecognizerConfig,
+    ): Long
+
     private external fun delete(ptr: Long)
     private external fun acceptWaveform(ptr: Long, samples: FloatArray, sampleRate: Float)
     private external fun inputFinished(ptr: Long)

+ 1 - 0
sherpa-ncnn/csrc/features.cc

@@ -21,6 +21,7 @@
 #include <algorithm>
 #include <memory>
 #include <mutex>  // NOLINT
+#include <vector>
 
 #include "kaldi-native-fbank/csrc/online-feature.h"
 #include "mat.h"  // NOLINT

+ 4 - 4
sherpa-ncnn/csrc/stream.cc

@@ -50,10 +50,10 @@ class Stream::Impl {
 
   int32_t &GetNumProcessedFrames() { return num_processed_frames_; }
 
-  void SetResult(const DecoderResult &r) { 
-	  int32_t offset = result_.frame_offset;
-	  result_ = r; 
-	  result_.frame_offset = offset;
+  void SetResult(const DecoderResult &r) {
+    int32_t offset = result_.frame_offset;
+    result_ = r;
+    result_.frame_offset = offset;
   }
 
   DecoderResult &GetResult() { return result_; }

+ 34 - 22
sherpa-ncnn/jni/jni.cc

@@ -42,19 +42,17 @@ namespace sherpa_ncnn {
 
 class SherpaNcnn {
  public:
-  SherpaNcnn(
 #if __ANDROID_API__ >= 9
-      AAssetManager *mgr,
-#endif
-      const sherpa_ncnn::RecognizerConfig &config)
-      : recognizer_(
-#if __ANDROID_API__ >= 9
-            mgr,
+  SherpaNcnn(AAssetManager *mgr, const sherpa_ncnn::RecognizerConfig &config)
+      : recognizer_(mgr, config),
+        stream_(recognizer_.CreateStream()),
+        tail_padding_(16000 * 0.32, 0) {}
 #endif
-            config),
+
+  explicit SherpaNcnn(const sherpa_ncnn::RecognizerConfig &config)
+      : recognizer_(config),
         stream_(recognizer_.CreateStream()),
-        tail_padding_(16000 * 0.32, 0) {
-  }
+        tail_padding_(16000 * 0.32, 0) {}
 
   void AcceptWaveform(float sample_rate, const float *samples, int32_t n) {
     stream_->AcceptWaveform(sample_rate, samples, n);
@@ -237,18 +235,7 @@ static DecoderConfig GetDecoderConfig(JNIEnv *env, jobject config) {
 #endif
 }
 
-}  // namespace sherpa_ncnn
-
-SHERPA_EXTERN_C
-JNIEXPORT jlong JNICALL Java_com_k2fsa_sherpa_ncnn_SherpaNcnn_new(
-    JNIEnv *env, jobject /*obj*/, jobject asset_manager, jobject _config) {
-#if __ANDROID_API__ >= 9
-  AAssetManager *mgr = AAssetManager_fromJava(env, asset_manager);
-  if (!mgr) {
-    NCNN_LOGE("Failed to get asset manager: %p", mgr);
-  }
-#endif
-
+static RecognizerConfig ParseConfig(JNIEnv *env, jobject _config) {
   sherpa_ncnn::RecognizerConfig config;
   config.feat_config = sherpa_ncnn::GetFeatureExtractorConfig(env, _config);
   config.model_config = sherpa_ncnn::GetModelConfig(env, _config);
@@ -274,6 +261,31 @@ JNIEXPORT jlong JNICALL Java_com_k2fsa_sherpa_ncnn_SherpaNcnn_new(
 
   NCNN_LOGE("------config------\n%s\n", config.ToString().c_str());
 
+  return config;
+}
+
+}  // namespace sherpa_ncnn
+
+SHERPA_EXTERN_C
+JNIEXPORT jlong JNICALL Java_com_k2fsa_sherpa_ncnn_SherpaNcnn_newFromFile(
+    JNIEnv *env, jobject /*obj*/, jobject _config) {
+  sherpa_ncnn::RecognizerConfig config = sherpa_ncnn::ParseConfig(env, _config);
+  auto model = new sherpa_ncnn::SherpaNcnn(config);
+
+  return (jlong)model;
+}
+
+SHERPA_EXTERN_C
+JNIEXPORT jlong JNICALL Java_com_k2fsa_sherpa_ncnn_SherpaNcnn_newFromAsset(
+    JNIEnv *env, jobject /*obj*/, jobject asset_manager, jobject _config) {
+#if __ANDROID_API__ >= 9
+  AAssetManager *mgr = AAssetManager_fromJava(env, asset_manager);
+  if (!mgr) {
+    NCNN_LOGE("Failed to get asset manager: %p", mgr);
+  }
+#endif
+
+  sherpa_ncnn::RecognizerConfig config = sherpa_ncnn::ParseConfig(env, _config);
   auto model = new sherpa_ncnn::SherpaNcnn(
 #if __ANDROID_API__ >= 9
       mgr,