手把手的操作——用java调用科大讯飞的离线语音识别dll实现离线识别(JNA实现)(一)

版权声明:原创文章本人保留一切权力,转载必须联系我 企鹅号2110127392 https://blog.csdn.net/weixin_43112746/article/details/82864125

#用java调用科大讯飞的离线语音识别dll实现离线识别(JNA实现)(一)

本人接的任务,做离线语音识别,用的是科大讯飞的离线识别,java不支持离线了,所以下载了windows的离线包,用JNA进行调用。之前用的是jni,但是一直没有测试通过,本人又不会C++,研究了一个星期终究放弃。转而使用JNA,JNA使用只要导入一个jar包即可,JNA实际上是对JNI的一种封装。

【在线语音识别的实现看我的另一篇】科大讯飞 在线语音识别 音频来源为【文件】的java接入实现, 适用于初学者

说明

本人一边做一边写,记录问题和解决办法,留给自己思考和大家交流。如有不对的地方,欢迎批评指正!
【ps】现在已经做完,参考第二篇

一、注册用户,下载dll这个先略过,很简单,可以参考其他的……【待】
1、先进入讯飞开放平台,先注册【地址】https://www.xfyun.cn/
2、创建应用,记得平台选windows,因为java不支持离线
在这里插入图片描述

3、创建完成之后,在 我的应用 中
在这里插入图片描述

选择【离线命令词识别】
就完成创建了!

4、下载需要的SDK,这个SDK包含了动态库dll,静态库lib,头文件.h,以及非常重要的例子!
在这里插入图片描述
【点亮需要的功能,下载相应的SDK】
在这里插入图片描述
下载好之后,找出其中的dll文件,两个版本,上面是32位系统,下面是64位系统,本人是64位的
在这里插入图片描述

二、调用JNA
1下载jna的jar包
【JNA包下载地址】:https://download.csdn.net/download/weixin_43112746/10690193

2导入java工程中
在这里插入图片描述
jar包的位置,可以放在根目录,也可以像我一样创立一个lib文件夹来放置
然后
右键工程–properties—java Build Path----libraries—add jars
在这里插入图片描述
【找到相应的JNA包的位置,添加之后点击Apply and Close】就完成JNA包的导入
【JNA包下载地址】:https://download.csdn.net/download/weixin_43112746/10690193

没有做过的,先加载个例子试试!
在这里插入图片描述

创建一个class,一个interface,下面的是讯飞的dll文件放在根目录下
【接口】这里只测试登录的函数

package test;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;

public interface VoiceLib extends Library {
	  int MSPLogin(String usr, String pwd, String params);
	  VoiceLib instance = (VoiceLib)Native.loadLibrary("msc_x64", VoiceLib.class);//接口直接对动态库文件进行调用,
	  //省去JNI的繁琐步骤
		

}

【类】
package test;

import com.sun.jna.Native;

public class Voice {
		public static void main(String[] args) {
		String usr=null;
		String pwd=null;
		String params="appid=5ba4bc08";//这里填写自己的appid,从讯飞的我的应用里面粘贴过来
		int a;
		a=VoiceLib.instance.MSPLogin(usr, pwd, params);//调用接口的方法传参数
		System.out.println(“a=”+a);
		
		
	}
}




输出结果a=0
很明显测试成功了!
能够继续往下写了。

又遇到问题,参数的转换!
普通的倒是还好,转换关系如下:
在这里插入图片描述
来源:https://github.com/java-native-access/jna/blob/master/www/Mappings.md
可是问题来了,讯飞中有指针,句柄,回调函数等等各种乱七八糟的参数,这可怎么转换?头顶一直乌鸦飞过……

三、参数的转换(难点)
登录做完了,再做构建语法,其中用到的函数是

int MSPAPI QISRBuildGrammar(const char *grammarType, const char *grammarContent, unsigned int grammarLength,
 const char *params, GrammarCallBack callback, void *userData);

除了无符号int那个,其他都没有!又一只乌鸦飞过……
竟然还有语法回调函数!这是什么!又一只乌鸦飞过……
查一下回调函数
【百度】这是个链接哈

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

找个资源帖参考下:
https://blog.csdn.net/l527719041/article/details/77461328

哦!原来可以这么操作!

先把const char *解决,这是要转换成String 【待】

再来解决回调函数的参数问题!
【先做这么多,下回分解】
第二篇的链接:手把手的操作——用java调用科大讯飞的离线语音识别dll实现离线识别(JNA实现)(二)

猜你喜欢

转载自blog.csdn.net/weixin_43112746/article/details/82864125