Closed yyccR closed 8 months ago
请问这样c-api可以直接在Android上跑起来吗
你想在 android 上如何调用 c api 呢?
另外 libsherpa-ncnn-jni.so 是否可以不引入项目作为依赖库.
其他库不依赖这个 库,你不想用的话,可以删掉。但是你删掉后,就不能用 我们提供的 jni 接口了.
是这样的,我是用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");
然后flutter是本身dart语言是支持直接调用C
是不是和 Go/Swift/C# 等调用 python 的方式一样,不依赖 JVM 虚拟机?
如果是的话,那么你说的是对的。
注意调用 c api 里面的释放函数来释放资源,避免内存泄漏。
你可以参考我们是如何在 swift/c#/go 里面调用 c api 的,你需要再额外封装一层,利用 resource acquisition is initialization, 在析构函数里面释放资源, 在 构造函数里面分配资源。
你不需要 jvm 虚拟机的话,不需要 libsherpa-ncnn-jni.so. 这个库,是给 java/kotlin 通过 jvm 调用 c++ 代码用的。
好的,我试试,晚点在这里贴一下实验结果
@yyccR
目前有碰到问题没?
测试一切顺利,通过编译完c-api,集成到Android里面,dart层面调用没有异常,对比whisper-tiny模型,速度提升明显。待会我贴一下代码和测试效果图
左边是whisper-tiny多语言模型,右边是sherpa-ncnn zipformer-zh-14M-2023-02-23
, 测试音频为21s的中文wav, 均没开启gpu/vulkan.
期待开源!
作者你好,您提供的Android动态库编译的产物为:
这些库的使用是通过jni方法在kotlin里面调用C实现语音识别,但是现在我想着在我的flutter代码里调用,flutter代码里调用C是通过类似sherpa-ncnn里面的C-api的方式,我通过下面的方式编译可以得到
libsherpa-ncnn-c-api.so
,输出有
请问这样c-api可以直接在Android上跑起来吗,另外
libsherpa-ncnn-jni.so
是否可以不引入项目作为依赖库.