JNI调用科大讯飞离线语音合成(Windows篇)

背景:
本文旨在介绍如何使用 JNI调用科大讯飞离线语音合成;如果你注册过科大讯飞开发者平台,你就会发现,科大讯飞并没有提供 java 的库,下载 windows 和 Linux版本都是C调用例子;直接使用 JNI调用咯,网上查阅一遍,基本上都是 JNA 调用科大讯飞的例子;无奈,自己写呗;我使用 IntelliJ IDEA 编译器,使用 eclipse 需要自己百度一下配置。
感谢:
感谢以下这位博友的文章:
链接:http://blog.csdn.net/huachao1001/article/details/53906237

IntelliJ IDEA平台下JNI编程(一)—HelloWorld篇
【huachao1001的专栏:http://blog.csdn.net/huachao1001/article/details/53906237】

  1. 开始编码
    1.1 开始编写Java文件
public class KeDaXunFei {static {System.loadLibrary("msc_x64");System.loadLibrary("KeDaXunFei");}public native void text2Speech(String textContent, String fileName);public native void text2Speech(String textContent, String fileName, String params);public static void main(String[] args) {KeDaXunFei keDaXunFei = new KeDaXunFei();String textContent = "君不见,黄河之水天上来,奔流到海不复回“;String params = "engine_type = local, voice_name = xiaoyan, text_encoding = UTF8, tts_res_path = fo|D:\\java\\kedaxunfei\\msc\\res\\tts\\xiaoyan.jet;fo|D:\\java\\kedaxunfei\\msc\\res\\tts\\common.jet, sample_rate = 16000, speed = 50, volume = 50, pitch = 50, rdn = 2";keDaXunFei.text2Speech(textContent, "abcd.wav");}
}

注意:
①这里的 msc_x64.dll 必须加载,KeDaXunFei是我最后通过 .c 生成的 dll 文件
②在 params 中关于xiaoyan.jet、common.jet资源文件,可以使用绝对路径,也可以使用相对路径;如果相对路径不正确,加载不到语音资源,出现如下错误信息并且合成语音文件文件损坏,无法播放:
QTTSAudioGet failed, error code: 10102.
text_to_speech failed, error code: 10102.
并自动项目中新建一个 msc 文件夹(包含错误日志信息),这个文件夹就是用于放置xiaoyan.jet、common.jet资源文件,将你下载文件中的 /bin/msc/目录下内容,拷贝到 msc 中。

1.2 生成C语音的 KeDaXunFei.h 头文件,参考

IntelliJ IDEA平台下JNI编程(一)—HelloWorld篇
【huachao1001的专栏:http://blog.csdn.net/huachao1001/article/details/53906237】

1.3 编写 .c 文件,主要参考科大讯飞官方示例编写

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>#include "KeDaXunFei.h"
#include "qtts.h"
#include "msp_cmn.h"
#include "msp_errors.h"char* jstringToChar(JNIEnv* env, jstring jstr) {char*   rtn = NULL;jclass   clsstring = (*env)->FindClass(env, "java/lang/String");jstring   strencode = (*env)->NewStringUTF(env, "UTF-8");jmethodID   mid = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String;)[B");jbyteArray   barr = (jbyteArray)(*env)->CallObjectMethod(env, jstr, mid, strencode);jsize   alen = (*env)->GetArrayLength(env, barr);jbyte*   ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);if (alen > 0){rtn = (char*)malloc(alen + 1);         //new   char[alen+1];memcpy(rtn, ba, alen);rtn[alen] = 0;}(*env)->ReleaseByteArrayElements(env, barr, ba, 0);return rtn;
}typedef struct _wave_pcm_hdr {
与科大讯飞中例子相同,这里就不再赘述
} wave_pcm_hdr;/* 默认wav音频头部数据 */
wave_pcm_hdr default_wav_hdr =
{与科大讯飞中例子相同,这里就不再赘述
};
/* 文本合成 */
int text_to_speech(const char* src_text, const char* des_path, const char* params)
{与科大讯飞中例子相同,这里就不再赘述
}/*
Java_KeDaXunFei_text2Speech__Ljava_lang_String_2Ljava_lang_String_2 与 KeDaXunFei.h 头文件中生成对于java中方法名相同 */
JNIEXPORT void JNICALL Java_KeDaXunFei_text2Speech__Ljava_lang_String_2Ljava_lang_String_2(JNIEnv *env, jobject job, jstring textContent, jstring jfileName) {char* src_text = jstringToChar(env, textContent);char* fileName = jstringToChar(env, jfileName);const char* params = "engine_type = local, voice_name = xiaoyan, text_encoding = UTF8, tts_res_path = fo|res\\tts\\xiaoyan.jet;fo|res\\tts\\common.jet, sample_rate = 16000, speed = 50, volume = 50, pitch = 50, rdn = 2";int         ret                  = MSP_SUCCESS;const char* login_params         = "***(填写你自己申请的)";//登录参数,appid与msc库绑定,请勿随意改动ret = MSPLogin(NULL, NULL, login_params);// 登录验证if (MSP_SUCCESS != ret){printf("MSPLogin failed, error code: %d.\n", ret);goto exit ;}/* 文本合成 */ printf("开始合成 ...\n");ret = text_to_speech(src_text, fileName, params);if (MSP_SUCCESS != ret){printf("text_to_speech failed, error code: %d.\n", ret);}printf("合成完毕\n");exit:MSPLogout(); //退出登录return ;
}

注意:如果大家在通过 *.o文件转成 *.dll文件时发生错误,可以尝试在idea中配置如下命令:

在idea中配置External Tools Program: D:\software\mingw\MinGw\MinGw\bin\gcc.exe Parameters: -shared -o ./lib/$FileNameWithoutAllExtensions$.dll ./jni/$FileNameWithoutAllExtensions$.c -I "$JDKPath$\include" -I "$JDKPath$\include\win32" -I "./jni" ./lib/msc_x64.dll Working directory: $ProjectFileDir$

注意:
关于 jstringToChar 转换函数,在 .c 文件 和 .cpp 文件中内容有区别,十分重要

后续有时间再写Linux中使用部分

欢迎大家留言技术交流

参考资料

http://blog.csdn.net/huachao1001/article/details/53906237

JAVA JNI调用科大讯飞离线语音合成Windows相关推荐

  1. JAVA JNI调用科大讯飞离线语音合成(Linux篇)

    JNI调用科大讯飞离线语音合成(Linux篇) 背景:之前已经介绍过JNI调用科大讯飞离线语音合成(Windows篇),今天我们接着聊一聊在Linux系统中如何使用科大讯飞离线语音合成,我们这里以(u ...

  2. 使用python语言调用科大讯飞离线语音合成

    科大讯飞属于第三方服务,但是支持的语言里面没有python,所以我们在这种情况下还想使用它的功能的话,可以通过调用C语言的包,来间接的使用. 代码贴上来: def text_to_voice(text ...

  3. C#调用科大讯飞离线语音合成TTS

    原作者勿怪,未经允许就转载了,感谢万分. http://www.cnblogs.com/xuguanghui/p/4505555.html ------------------------------ ...

  4. php调用科大讯飞离线语音合成linux sdk

    背景 要使用tts功能,文字转语言文件.目前已采用百度在线web api接口实现了联网版,现需要现实离线版.故采用科大讯飞的离线语音合成sdk,但是对于linux的sdk官方只有c语言的api接口,现 ...

  5. 接口调用-【4】讯飞离线语音合成Windows/Linux

    1.离线语音合成调用主函数(离线语音合成调用属于简单的,无回调函数) package com.iflytek; import com.iflytek.util.Step2_tts_thread; im ...

  6. ROS-语音控制-会说话的机器人(3)-科大讯飞离线语音合成+图灵机器人

    ROS-语音控制-会说话的机器人(3)-科大讯飞离线语音合成+图灵机器人 参考网址: https://blog.csdn.net/CHENKAIFAN__/article/details/806193 ...

  7. Java JNI调用IC卡读卡器

    Java JNI调用IC卡读卡器 Java调用IC卡读卡器的DLL一般有以下2种方式: 1.使用JNative第三方库调用IC卡读卡器dll的接口. 2.使用JNI调用IC卡读卡器dll的接口. JN ...

  8. 科大讯飞离线语音合成简单实例

    讯飞语音开发集成地址http://www.xfyun.cn/ 如何使用科大讯飞开放平台的语音合成呢? 1.首先要注册开发者账户, 创建我的新应用,创建完后就有一个专属APPID(非常重要),添加我的应 ...

  9. java jni调用dll文件_Java通过jni调用动态链接库

    (1)JNI简介 JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++).从Java1.1开始,JNI标准成为java ...

  10. tts java web_SpringMVC调用讯飞语音合成WebApi示例

    最近讯飞开放了语音合成的WebAPI,相对于之前SDK的方式方便了很多,下面使用SpringMVC写了一个示例,调用讯飞的合成API. XFHelper.java 负责调用讯飞WebAPI接口,处理H ...

最新文章

  1. Onenote 2010 多PC端笔记同步
  2. 使用GAN进行异常检测——可以进行网络流量的自学习哇,哥哥,人家是半监督,无监督的话,还是要VAE,SAE。...
  3. 小李飞刀:刷题第四弹!
  4. java中定时器的使用
  5. 【C语言进阶深度学习记录】八 C语言中void的分析
  6. h710阵列卡支持最大硬盘_DELL服务器RAID磁盘阵列在线扩容(以H710P阵列卡为例)
  7. typescript parseint不能传number_Typescript 使用日志
  8. Microsoft Visual Studio 语言切换
  9. arduino串口绘图_Arduino 串口数据可视化
  10. WCF学习记录【一】
  11. php公众号模板在哪,微信公众号页面模板在哪里设置的?微信公众号页面模板怎么设置?...
  12. 互联网相亲,是怎么收割单身男女的?
  13. Spire pdf 操作pdf,页眉 页脚 水印 二维码
  14. JS pos机- V0.2
  15. uTorrent 高级设置方法
  16. 零伽壹产业研究:新商业奇观元宇宙,多种技术的集大成者
  17. TensorFlow Mobilenet SSD模型压缩并移植安卓上以达到实时检测效果
  18. Windows远程桌面出现CredSSP加密数据修正问题解决方案
  19. 明伟LRS-350-24方案,送BOM表,原理图、PCB
  20. YouTube-8M 数据集介绍与使用总结

热门文章

  1. oracle 整理表 碎片,Oracle数据库表空间碎片的查询和整理方法
  2. 快速排序(快排) (C语言实现)
  3. 无参考图像质量评价——漏勺模型
  4. c语言常用逻辑符号,C语言常用逻辑符号.doc
  5. 逻辑谬误_大规模分布式计算的谬误
  6. CSS 3之网页背景颜色
  7. AiTrust下预训练和小样本学习在中文医疗信息处理挑战榜CBLUE表现
  8. 档案管理系统项目总结
  9. Android防止启动页面闪白问题
  10. 1MB是多少字节 ?是多少位?