由于公司接到的项目环境不允许联网,这边通过不停的探索,终于找到通过JNA的方式接入,废话不多说,下面展示!

1、讯飞开放平台SDK下载

2、JNA包依赖引入

<!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>5.5.0</version>

</dependency>

3、 JAVA代码(将此代码直接贴上去)

注:需要修改appid = 577xxxxx中的参数,改成你自己的appid(因为讯飞平台会识别你下载的sdk和你的appid是否一致)

public class XunFeiSpeech {public interface MscLibrary extends Library {// DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径MscLibrary INSTANCE = Native.load("lib\\msc_x64.dll", MscLibrary.class);int MSPLogin(String username, String password, String param);int MSPLogout();String QTTSSessionBegin(String params, IntByReference errorCode);int QTTSTextPut(String sessionID, String textString, int textLen, String params);Pointer QTTSAudioGet(String sessionID, IntByReference audioLen, IntByReference synthStatus, IntByReference errorCode);int QTTSSessionEnd(String sessionID, String hints);}public static void main(String[] args) {//登录参数,appid与msc库绑定,请勿随意改动String login_params = "appid = 577xxxxx, work_dir = .";//合成参数:tts_res_path我这里用了绝对路径String session_begin_params = "engine_type = local, voice_name = xiaoyan, text_encoding = UTF-8, tts_res_path = fo|C:\\Users\\96248\\Desktop\\demo\\XunFeiSpeech\\lib\\xiaoyan.jet;fo|C:\\Users\\96248\\Desktop\\demo\\XunFeiSpeech\\lib\\common.jet, sample_rate = 16000, speed = 50, volume = 50, pitch = 50, rdn = 2";//合成的语音文件名称String filename = "tts_sample.wav"; //合成文本String text = "《出师表》是三国时期蜀汉丞相诸葛亮在决定北上伐魏、克复中原 [2]  之前给后主刘禅上书的表文。 [1]  [3]  [20]  这篇表文以议论为主,兼用记叙和抒情。全文以恳切委婉的言辞劝勉后主要广开言路、严明赏罚、亲贤远佞,以此兴复汉室 还于旧都(洛阳) [2]  [4]  ;同时也表达自己以身许国,忠贞不二的思想。文章既不借助于华丽的辞藻,又不引用古老的典故,多以四字句行文。 [5]";String sessionId = null;RandomAccessFile raf = null;try {//登录int loginCode = MscLibrary.INSTANCE.MSPLogin(null, null, login_params);if (loginCode != 0) {//登录失败return;}//初始sessionIntByReference errCode = new IntByReference();sessionId = MscLibrary.INSTANCE.QTTSSessionBegin(session_begin_params, errCode);if (errCode.getValue() != 0) {//会话失败return;}//放入文本int textPutCode = MscLibrary.INSTANCE.QTTSTextPut(sessionId, text, text.getBytes().length, null);if (textPutCode != 0) {//放入文本失败return;}//写入空的头格式raf = new RandomAccessFile(filename, "rw");raf.write(new byte[44]);int dataSize = 0;IntByReference audioLen = new IntByReference();IntByReference synthStatus = new IntByReference();while (true) {Pointer pointer = MscLibrary.INSTANCE.QTTSAudioGet(sessionId, audioLen, synthStatus, errCode);if (pointer != null && audioLen.getValue() > 0) {//写入合成内容raf.write(pointer.getByteArray(0, audioLen.getValue()));//记录数据长度dataSize += audioLen.getValue();}//转换异常或转换结束跳出循环if (errCode.getValue() != 0 || synthStatus.getValue() == 2) {break;}}if (textPutCode != 0) {//获取转换数据失败return;}//定位到文件起始位置raf.seek(0);//写入真实头格式raf.write(getWavHeader(dataSize, 16000, 32000, 1, 16));} catch (Exception e) {e.printStackTrace();} finally {if (sessionId != null) {MscLibrary.INSTANCE.QTTSSessionEnd(sessionId, "Normal");}MscLibrary.INSTANCE.MSPLogout();if (raf != null) {try {raf.close();} catch (IOException e) {e.printStackTrace();}}}}/*** @param totalAudioLen 音频数据总大小* @param sampleRate    采样率* @param byteRate      位元(组)率(每秒的数据量 单位 字节/秒)   采样率(44100之类的) * 通道数(1,或者2)*每次采样得到的样本位数(16或者8) / 8;* @param nChannels     声道数量* @param weikuan       位宽*/private static byte[] getWavHeader(int totalAudioLen, int sampleRate, int byteRate, int nChannels, int weikuan) {long totalDataLen = totalAudioLen + 36;byte[] header = new byte[44];header[0] = 'R'; // RIFF/WAVE headerheader[1] = 'I';header[2] = 'F';header[3] = 'F';header[4] = (byte) (totalDataLen & 0xff);header[5] = (byte) ((totalDataLen >> 8) & 0xff);header[6] = (byte) ((totalDataLen >> 16) & 0xff);header[7] = (byte) ((totalDataLen >> 24) & 0xff);header[8] = 'W';header[9] = 'A';header[10] = 'V';header[11] = 'E';header[12] = 'f'; // 'fmt ' chunkheader[13] = 'm';header[14] = 't';header[15] = ' ';header[16] = 16; // 4 bytes: size of 'fmt ' chunkheader[17] = 0;header[18] = 0;header[19] = 0;header[20] = 1; // format = 1header[21] = 0;header[22] = (byte) (nChannels & 0xff);header[23] = (byte) ((nChannels >> 8) & 0xff);header[24] = (byte) (sampleRate & 0xff);//采样率header[25] = (byte) ((sampleRate >> 8) & 0xff);header[26] = (byte) ((sampleRate >> 16) & 0xff);header[27] = (byte) ((sampleRate >> 24) & 0xff);header[28] = (byte) (byteRate & 0xff);//取八位header[29] = (byte) ((byteRate >> 8) & 0xff);header[30] = (byte) ((byteRate >> 16) & 0xff);header[31] = (byte) ((byteRate >> 24) & 0xff);int b = weikuan * nChannels / 8;//每次采样的大小header[32] = (byte) (b & 0xff); // block alignheader[33] = (byte) ((b >> 8) & 0xff);header[34] = (byte) (weikuan & 0xff);//位宽header[35] = (byte) ((weikuan >> 8) & 0xff);header[36] = 'd';//dataheader[37] = 'a';header[38] = 't';header[39] = 'a';header[40] = (byte) (totalAudioLen & 0xff);header[41] = (byte) ((totalAudioLen >> 8) & 0xff);header[42] = (byte) ((totalAudioLen >> 16) & 0xff);header[43] = (byte) ((totalAudioLen >> 24) & 0xff);return header;}
}

4、将在刚刚下载的SDK中的包拉到项目上

注:xiaofeng.jet、xiaoyan.jet、common.jet 在这个路径下\bin\msc\res\tts;

注:msc_x64.dll在这个路径下:\bin

5、运行main方法,可以看到主目录下对应的文件(tts_sample.wav),直接打开文件播放即可

本人小白,如有错误,请各位大佬指正哈~

JAVA接入讯飞离线合成语音相关推荐

  1. Unity 接讯飞离线语音识别

    Unity 接入讯飞离线SDK , 有一些坑记录一下. 在开发者平台注册之后,申请应用,下载SDK包.这个sdk包和你的appid是对应的,不能使用别人的sdk包,然后用自己的appid 这是SDK文 ...

  2. 讯飞离线语音合成接入

    讯飞离线语音合成接入: 文字转语音的方法 1.Google TextToSpeech + 中文语音引擎 Google提供了原生的方法TextToSpeech,但是不支持中文,sad- 不过可以用第三方 ...

  3. Android 讯飞离线语音听写/离线语音识别SDK

    平台 Android + 讯飞离线语音SDK SDK包 下载路径及方法见讯飞官方SDK文档: 离线语音听写 Android SDK 文档 # 在开发者控制台, 可以直接下载SDK. SDK包中的文件结 ...

  4. 讯飞离线语音命令词识别

    讯飞离线语音命令词识别 强烈推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来! 网址:http://www.captainbed.net/yancyang ...

  5. 【Qbot】6.讯飞文字转语音Api使用/VITS派蒙复读机实现

    该项目计划长期进行维护更新,欢迎star:https://github.com/zstar1003/Qbot 前言 看完流浪地球2之后,萌生了一个想法:我想给机器人完整的一生.作为一个完整的机器人,声 ...

  6. 讯飞小车比赛语音控制(基础)

    讯飞小车比赛语音控制 第一次写这玩意可能写的不咋地,主要也是看了一些网上的资料后面给了连接,千万不要骂人,不行我删掉.谢谢 1.硬件层面 本次比赛所使用的麦克风为ucar小车自带的环形六麦克风阵列,该 ...

  7. 长话无需短说 讯飞输入法超长语音输入不限时

    原标题:长话无需短说 讯飞输入法超长语音输入不限时 对用户来说,衡量语音输入好坏无外乎两个指标,一个是输入准确率,另一个是识别速度.搭载自然语言理解(NLU)优化模型的讯飞输入法语音识别率提升至98% ...

  8. 讯飞语音识别之语音转文字------java

    最近项目要用到语音识别的功能,网上找别人写的都不行,二话不说直接去讯飞官网注册下载了一个sdk,但是个人觉得sdk中并不是很明确的能运行实现功能,于是自己参考下载的sdk中的代码做了一个改动和封装.添 ...

  9. java 集成讯飞语音 pc_【报Bug】sdk集成 讯飞语音输入jar包报错

    sdk集成 讯飞语音输入jar包报错 Caused by: org.gradle.api.internal.artifacts.transform.TransformException: Execut ...

最新文章

  1. oracle跑with语句很慢,oracle 11g新特性---WITH语句增强
  2. 关于fastlane自动化打包
  3. [转]详解编译预处理
  4. 增强我们的Visual Studio(更新中)
  5. Qt 检测第三方软件是否运行、杀死第三方进程
  6. 名品折扣,谁与争锋!
  7. How is call from CXF delegated to our application code?
  8. MongoDB,凉凉?
  9. PyQt特殊对话框介绍
  10. Enterprise Solution 进销存管理软件 C/S架构,支持64位系统 物流,资金流,信息流全面集成...
  11. MVC4发布到IIS,出现HTTP 错误 404.0 - Not Found的解决方法
  12. 安卓TV版二开对接苹果cms后台,原生Java前端
  13. OpenG的特点及功能
  14. 配置销售开票时结转销售成本
  15. 花了一年时间开发的三维弯管机交互式转档软件(三维管子模型UG,SOLIDWORK,PRO/E文件转成YBC)...
  16. MYSQL(mysqld --initialize --console初始化的时候报错:Can‘t create directory ‘C:\web\mysql-8.0.11\data\‘)
  17. html中div的覆盖,CSS中如何使div覆盖另一个div的实例
  18. mysql 加序号以及成绩单排名的几种实现方式
  19. java web 统计在线用户_Javaweb监听器实例之统计在线人数
  20. Boost程序库完全开发指南——深入C++“准”标准库(第3版)

热门文章

  1. unity百度AI人体分析
  2. VVIC item_search - 根据关键词取商品列表API
  3. linux系统下制作启动u盘,制作Linux系统启动盘的四种简便方法
  4. python情人节之玫瑰花与表白方式
  5. 用手机GPRS使电脑上网
  6. 爬取东方财富网站股票信息每天运行都是同步网站更新的
  7. 《冰与火之歌》七王国的骑士
  8. 国外最大的购物搜索/比较购物网站
  9. 【解决方案】血压计方案原理和产品参数
  10. Extract Method(提炼函数)