java调用科大讯飞离线语音合成SDK --内附完整项目

2024-06-01 12:04

本文主要是介绍java调用科大讯飞离线语音合成SDK --内附完整项目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

科大讯飞语音开放平台基础环境搭建
1.用户注册

注册科大讯飞开放平台账号

2.注册好后先创建一个自己的应用

 

创建完成后进入应用选择离线语音合成(普通版)可以看到我们开发需要的SDK,选择windows MSC点击下载。

3.选择你刚刚创建的应用,选择windows系统,选择离线语言合成(普通版)点击SDK下载。

导入pom依赖

<!--        科大讯飞依赖--><dependency><groupId>ws.schild</groupId><artifactId>jave-all-deps</artifactId><version>3.3.1</version></dependency><!--        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>

语言合成实现代码
我们主要使用到是XunFeiSpeech这个类。

  

1.替换几个参数,换成你下载的SDK的存储路径。

 

 

 换成你的appid

生成音频需要设置音频的header

/*** 合成音频的header*/
public class WaveHeader {/*** @param totalAudioLen 音频数据总大小* @param sampleRate    采样率* @param byteRate      位元(组)率(每秒的数据量 单位 字节/秒)   采样率(44100之类的) * 通道数(1,或者2)*每次采样得到的样本位数(16或者8) / 8;* @param nChannels     声道数量* @param weikuan       位宽*/public 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;}
}

附上格式转换工具类
因为合成的音频是wav的格式,如果需要mp3格式,需要在进行格式的转换。

转换工具类:

import ws.schild.jave.*;
import ws.schild.jave.encode.AudioAttributes;
import ws.schild.jave.encode.EncodingAttributes;
import java.io.File;/*** 音频工具类*/
public class AudioConversionUtils {/*** wav转mp3*/public static Boolean audioToMp3(String oldPath, String newFilePath) {AudioAttributes audio = new AudioAttributes();/** 它设置将用于音频流转码的编解码器的名称。您必须从当前Encoder实例的getAudioEncoders()方法返回的列表中选择一个值。否则,* 您可以传递AudioAttributes.DIRECT_STREAM_COPY特殊值,该值需要源文件中原始音频流的副本。*/audio.setCodec("libmp3lame");/** 它设置新重新编码的音频流的比特率值。如果未设置比特率值,编码器将选择默认值。该值应以每秒位数表示。例如,如果你想要128 kb /* s比特率,你应该调用setBitRate(new Integer(128000))。*/audio.setBitRate(128000);/* 它设置将在重新编码的音频流中使用的音频通道的数量(1 =单声道,2 =立体声)。如果未设置通道值,编码器将选择默认值。 */audio.setChannels(1);/** 它设置新重新编码的音频流的采样率。如果未设置采样率值,编码器将选择默认值。该值应以赫兹表示。例如,如果您想要类似CD的44100* Hz采样率,则应调用setSamplingRate(new Integer(44100))。*/audio.setSamplingRate(44100);/* 可以调用此方法来改变音频流的音量。值256表示没有音量变化。因此,小于256的值是音量减小,而大于256的值将增加音频流的音量。 */audio.setVolume(256);// Encoding attributes/编码属性EncodingAttributes attrs = new EncodingAttributes();/** 它设置将用于新编码文件的流容器的格式。给定参数表示格式名称。* 编码格式名称有效且仅在它出现在正在使用的Encoder实例的getSupportedEncodingFormats()方法返回的列表中时才受支持。*/attrs.setOutputFormat("mp3");/* 它设置音频编码属性。如果从未调用过新的EncodingAttributes实例,或者给定参数为null,则编码文件中不会包含任何音频流 */attrs.setAudioAttributes(audio);/** 它为转码操作设置偏移量。源文件将从其开始的偏移秒开始重新编码。例如,如果您想剪切源文件的前五秒,* 则应在传递给编码器的EncodingAttributes对象上调用setOffset(5)。*/// attrs.setOffset(5F);/** 它设置转码操作的持续时间。只有源的持续时间秒才会在目标文件中重新编码。例如,如果您想从源中提取和转码30秒的一部分,* 则应在传递给编码器的EncodingAttributes对象上调用setDuration(30)*/// attrs.setDuration(30F);// Encode/编码Encoder encoder = new Encoder();try {encoder.encode(new MultimediaObject(new File(oldPath)), new File(newFilePath), attrs);return true;} catch (EncoderException e) {e.printStackTrace();}return false;}public static void main(String[] args) {Boolean result = audioToMp3("D:\\ceshiyinyue\\2024-05-31-11-40-16.wav", "D:\\ceshiyinyue\\2024-05-31-11-40-16.mp3");if (result){System.out.println("wav转mp3成功!");}}}

测试类的代码如下:

public static void main(String[] args) {String text = "标题:赤子之心,爱国之魂。在这片古老而又年轻的土地上,每一缕风都承载着历史的厚重,每一片叶都记录着时代的变迁。中国,这个拥有五千年灿烂文明的国家,正以前所未有的速度和活力,向着未来阔步前行。作为这个时代的见证者和参与者,我们每个人的心中都怀揣着对祖国的深厚感情——那是一份赤子之心,一颗爱国之魂。";String filename = XunFeiSpeech.wordSpeech(text, "D:/ceshiyinyue/");//调用科大讯飞离线SDK后生成的语言文件名称System.out.println("生成的文件名称:" + filename);}

接口测试类代码如下:

/*** 语言合成接口*/
@RestController
@RequestMapping("/test")
public class speechController {/**** @param text 需要合成语言的文本* @param path 合成语言的存储路径* @return 返回合成的音频文件名称*/@RequestMapping("/start")public String audioConversion(@RequestParam("text") String text,@RequestParam("path") String path){String fileName = XunFeiSpeech.wordSpeech(text, path);return fileName;}
}

    完整代码已经上传到CSDN,0积分下载,有需要的朋友自行下载。

   Java调用科大讯飞离线语音合成SDK --完整代码

    感谢大家的阅读,觉得有所帮助的朋友点点关注点点赞!

这篇关于java调用科大讯飞离线语音合成SDK --内附完整项目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020953

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多