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. apply call bind 简介
  2. 使用Windows远程登录Ubuntu
  3. PHPCMS V9数据库表结构分析
  4. 马斯克很着急:加速打造“月球电梯”,他要从NASA手中抢到这一单
  5. 上传漏洞新姿势(限Linux)
  6. JAVA——Windows双击jar包为可执行操作
  7. 为什么脚本执行一行就不动了_Centos7 批量创建用户账号脚本
  8. 使用撤回流RetractStream的场景
  9. java跨库调用存储_java-调用spring数据其余存储库方法不会返回...
  10. android获取spinner的值_在Android的Spinner中实现键值对的正确方法是什么
  11. ERP咨询顾问是怎么炼成的?
  12. 把系统时间改到以前后,MyEclipse9.1的工程里的JS文件修改完保存但MyEclipse不会将其不会更新。...
  13. 借助Sigar API获取磁盘信息
  14. unity使用VideoPlayer播放视频
  15. 操作系统 信号量机制
  16. 【现代密码学】大作业-RSA大礼包
  17. 圆的半径java_计算圆的半径
  18. 直播带货app源码,实现直播的秒开和优化
  19. 美国高考能不能带计算机,这件“神器”在美国被高中允许却被美国大学禁止
  20. 2022年ABC123公众号年刊下载(PDF电子书)

热门文章

  1. MulterError: Unexpected field
  2. x265码率控制-VBV更新过程
  3. 关于网络促销活动对大学生购物的影响的调研报告
  4. 计算机名、有线网卡mac地址、无线网卡mac地址
  5. 解决allegro 中OUT OF DATE SHAPES问题
  6. 第十二章:如何制定里程碑
  7. html自由变换图形,ps自由变换的快捷键是什么?
  8. 在c语言中的变量分为三种类型,在C语言中的实型变量分为两种类型,它们是_______和__________ 答案:float double...
  9. 从 SEC EDGAR 获取股东治理数据 (Shareholder Activism)
  10. 搜狐新闻表情出现怪异现象