科大讯飞语音合成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\\2023-ai\\java\\flt-admin\\lib\\tts\\xiaoyan.jet;fo|D:\\code\\2023-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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/8949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker查看log

显示所有 log # 显示某个容器的所有log $ docker logs [OPTIONS] <CONTAINER># 显示 docker-compose 启动的所有容器的log $ docker-compose logs显示实时 log 效果和Linux的 tail-f filename 一样&#xff0c;可以把最新内容刷新显示到屏幕上。 $ docker logs -f <C…

leetcode 1870. Minimum Speed to Arrive on Time(准时到达的最小速度)

需要找一个speed, 使得dist[i] / speed 加起来的时间 < hour, 而且如果前一个dist[i] / speed求出来的是小数&#xff0c;必须等到下一个整数时间才计算下一个。 speed最大不会超过107. 不存在speed满足条件时返回-1. 思路&#xff1a; 如果前一个dist[i] / speed求出来的…

MySQL必知必会 第28章 安全管理

数据库服务器通常包含关键的数据&#xff0c;确保这些数据的安全和完整性要利用访问控制。 28.1 访问控制 用户不能对过多的数据具有过多的访问权。 访问控制&#xff1a;需要给用户提高他们所需的访问权&#xff0c;且仅提供他们所需的访问权。管理访问控制需要创建和管理用…

vue-element-template管理模板(二)

vue-element-admin框架 动态路由&#xff08;二&#xff09; 修改代码&#xff1a; import { asyncRoutes, constantRoutes } from "/router"; import { getMenu } from "/api/user"; import Layout from "/layout";/*** Use meta.role to det…

基于ssm+mysql高校就业管理系统设计与实现

基于ssmmysql高校就业管理系统设计与实现 中文摘要 本论文主要讲述了基于SSM框架及MySQL数据库实现的就业管理系统的设计和开发过程。本论文中所讲的就业管理系统是通过所学的知识创办一个非商业性的网站平台&#xff0c;使所有想要就业信息查看的高校毕业生们与想要宣传自己…

C++第三方开发库matplotlib-cpp

Matplotlib-cpp是一个用于在C中绘制图表的开源库。它提供了与Python的Matplotlib库类似的功能&#xff0c;使得在C环境下进行数据可视化变得更加便捷。基于Matplotlib-cpp&#xff0c;我们可以使用各种绘图函数和样式选项来创建各种类型的图表&#xff0c;包括折线图、散点图、…

elementui全局给select option添加title属性

场景 有天边上的同事问了我一个问题&#xff0c;示例如下&#xff0c;有个数据特别长&#xff0c;导致下拉部分被横向撑大。希望在全局对所有的option进行处理&#xff0c;按照select的宽度&#xff0c;超出隐藏。 处理 方式一 第一眼看过去直接修改源码好了&#xff0c;修…

腾讯校园招聘技术类编程题汇总

题解&#xff1a;并查集&#xff08;模板&#xff09; #include <iostream> #include<map> using namespace std; int father[2000006]; int rank1[1000005]; void init(int n){for(int i1;i<1e5;i){father[i]i;rank1[i]1;} } int find(int x){if(father[x]x){…

Spring Boot中使用GraphQL

1. 简介 GraphQL是Facebook的一个相对较新的概念&#xff0c;被称为Web API的REST的替代品。 在本文中&#xff0c;我们将学习如何使用 Spring Boot 设置 GraphQL 服务器&#xff0c;以便我们可以将其添加到现有应用程序中或在新应用程序中使用它。 2. 什么是GraphQL&#x…

Centos7 扩容(LVM 和非 LVM)

一、磁盘扩容方式 CentOS 系统的磁盘扩容可以分为两种方式&#xff1a;LVM 管理和非 LVM 管理。 LVM 管理的分区和传统分区方式是可以共存的。在同一个系统中&#xff0c;你可以同时使用 LVM 管理的分区和传统分区。 例如&#xff0c;在 CentOS 系统中&#xff0c;你可以选择将…

while循环

while循环是一种常见的循环结构&#xff0c;它会重复执行一段代码&#xff0c;直到指定的条件不再满足。 基本语法如下&#xff1a; while 条件: # 循环体代码 其中&#xff0c;条件是一个布尔表达式&#xff0c;如果为True&#xff0c;则执行循环体中的代码&#xff1b;如果…

剑指offer51.数组中的逆序对

用类似于归并排序的方法解决这道题&#xff0c;把数组分成左右两个数组&#xff0c;然后归并排序&#xff0c;在排序的过程中统计逆序对的个数 class Solution {int[] nums, tmp;public int reversePairs(int[] nums) {this.nums nums;tmp new int[nums.length];return merge…

LX04 小米触屏音箱刷机教程

说明 这里的电脑是 win11 系统&#xff0c;win10 有差别但是不影响&#xff0c;自己解决,但不要使用精简版,尽量避免使用 win7 请看完此教程再问其他问题 此教程仅供学习使用&#xff0c;安装第三方软件出现的任何问题&#xff0c;小米都不会给予售后赔偿处理&#xff01;…

Web3将自己写在合约中的代币添加到MetaMask中管理

上文 Web3带着大家根据ERC-20文档编写自己的第一个代币solidity智能合约 带着大家在智能合约中创建了一个自己的代币系统 我们可以在MetaMask中去导入 ganache环境下模拟出来的第一和第二个账号 我们这里 可以看到他们的 ETH 但看不到自己的代币符号 没关系 我们点击这下面的…

MySQL必知必会 第27章 全球化和本地化

本章介绍MySQL处理不同字符集和语言的基础知识。 27.1 字符集和校对顺序 字符集&#xff1a;字母和符号的集合编码&#xff1a;某个字符集成员的内部标识校对&#xff1a;规定字符如何比较的指令 校对很重要 使用何种字符集和校对的决定在服务器、数据库和表级进行。 27.2 …

剑指 Offer. 翻转单词顺序

输入一个英文句子&#xff0c;翻转句子中单词的顺序&#xff0c;但单词内字符的顺序不变。为简单起见&#xff0c;标点符号和普通字母一样处理。例如输入字符串"I am a student. "&#xff0c;则输出"student. a am I"。 示例 1&#xff1a; 输入: "…

[howto] 使用git时,如何忽略本地文件

背景 有一些项目&#xff0c;需要在配置中填写自己的key&#xff0c;但是那个文件还在git的版本管理中&#xff0c;如果自己填了key&#xff0c;很容易把自己的key给commit上去了。所以要么每次提交之前检查一下&#xff0c;不提交这个文件&#xff0c;要么干脆忽略&#xff0…

Python学习笔记-Django框架基础,APP,数据模型,后台管理,路由

一、Django框架简介 Django框架是Python的常用web框架&#xff0c;遵循 MVC 设计模式的框架&#xff0c;采用了MTV的框架模式&#xff0c;即模型M&#xff0c;视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的&#xff0c;即是CMS&…

新能源汽车的发展

目录 1.什么是新能源 2.什么是新能源汽车 3.新能源汽车的优点 4.新能源汽车的危害 5.新能源汽车未来的发展 1.什么是新能源 新能源是指与传统能源&#xff08;如化石燃料&#xff09;相比&#xff0c;更具可再生性、清洁性和低碳排放的能源形式。它主要通过利用自然资源和可…

rust学习-面向对象

面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09; 封装细节 main.rs use rust_demo::AveragedCollection;fn main() {let mut ac AveragedCollection::new();println!("ac{:?}", ac);ac.add(3);ac.add(5);ac.add(7);println!(&…