说明:写本文时还没有提供java平台的,现在官方有java平台的sdk了,可以直接使用。本文已经没有太多实际意义了。
语音识别技术
语音识别就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令。语音识别技术主要包括特征提取技术、模式匹配准则及模型训练技术三个方面。说实话其中的技术比较多,要独立开发新的基本上不现实。所以自然把目光放到开源项目或者其他公司的API上面了。开源项目我尝试了SpeakRight和sphinx4,但是效果都是一般。AT&T的API老是申请不上,最后把目光放在科大讯飞上了。试用了一下,效果还行,但是它提供的Windows平台的API是C/C++的,我只懂点皮毛,所以稍微研究了一下通过Java调用它的语音云SDK。
JNA
java调用.dll获取.so一般通过JNI,但是JNI的使用比较复杂,需要用C另写一个共享库进行适配。而JNA是一个自动适配工具,通过它调用.dll只需要一个借口即可。
官网:https://github.com/twall/jna/
下载jna.jar即可。
编写接口
科大讯飞语音云主要提供语音合成和语音识别两个方面的东西,我主要使用语音识别这块的功能。
建立接口QTSR,继承Library。
将msc.dll等文件复制到项目根目录。
加载msc.dll
然后来看一下msc.dll公开了哪些方法。首先是QISRInit,这是一个全局初始化函数。
它的返回值为int,参数是const char。int还是java的int,但是char就对应的是java的String了。
所以在QTSR中添加方法:
返回值在msp_errors.h中定义,等一下我们还是要弄在java里面去。
继续看QISRInit函数,在官方文档中有调用示例:
对应的在java中的调用代码如下:
我们在看一个函数:QISRSessionBegin,这个开始一路ISR会话。
还是刚才的思路,char对应java的String,但是注意一下int errorCode。这个函数其实传入两个参数,传出两个参数。即本身返回的sessionId,还有errorCode。
这里的int*对应的是jna的IntByReference。所以添加方法:
同样看看官方示例:
在java这样写:
运行效果:
其他的函数处理方式大致相同,这里贴上一个c和java在jna中的类型对应表:
Native Type |
Java Type |
char |
byte |
short |
short |
wchar_t |
char |
int |
int |
int |
boolean |
long |
NativeLong |
long long |
long |
float |
float |
double |
double |
char |
String |
void |
Pointer |
其中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中进行定义。
使用很简单的,比如MSP_SUCCESS 就是Msp_errors.MSP_SUCCESS。
完整代码和文件
这个只是语音识别部分的,语音合成的话我记得有人做过jni接口的。
*QTSR.java
*Msp_errors
嫌复制粘贴麻烦的可以点击下面的链接下载:
Msp_errors.java: http://www.t00y.com/file/8170772
QTSR.java: http://www.t00y.com/file/8170775
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2012/07/05/jna_yuyinshibie/
publicintQISRAudioWrite(String sessionID, Pointer waveData,int waveLen,
int audioStatus, IntByReference epStatus, IntByReference recogStatus); 这个方法的waveData该怎么传呢?
讯飞提供官方java sdk了。用本文的方法意义不大。
讯飞官方的java SDK只支持在线的,离线的还是要导入.dll,请问本文的源码能发一份给我吗?[email protected]
现在急需做离线的功能,感谢!
本文是6年前的,之前的源码已经找不到了,就算找到了也已经不适用了。