广告
返回顶部
首页 > 资讯 > 精选 >Java中怎么通过调用jna实现语音识别功能
  • 572
分享到

Java中怎么通过调用jna实现语音识别功能

2023-06-17 09:06:48 572人浏览 安东尼
摘要

Java中怎么通过调用jna实现语音识别功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。JNAjava调用.dll获取.so一般通过JNI,但是JNI的使用比较复杂,需要用C

Java中怎么通过调用jna实现语音识别功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

JNA

java调用.dll获取.so一般通过JNI,但是JNI的使用比较复杂,需要用C另写一个共享库进行适配。而JNA是一个自动适配工具,通过它调用.dll只需要一个借口即可。

官网:https://GitHub.com/twall/jna/。下载jna.jar即可。

编写接口

科大讯飞语音云主要提供语音合成和语音识别两个方面的东西,我主要使用语音识别这块的功能。

建立接口QtSR,继承Library。

将msc.dll等文件复制到项目根目录。

Java中怎么通过调用jna实现语音识别功能

加载msc.dll

QTSR INSTANCE = (QTSR) Native.loadLibrary("msc", QTSR.class);

然后来看一下msc.dll公开了哪些方法。首先是QISRInit,这是一个全局初始化函数。

Java中怎么通过调用jna实现语音识别功能

它的返回值为int,参数是const char*。int还是java的int,但是char*就对应的是java的String了。

所以在QTSR中添加方法:

public int QISRInit(String configs);

返回值在msp_errors.h中定义,等一下我们还是要弄在java里面去。

继续看QISRInit函数,在官方文档中有调用示例:

const char* configs=“server_url=dev.voicecloud.cn, timeout=10000, vad_enable=true”;     int   ret = QISRInit( configs );     if(MSP_SUCCESS != ret )     {             printf( “QISRInit failed, error code is: %d”, ret );     }

对应的在java中的调用代码如下:

String config = "server_url=dev.voicecloud.cn, timeout=10000, vad_enable=true";   int code = QTSR.INSTANCE.QISRInit(config);   if (code != 0) {     System.out.println("QISRInit failed, error code is:" + code);   }

我们在看一个函数:QISRSessionBegin,这个开始一路ISR会话。

Java中怎么通过调用jna实现语音识别功能

还是刚才的思路,char*对应java的String,但是注意一下int *errorCode。这个函数其实传入两个参数,传出两个参数。即本身返回的sessionId,还有errorCode。

这里的int*对应的是jna的IntByReference。所以添加方法:

public String QISRSessionBegin(String grammarList, String params,IntByReference errorCode);

同样看看官方示例:

 const char*      params=     “SSM=1,sub=iat,aue=speex-wb;7,auf=audio/L16;rate=16000,ent=sms16k,rst=plain,vad_timeout=1000,vad_speech_tail=1000”;   int ret = MSP_SUCCESS;     const char*     session_id = QISRSessionBegin( NULL, params, &ret );     if(MSP_SUCCESS != ret )     {             printf( “QISRSessionBegin failed, error code is: %d”, ret );     }

在java这样写:

String params = "ssm=1,sub=iat,aue=speex-wb;7,auf=audio/L16;rate=16000,ent=sms16k,rst=plain,vad_timeout=1000,vad_speech_tail=1000";   IntByReference errorCode = new IntByReference();   String sessionId = QTSR.INSTANCE.QISRSessionBegin(null, params,errorCode);

运行效果:

Java中怎么通过调用jna实现语音识别功能

其他的函数处理方式大致相同,这里贴上一个c和java在jna中的类型对应表:

Java中怎么通过调用jna实现语音识别功能

其中Unsigned类型和signed在java中对应是一样的。

.h文件和常量处理

在SDK的include目录有4个.h文件,定义了一些常量,比如上面一节中的0其实是msp_errors.h中MSP_SUCCESS。

我以msp_errors.h为例,建立一个接口Msp_errors,继承StdCallLibrary。

照着msp_errors.h中的定义在Msp_errors中进行定义。

public static final int MSP_SUCCESS = 0;   public static final int ERROR_FAIL  = -1;   public static final int ERROR_EXCEPTION= -2;   public static final int ERROR_GENERAL= 10100;      public static final int ERROR_OUT_OF_MEMORY= 10101;        public static final int ERROR_FILE_NOT_FOUND= 10102;       public static final int ERROR_NOT_SUPPORT= 10103;

使用很简单的,比如MSP_SUCCESS 就是Msp_errors.MSP_SUCCESS。

完整代码和文件

这个只是语音识别部分的,语音合成的话我记得有人做过jni接口的。

*QTSR.java

package com.cnblogs.htynkn;     import com.sun.jna.Library;  import com.sun.jna.Native;  import com.sun.jna.Pointer;  import com.sun.jna.ptr.IntByReference;         public interface QTSR extends Library {      QTSR INSTANCE = (QTSR) Native.loadLibrary("msc", QTSR.class);              public int QISRInit(String configs);              public String QISRSessionBegin(String grammarList, String params,              IntByReference errorCode);              public int QISRGrammarActivate(String sessionID, String grammar,              String type, int weight);              public int QISRAudioWrite(String sessionID, Pointer waveData, int waveLen,              int audiOStatus, IntByReference epStatus, IntByReference recogStatus);              public String QISRGetResult(String sessionID, IntByReference rsltStatus,              int waitTime, IntByReference errorCode);              public int QISRSessionEnd(String sessionID, String hints);              public int QISRGetParam(String sessionID, String paramName,              String paramValue, IntByReference valueLen);              public int QISRFini();  }   *Msp_errors  ?  package com.cnblogs.htynkn;     import com.sun.jna.win32.StdCallLibrary;         public interface Msp_errors extends StdCallLibrary {      public static final int MSP_SUCCESS = 0;      public static final int ERROR_FAIL  = -1;      public static final int ERROR_EXCEPTION= -2;      public static final int ERROR_GENERAL= 10100;        public static final int ERROR_OUT_OF_MEMORY= 10101;          public static final int ERROR_FILE_NOT_FOUND= 10102;         public static final int ERROR_NOT_SUPPORT= 10103;        public static final int ERROR_NOT_IMPLEMENT= 10104;          public static final int ERROR_ACCESS= 10105;         public static final int ERROR_INVALID_PARA= 10106;       public static final int ERROR_INVALID_PARA_VALUE= 10107;         public static final int ERROR_INVALID_HANDLE= 10108;         public static final int ERROR_INVALID_DATA= 10109;       public static final int ERROR_NO_LICENSE= 10110;         public static final int ERROR_NOT_INIT= 10111;       public static final int ERROR_NULL_HANDLE= 10112;        public static final int ERROR_OVERFLOW= 10113;       public static final int ERROR_TIME_OUT= 10114;       public static final int ERROR_OPEN_FILE= 10115;          public static final int ERROR_NOT_FOUND= 10116;          public static final int ERROR_NO_ENOUGH_BUFFER= 10117;       public static final int ERROR_NO_DATA= 10118;        public static final int ERROR_NO_MORE_DATA= 10119;       public static final int ERROR_NO_RESPONSE_DATA= 10120;       public static final int ERROR_ALREADY_EXIST= 10121;          public static final int ERROR_LOAD_MODULE= 10122;        public static final int ERROR_BUSY  = 10123;         public static final int ERROR_INVALID_CONFIG= 10124;         public static final int ERROR_VERSION_CHECK= 10125;          public static final int ERROR_CANCELED= 10126;       public static final int ERROR_INVALID_MEDIA_TYPE= 10127;         public static final int ERROR_CONFIG_INITIALIZE= 10128;          public static final int ERROR_CREATE_HANDLE= 10129;          public static final int ERROR_coding_LIB_NOT_LOAD= 10130;            public static final int ERROR_NET_GENERAL= 10200;        public static final int ERROR_NET_OPENSOCK= 10201;          public static final int ERROR_NET_CONNECTSOCK= 10202;           public static final int ERROR_NET_ACCEPTSOCK = 10203;           public static final int ERROR_NET_SENDSOCK= 10204;          public static final int ERROR_NET_RECVSOCK= 10205;          public static final int ERROR_NET_INVALIDSOCK= 10206;           public static final int ERROR_NET_BADADDRESS = 10207;           public static final int ERROR_NET_BINDSEQUENCE= 10208;          public static final int ERROR_NET_NOTOPENSOCK= 10209;           public static final int ERROR_NET_NOTBIND= 10210;           public static final int ERROR_NET_NOTLISTEN  = 10211;           public static final int ERROR_NET_CONNECTCLOSE= 10212;          public static final int ERROR_NET_NOTDGRAMSOCK= 10213;          public static final int ERROR_NET_DNS= 10214;               public static final int ERROR_MSG_GENERAL= 10300;        public static final int ERROR_MSG_PARSE_ERROR= 10301;        public static final int ERROR_MSG_BUILD_ERROR= 10302;        public static final int ERROR_MSG_PARAM_ERROR= 10303;        public static final int ERROR_MSG_CONTENT_EMPTY= 10304;          public static final int ERROR_MSG_INVALID_CONTENT_TYPE      = 10305;         public static final int ERROR_MSG_INVALID_CONTENT_LENGTH    = 10306;         public static final int ERROR_MSG_INVALID_CONTENT_ENCODE    = 10307;         public static final int ERROR_MSG_INVALID_KEY= 10308;        public static final int ERROR_MSG_KEY_EMPTY= 10309;          public static final int ERROR_MSG_SESSION_ID_EMPTY= 10310;       public static final int ERROR_MSG_LOGIN_ID_EMPTY= 10311;         public static final int ERROR_MSG_SYNC_ID_EMPTY= 10312;          public static final int ERROR_MSG_APP_ID_EMPTY= 10313;       public static final int ERROR_MSG_EXTERN_ID_EMPTY= 10314;        public static final int ERROR_MSG_INVALID_CMD= 10315;        public static final int ERROR_MSG_INVALID_SUBJECT= 10316;        public static final int ERROR_MSG_INVALID_VERSION= 10317;        public static final int ERROR_MSG_NO_CMD= 10318;         public static final int ERROR_MSG_NO_SUBJECT= 10319;         public static final int ERROR_MSG_NO_VERSION= 10320;         public static final int ERROR_MSG_MSSP_EMPTY= 10321;         public static final int ERROR_MSG_NEW_RESPONSE= 10322;       public static final int ERROR_MSG_NEW_CONTENT= 10323;        public static final int ERROR_MSG_INVALID_SESSION_ID        = 10324;             public static final int ERROR_DB_GENERAL= 10400;         public static final int ERROR_DB_EXCEPTION= 10401;       public static final int ERROR_DB_NO_RESULT= 10402;       public static final int ERROR_DB_INVALID_USER= 10403;        public static final int ERROR_DB_INVALID_PWD= 10404;         public static final int ERROR_DB_CONNECT= 10405;         public static final int ERROR_DB_INVALID_sql= 10406;         public static final int ERROR_DB_INVALID_APPID= 10407;           public static final int ERROR_RES_GENERAL= 10500;        public static final int ERROR_RES_LOAD = 10501;             public static final int ERROR_RES_FREE = 10502;             public static final int ERROR_RES_MISSING = 10503;          public static final int ERROR_RES_INVALID_NAME  = 10504;            public static final int ERROR_RES_INVALID_ID    = 10505;            public static final int ERROR_RES_INVALID_IMG   = 10506;            public static final int ERROR_RES_WRITE= 10507;             public static final int ERROR_RES_LEAK = 10508;             public static final int ERROR_RES_HEAD = 10509;             public static final int ERROR_RES_DATA = 10510;             public static final int ERROR_RES_SKIP = 10511;                 public static final int ERROR_TTS_GENERAL= 10600;        public static final int ERROR_TTS_TEXTEND = 10601;         public static final int ERROR_TTS_TEXT_EMPTY= 10602;               public static final int ERROR_REC_GENERAL= 10700;        public static final int ERROR_REC_INACTIVE= 10701;       public static final int ERROR_REC_GRAMMAR_ERROR= 10702;          public static final int ERROR_REC_NO_ACTIVE_GRAMMARS        = 10703;         public static final int ERROR_REC_DUPLICATE_GRAMMAR= 10704;          public static final int ERROR_REC_INVALID_MEDIA_TYPE        = 10705;         public static final int ERROR_REC_INVALID_LANGUAGE= 10706;       public static final int ERROR_REC_URI_NOT_FOUND= 10707;          public static final int ERROR_REC_URI_TIMEOUT= 10708;        public static final int ERROR_REC_URI_FETCH_ERROR= 10709;            public static final int ERROR_EP_GENERAL= 10800;         public static final int ERROR_EP_NO_SESSION_NAME= 10801;         public static final int ERROR_EP_INACTIVE  = 10802;          public static final int ERROR_EP_INITIALIZED    = 10803;               public static final int ERROR_TUV_GENERAL= 10900;        public static final int ERROR_TUV_GETHIDPARAM       = 10901;            public static final int ERROR_TUV_TOKEN= 10902;             public static final int ERROR_TUV_CFGFILE= 10903;           public static final int ERROR_TUV_RECV_CONTENT  = 10904;            public static final int ERROR_TUV_VERFAIL    = 10905;               public static final int ERROR_LOGIN_SUCCESS= 11000;             public static final int ERROR_LOGIN_NO_LICENSE          = 11001;            public static final int ERROR_LOGIN_SESSIONID_INVALID       = 11002;            public static final int ERROR_LOGIN_SESSIONID_ERROR= 11003;             public static final int ERROR_LOGIN_UNLOGIN       = 11004;          public static final int ERROR_LOGIN_INVALID_USER            = 11005;            public static final int ERROR_LOGIN_INVALID_PWD             = 11006;            public static final int ERROR_LOGIN_SYSTEM_ERROR= 11099;                public static final int ERROR_HCR_GENERAL= 11100;      public static final int ERROR_HCR_RESOURCE_NOT_EXIST        = 11101;      public static final int ERROR_HCR_CREATE= 11102;      public static final int ERROR_HCR_DESTROY= 11103;      public static final int ERROR_HCR_START= 11104;      public static final int ERROR_HCR_APPEND_STROKES= 11105;      public static final int ERROR_HCR_GET_RESULT= 11106;      public static final int ERROR_HCR_SET_PREDICT_DATA= 11107;      public static final int ERROR_HCR_GET_PREDICT_RESULT        = 11108;             public static final int ERROR_Http_BASE= 12000;          public static final int ERROR_ISV_NO_USER  = 13000;              public static final int ERROR_lua_BASE= 14000;         public static final int ERROR_LUA_YIELD= 14001;      public static final int ERROR_LUA_ERRRUN= 14002;         public static final int ERROR_LUA_ERRSYNTAX= 14003;      public static final int ERROR_LUA_ERRMEM= 14004;         public static final int ERROR_LUA_ERRERR= 14005;     }

看完上述内容,你们掌握Java中怎么通过调用jna实现语音识别功能的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: Java中怎么通过调用jna实现语音识别功能

本文链接: https://www.lsjlt.com/news/288223.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中怎么通过调用jna实现语音识别功能
    Java中怎么通过调用jna实现语音识别功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。JNAjava调用.dll获取.so一般通过JNI,但是JNI的使用比较复杂,需要用C...
    99+
    2023-06-17
  • android语音识别功能怎么实现
    要实现Android平台的语音识别功能,可以使用Android提供的语音识别API,具体步骤如下: 在AndroidManife...
    99+
    2023-10-22
    android
  • Java离线中文语音文字识别功能怎么实现
    这篇文章主要讲解了“Java离线中文语音文字识别功能怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java离线中文语音文字识别功能怎么实现”吧!1、pom文件如下:<xml&n...
    99+
    2023-07-02
  • Linux下怎么用python实现语音识别功能
    这篇文章主要介绍“Linux下怎么用python实现语音识别功能”,在日常操作中,相信很多人在Linux下怎么用python实现语音识别功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux下怎么用py...
    99+
    2023-07-05
  • 基于C#怎么实现语音识别功能
    今天小编给大家分享一下基于C#怎么实现语音识别功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在.NET4.0中,我可以借...
    99+
    2023-06-30
  • Python3.7 + Yolo3怎么实现识别语音播报功能
    这篇文章将为大家详细讲解有关Python3.7 + Yolo3怎么实现识别语音播报功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、利用Python调用系统win10...
    99+
    2023-06-22
  • Python调用百度api怎么实现语音识别
    Python调用百度api怎么实现语音识别,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。最近在学习python,做一些python练习题github上几年前的练习题有一题是这样...
    99+
    2023-06-21
  • Java 离线中文语音文字识别功能的实现代码
    目录1、pom文件如下:2、工程结构:3、语音识别工具类4、前端交互5、前端页面6、运行效果项目需要,要实现类似小爱同学的语音控制功能,并且要离线,不能花公司一分钱。第一步就是需要把...
    99+
    2022-11-13
  • 怎么在微信小程序中利用同声传译实现语音识别功能
    这篇文章给大家介绍怎么在微信小程序中利用同声传译实现语音识别功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。// app.json{    ... &nbs...
    99+
    2023-06-15
  • C++怎么用winapi socket实现局域网语音通话功能
    本篇内容主要讲解“C++怎么用winapi socket实现局域网语音通话功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么用winapi socket实现局域网语...
    99+
    2023-07-02
  • 使用Swift怎么实现一个最小化语音通话功能
    本篇文章为大家展示了使用Swift怎么实现一个最小化语音通话功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。SuspendToolimport Foundationimport ...
    99+
    2023-06-06
  • Android应用中怎么实现一个通话录音功能
    这期内容当中小编将会给大家带来有关Android应用中怎么实现一个通话录音功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。服务代码:package com.eboy.phoneListener;impo...
    99+
    2023-05-31
    android roi
  • 怎么在Android中利用orc实现一个文字识别功能
    这篇文章给大家介绍怎么在Android中利用orc实现一个文字识别功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、什么是orcorc是指利用光学字符识别(ORC全称:Optical Character Recog...
    99+
    2023-05-31
    android orc roi
  • 怎么在C++中使用opencv实现一个车道线识别功能
    本篇文章为大家展示了怎么在C++中使用opencv实现一个车道线识别功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。(一)目前国内外广泛使用的车道线检测方法主要分为两大类:(1) 基于道路特征的车...
    99+
    2023-06-06
  • 怎么在Android应用中实现一个手势操作识别功能
    今天就跟大家聊聊有关怎么在Android应用中实现一个手势操作识别功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先,在Android系统中,每一次手势交互都会依照以下顺序执行。...
    99+
    2023-05-31
    android roi
  • 怎么在Android应用中实现一个语音消息发送功能
    本篇文章为大家展示了怎么在Android应用中实现一个语音消息发送功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。直接上代码://语音操作对象private MediaPlayer&nb...
    99+
    2023-05-30
    android roi
  • 在Android 开发中使用camera怎么实现一个人脸识别功能
    这篇文章将为大家详细讲解有关在Android 开发中使用camera怎么实现一个人脸识别功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Android camera实时预览 实时处理,面部...
    99+
    2023-05-31
    android camera
  • 怎么在java中利用反射实现获取和调用功能
    怎么在java中利用反射实现获取和调用功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Class类中获取方法:public Method[] getMetho...
    99+
    2023-05-30
    java
  • JAVA项目中怎么实现一个通用日志记录功能
    今天就跟大家聊聊有关JAVA项目中怎么实现一个通用日志记录功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。使用Aop记录操作日志添加Aoppublic class LogAopHa...
    99+
    2023-05-31
    java ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作