k2-fsa / sherpa-ncnn

Real-time speech recognition using next-gen Kaldi with ncnn without Internet connection. Support iOS, Android, Raspberry Pi, VisionFive2, LicheePi4A etc.
https://k2-fsa.github.io/sherpa/ncnn/index.html
Apache License 2.0
902 stars 138 forks source link

编译Android动态库c-api #278

Closed yyccR closed 8 months ago

yyccR commented 8 months ago

作者你好,您提供的Android动态库编译的产物为:

libsherpa-ncnn-jni.so
libsherpa-ncnn-core.so
libncnn.so
libkaldi-native-fbank-core.so

这些库的使用是通过jni方法在kotlin里面调用C实现语音识别,但是现在我想着在我的flutter代码里调用,flutter代码里调用C是通过类似sherpa-ncnn里面的C-api的方式,我通过下面的方式编译可以得到 libsherpa-ncnn-c-api.so

cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" \
    -DCMAKE_BUILD_TYPE=Release \
    -DBUILD_SHARED_LIBS=ON \
    -DSHERPA_NCNN_ENABLE_PORTAUDIO=OFF \
    -DSHERPA_NCNN_ENABLE_BINARY=OFF \
    -DSHERPA_NCNN_ENABLE_TEST=OFF \
    -DSHERPA_NCNN_ENABLE_C_API=ON \
    -DSHERPA_NCNN_ENABLE_GENERATE_INT8_SCALE_TABLE=OFF \
    -DCMAKE_INSTALL_PREFIX=./install \
    -DANDROID_ABI="armeabi-v7a" -DANDROID_ARM_NEON=ON \
    -DANDROID_PLATFORM=android-30 ..

输出有

libsherpa-ncnn-jni.so
libsherpa-ncnn-core.so
libsherpa-ncnn-c-api.so
libncnn.so
libkaldi-native-fbank-core.so

请问这样c-api可以直接在Android上跑起来吗,另外 libsherpa-ncnn-jni.so 是否可以不引入项目作为依赖库.

csukuangfj commented 8 months ago

请问这样c-api可以直接在Android上跑起来吗

你想在 android 上如何调用 c api 呢?


另外 libsherpa-ncnn-jni.so 是否可以不引入项目作为依赖库.

其他库不依赖这个 库,你不想用的话,可以删掉。但是你删掉后,就不能用 我们提供的 jni 接口了.

yyccR commented 8 months ago

是这样的,我是用flutter写的Android UI,然后flutter是本身dart语言是支持直接调用C,类似下面, 定义好跟C的类型,方法映射就行:

ypedef _InitNative = Int8 Function(Pointer<Int8> param, Pointer<Int8> bin);
typedef _Init = int Function(Pointer<Int8> param, Pointer<Int8> bin);

_initNanoDetPlus = dynamicLibrary.lookupFunction<_InitNative, _Init>("init");
csukuangfj commented 8 months ago

然后flutter是本身dart语言是支持直接调用C

是不是和 Go/Swift/C# 等调用 python 的方式一样,不依赖 JVM 虚拟机?

如果是的话,那么你说的是对的。

注意调用 c api 里面的释放函数来释放资源,避免内存泄漏。

你可以参考我们是如何在 swift/c#/go 里面调用 c api 的,你需要再额外封装一层,利用 resource acquisition is initialization, 在析构函数里面释放资源, 在 构造函数里面分配资源。

csukuangfj commented 8 months ago

你不需要 jvm 虚拟机的话,不需要 libsherpa-ncnn-jni.so. 这个库,是给 java/kotlin 通过 jvm 调用 c++ 代码用的。

yyccR commented 8 months ago

好的,我试试,晚点在这里贴一下实验结果

csukuangfj commented 8 months ago

@yyccR

目前有碰到问题没?

yyccR commented 8 months ago

测试一切顺利,通过编译完c-api,集成到Android里面,dart层面调用没有异常,对比whisper-tiny模型,速度提升明显。待会我贴一下代码和测试效果图

yyccR commented 8 months ago

左边是whisper-tiny多语言模型,右边是sherpa-ncnn zipformer-zh-14M-2023-02-23, 测试音频为21s的中文wav, 均没开启gpu/vulkan.

image

312F211B31DB54D4172D343FC1954FFC

csukuangfj commented 8 months ago

期待开源!