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

这篇具有很好参考价值的文章主要介绍了科大讯飞语音合成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校验文章来源地址https://www.toymoban.com/news/detail-606182.html

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;
            }

            //初始session
            IntByReference 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 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;
    }
}

到了这里,关于科大讯飞语音合成Java springboot集成的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • ROS高效进阶第五章 -- 机器人语音交互之ros集成科大讯飞中文语音库,实现语音控制机器人小车

    ROS高效进阶第五章 -- 机器人语音交互之ros集成科大讯飞中文语音库,实现语音控制机器人小车

    从本文开始,我们将用两篇文章学习机器人语音交互。本文作为第一篇,将在ros上集成科大讯飞的中文语音库,实现语音控制机器人小车运动。至于语音识别和语音合成的原理,本文并不深究,读者可以自行搜索相关的文章介绍。这里提醒,本文的测试环境是ubuntu20.04 + ros

    2024年02月04日
    浏览(22)
  • vue3+vite+ts项目集成科大讯飞语音识别(项目搭建过程以及踩坑记录)

    🐱 个人主页: 不叫猫先生 🙋‍♂️ 作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏:vue3从入门到精通、TypeScript从入门到实践 📢 资料领取:前端进阶资料以及文中源码可以找我免费领取 🔥 前端

    2023年04月09日
    浏览(17)
  • 【人工智能】科大讯飞语音识别应用开发(第三集)

    【人工智能】科大讯飞语音识别应用开发(第三集)

    这次需要对科大讯飞语音识别接口进行语音识别应用开发,前两次都是通过WebAPI调用接口,这次换一下,通过SDK调用接口 下面是开发的详细记录过程(基于前两次的基础上) 网址:https://www.xfyun.cn/services/voicedictation 不领服务量为500且该包免费( 貌似是不同应用都可以免费领

    2024年02月13日
    浏览(11)
  • 科大讯飞 新版AIkit 离线语音听写 Java 版本

    科大讯飞 新版AIkit 离线语音听写 Java 版本

    前言:科大讯飞的新版离线语音听写,由于官网demo是kt语言开发的,咱也看不懂kt,搜遍了全网也没看到一个java版的新版离线语音demo,现记录下,留给有缘人参考!!!!!毕竟咱在这上面遇到了不少的坑。如果能留言指正,那就更好了。 实测一点问题都没 一、先把官网

    2024年02月22日
    浏览(12)
  • 讯飞离线语音合成新版(Aikit)-android sdk合成 demo(Java版本)

    前言:科大讯飞的新版离线语音合成,由于官网demo是kt语言开发的,咱也看不懂kt,搜遍了全网也没看到一个java版的新版离线语音demo,现记录下,留给有缘人参考!!!!!毕竟咱在这上面遇到了不少的坑。如果能留言指正,那就更好了。 ​官网注册账号---》实名认证---》

    2024年02月11日
    浏览(10)
  • Java中实现在线语音识别(科大讯飞免费的SKD)、SDK下载和IDEA项目搭建、成功运行【完整代码】

    Java中实现在线语音识别(科大讯飞免费的SKD)、SDK下载和IDEA项目搭建、成功运行【完整代码】

    科大讯飞官网:https://www.xfyun.cn/ 首先登陆讯飞开放平台:https://passport.xfyun.cn/login,微信扫码关注登录 注册新账号 登陆后界面后,进入产品服务–实时语音转写栏目 点击个人免费套餐,下面的立即领取,它会提醒我们去实名认证 实名认证一下 提交完认证之后 可以看到认证

    2023年04月21日
    浏览(11)
  • vue使用科大讯飞的语音识别(语音听写)

    vue使用科大讯飞的语音识别(语音听写)

    使用的是封装好的插件:voice-input-button2 真的很好使很好使 1、先使用npm下载插件 npm i voice-input-button2 -save -dev 2、在main.js中引入 import voiceInputButton from \\\'voice-input-button2\\\' Vue.use(voiceInputButton, { appId: \\\'xxx\\\', // 您申请的语音听写服务应用的ID apiKey: \\\'xxxxxxxxxxxxxxxxxxxxxxxxx\\\', // 您开通的语音

    2024年01月19日
    浏览(19)
  • 科大讯飞语音离线命令识别

    科大讯飞语音离线命令识别

    准备工作 注册讯飞账号,做相关的认证,只有认证通过才能下载部分免费的资源。官网地址:https://console.xfyun.cn/ 创建我的应用后再在离线命令识别 操作前先查看一下这个官方文档Android 语音识别(Recognizer) | 讯飞开放平台文档中心 (xfyun.cn) 1、必要文件包复制到自己的项目目录

    2023年04月08日
    浏览(13)
  • 科大讯飞语音SDK下载及测试

    科大讯飞语音SDK下载及测试

    一、SDK 下载 进入讯飞开发平台官网http://www.xfyun.cn/,右上角进行注册登录,登录后点击进入SDK下载。            2.创建新应用               3.填入相关信息         4.创建完后提交后回到SDK下载页面,刷新页面,应用选择前面创建的应用,平台选择Linux,SDK选择

    2024年02月08日
    浏览(15)
  • vue 利用科大讯飞实现实时语音转写

    1:新建js文件,该文件在科大讯飞api的demo种可以找到 2: 引入第一个文件在vue页面中 3:如果在引入的过程中有些关于worker的报错,可以参考以下方法  在vue.config.js中加入  

    2024年02月12日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包