首页 > 编程语言 >java调用科大讯飞离线语音合成SDK --内附完整项目

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

时间:2024-05-31 14:58:12浏览次数:17  
标签:java String -- 音频 离线 header 0xff new byte

科大讯飞语音开放平台基础环境搭建
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 header
        header[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 ' chunk
        header[13] = 'm';
        header[14] = 't';
        header[15] = ' ';
        header[16] = 16; // 4 bytes: size of 'fmt ' chunk
        header[17] = 0;
        header[18] = 0;
        header[19] = 0;
        header[20] = 1; // format = 1
        header[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 align
        header[33] = (byte) ((b >> 8) & 0xff);

        header[34] = (byte) (weikuan & 0xff);//位宽
        header[35] = (byte) ((weikuan >> 8) & 0xff);

        header[36] = 'd';//data
        header[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,String,--,音频,离线,header,0xff,new,byte
From: https://blog.csdn.net/xuezhe5212/article/details/139350432

相关文章

  • Java基础之JVM
    一、Java中的内存管理1、程序,无论是代码还是数据,都需要存储在内存中。JVM为Java程序提供并管理所需要的内存空间2、JVM内存分为堆(heap)、栈(stock)、方法区(method)三个区域,分别用于储存不同的数据。3、HotSpot是SunJDK和OpenJDK中所带的虚拟机(SunJDK和OpenJDK除了注释,代码实现......
  • 521源码-游戏源码-2024卡牌回合自走棋手游《梦间集》推出全新Linux手工服务端
    首款稀有卡牌回合自走棋手游《梦间集》推出全新Linux手工服务端整理更多网站源码,游戏源码,学习教程,请点击......
  • 521源码-免费手游下载-【烽火中原H5】深度体验:横版网页国战手游及WIN学习手工端
    【烽火中原H5】深度体验:横版网页国战手游及WIN学习手工端全面解析,烽火中原H5】横板网页国战手游+WIN学习手工端+语音视频教程+营运后台+CDK授权后台,喜欢国战手游的玩家们,你们期待已久的【烽火中原H5】现已上线!这款游戏以横版网页的形式呈现,为玩家带来沉浸式的国战体验。同时......
  • 山东大学项目实训-基于LLM的中文法律文书生成系统(十六)- 指令微调(1)
    指令微调指令微调(InstructionTuning)是指使用自然语言形式的数据对预训练后的大语言模型进行参数微调。微调适用的场景通常来说,适合微调的场景主要分为行业场景和通用场景对于行业场景:例如客服助手,智能写作辅导等需要专门的回答范式和预期的场景例如智慧医生,智慧律师等需要......
  • 【Java代码调用华为云IoT MQTT】
    目录欢迎关注微信公众号:数据科学与艺术作者WX:superhe199下面是使用Java代码调用华为云IoTMQTT:importorg.eclipse.paho.client.mqttv3.*;importorg.eclipse.paho.client.mqttv3.persist.MemoryPersistence;publicclassHuaweiCloudMqttExample{publi......
  • 山东大学项目实训-基于LLM的中文法律文书生成系统(十七)- 微调-LoRA(2)
    LoRALORA是一种低资源微调大模型方法,出自论文LoRA:Low-RankAdaptationofLargeLanguageModels。使用LORA,训练参数仅为整体参数的万分之一、GPU显存使用量减少2/3且不会引入额外的推理耗时。自然语言处理的一个重要范式包括对一般领域数据的大规模预训练和对特定任务或领......
  • vue3 vite 脚手架生成项目 prettier 自动格式化失败 vscode插件 Vue - Official 解决
    vue3vite脚手架生成项目prettier自动格式化失败vscode插件Vue-Official解决方案问题以前写的都是vue2的项目,自动格式化都用的vetur,都设置好了。现在新弄了个vue3的项目,脚手架起的vitevue3,搞个代码格式化,发现prettier没好事。解决思路格式化一共俩工具eslintpret......
  • C# 检测并重启windows服务,IIS应用池
      usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Diagnostics;usingSystem.Linq;usingSystem.ServiceProcess;usingSystem.Text;usinglog4net;usingSystem.Timers;usingSystem.Configurati......
  • 关于本人
    关于我一条研究方向为图像处理、导师不放暑期实习的硕士牛马。人在上海,研二在读,9月研三,就业发愁。关于此博客日常科研任务繁重,摸鱼或者熬夜偷偷写点博客希望不被导师发现。目前博客内容主要和大模型相关,为迎合研究方向,多模态的内容会多一些,请见谅。最早还有几篇零零散散、烂尾......
  • 2.4G讲解(BasicMode)
    BASIC模式讲解下方代码实现基于basic模式下一端发送数据,另一端接收数据并返回数据的双向传输。RF_PHY.c工程替换即可使用,注意未定义的tmos任务自行定义#include"CONFIG.h"#include"RF_PHY.h"#defineRF_AUTO_MODE_EXAM0#definerxmode1uint8_ttaskID;uint8_t......