失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 科大讯飞语音合成Java springboot集成

科大讯飞语音合成Java springboot集成

时间:2024-04-16 01:07:05

相关推荐

科大讯飞语音合成Java springboot集成

科大讯飞语音合成 文本转语音

一、引入依赖:

<dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.5.0</version></dependency>

二、下载响应的sdk,我这里是下载的java win版本的sdk

SDK下载 - 科大讯飞api接口 - 讯飞开放平台

三、具体代码:

从下载的依赖里面找到对应文件,给代码里面替换成你的绝对路径,运行即可

备注:这个地方需要你自己的账号下载的才能使用,因为他官方做了sdk校验

package org.jeecg.modules.demo.fttextbook.service.impl;import com.sun.jna.Library;import com.sun.jna.Native;import com.sun.jna.Pointer;import com.sun.jna.ptr.IntByReference;import java.io.IOException;import java.io.RandomAccessFile;import java.util.Date;public class XunFeiSpeech {public static void main(String[] args) {String txt = getVoice("你好,你在干嘛?");System.out.println(txt);}public interface MscLibrary extends Library {//ddl文件具体位置 win版本 MscLibrary INSTANCE = Native.load("D:\\**\\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 String getVoice(String text) {String dir = "";//登录参数,appid与msc库绑定,请勿随意改动String login_params = "appid = 493d****, work_dir = .";//合成参数:tts_res_path我这里用了绝对路径String session_begin_params = "engine_type = local, voice_name = xiaoyan, text_encoding = UTF-8, tts_res_path = fo|D:\\code\\-ai\\java\\flt-admin\\lib\\tts\\xiaoyan.jet;fo|D:\\code\\-ai\\java\\flt-admin\\lib\\tts\\common.jet, sample_rate = 16000, speed = 50, volume = 50, pitch = 50, rdn = 2";//合成的语音文件名称Long time = new Date().getTime();//生成音频的本地地址String filename = "D:\\mp3\\voice\\tts_sample_"+ time +".wav";//合成文本String sessionId = null;RandomAccessFile raf = null;try {//登录int loginCode = MscLibrary.INSTANCE.MSPLogin(null, null, login_params);if (loginCode != 0) {//登录失败return filename;}//初始sessionIntByReference errCode = new IntByReference();sessionId = MscLibrary.INSTANCE.QTTSSessionBegin(session_begin_params, errCode);if (errCode.getValue() != 0) {//会话失败return filename;}//放入文本int textPutCode = MscLibrary.INSTANCE.QTTSTextPut(sessionId, text, text.getBytes().length, null);if (textPutCode != 0) {//放入文本失败return filename;}//写入空的头格式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 filename;}//定位到文件起始位置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();}}}return filename;}/*** @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;}}

如果觉得《科大讯飞语音合成Java springboot集成》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。