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

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

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

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

创建完成后进入应用可以看到我们开发需要的三个参数:APPID,APISecret,APIKey


3.因为平台提供的SDK中只支持了简单的中英两种语言语音合成,所以这里我们不会用提供的Java的SDK包。

 

这里是直接使用WebAPI的方式进行整合。到这里你可以直接下载他提供的demo代码,然后把上面我们提到的三个参数换成你自己的就可以完成简单的中文语音的合成了,实际上还是挺简单的。当然后面我也会提供给大家我整合好的demo。

 

4.后续如果大家需要把demo中的jar使用到项目中可以将jar包安装到自己的maven仓库,安装方法的话可以参考这篇博客。

手动安装maven依赖

官方demo
我们主要使用到是WebTTSWS这个类。

1.替换三个参数,以及你需要合成的文本内容。

2.其实已经提示的很明显了,小语种需要和对应的小语种发音人进行配合使用,所以我们还需要在应用中添加对应的小语种发音人。

进入我们的控制台选流式版的语音合成,添加对应的小语种发音人。然后小语种发音人的参数就是我们需要在代码进行配置的。

3.业务参数说明(business),根据需求自行修改。

参数名类型必传描述示例
auestring音频编码,可选值:
raw:未压缩的pcm
lame:mp3 (当aue=lame时需传参sfl=1)
speex-org-wb;7: 标准开源speex(for speex_wideband,即16k)数字代表指定压缩等级(默认等级为8)
speex-org-nb;7: 标准开源speex(for speex_narrowband,即8k)数字代表指定压缩等级(默认等级为8)
speex;7:压缩格式,压缩等级1~10,默认为7(8k讯飞定制speex)
speex-wb;7:压缩格式,压缩等级1~10,默认为7(16k讯飞定制speex)
"raw"
"speex-org-wb;7" 数字代表指定压缩等级(默认等级为8),数字必传
标准开源speex编码以及讯飞定制speex说明请参考音频格式说明
sflint需要配合aue=lame使用,开启流式返回
mp3格式音频
取值:1 开启
1
aufstring音频采样率,可选值:
audio/L16;rate=8000:合成8K 的音频
audio/L16;rate=16000:合成16K 的音频
auf不传值:合成16K 的音频
"audio/L16;rate=16000"
vcnstring发音人,可选值:请到控制台添加试用或购买发音人,添加后即显示发音人参数值"xiaoyan"
speedint语速,可选值:[0-100],默认为5050
volumeint音量,可选值:[0-100],默认为5050
pitchint音高,可选值:[0-100],默认为5050
bgsint合成音频的背景音
0:无背景音(默认值)
1:有背景音
0
ttestring文本编码格式
GB2312
GBK
BIG5
UNICODE(小语种必须使用UNICODE编码,合成的文本需使用utf16小端的编码方式,详见java示例demo)
GB18030
UTF8(小语种)
"UTF8"
regstring设置英文发音方式:
0:自动判断处理,如果不确定将按照英文词语拼写处理(缺省)
1:所有英文按字母发音
2:自动判断处理,如果不确定将按照字母朗读
默认按英文单词发音
"2"
rdnstring合成音频数字发音方式
0:自动判断(默认值)
1:完全数值
2:完全字符串
3:字符串优先
"0"


4.现在可以运行一下demo。运行成功,在对应的路径下就是我们合成的音频文件。如果你运行不了,那么就需要你自己去根据返回的错误代码去官方文档一步一步排查了。

需要使用到的相关pom依赖:

        <!--utils-->
        <dependency>
            <groupId>ws.schild</groupId>
            <artifactId>jave-core</artifactId>
            <version>2.4.4</version>
        </dependency>
        <dependency>
            <groupId>ws.schild</groupId>
            <artifactId>jave-native-osx64</artifactId>
            <version>2.4.6</version>
        </dependency>
        <dependency>
            <groupId>com.googlecode.soundlibs</groupId>
            <artifactId>mp3spi</artifactId>
            <version>1.9.5.4</version>
        </dependency>

格式转换
因为官方demo中合成的是pcm的格式,而一般我们使用的可播放格式是wav和mp3的格式。所以在使用api合成后我们还不能直接播放,所以我们需要在进行格式的转换。

转换工具类:

​
import ws.schild.jave.AudioAttributes;
import ws.schild.jave.Encoder;
import ws.schild.jave.EncodingAttributes;
import ws.schild.jave.MultimediaObject;
 
import java.io.*;
 
/**
 * @Description: 语音合成工具类
 */
public class ConvertUtils {
 
    /**
     * 转换音频文件
     * @param src 需要转换的pcm音频路径
     * @param target 保存转换后wav格式的音频路径
     * @throws Exception
     */
    public static void convertPcm2Wav(String src, String target) throws Exception {
        FileInputStream fis = new FileInputStream(src);
        FileOutputStream fos = new FileOutputStream(target);
 
        //计算长度
        byte[] buf = new byte[1024 * 4];
        int size = fis.read(buf);
        int PCMSize = 0;
        while (size != -1) {
            PCMSize += size;
            size = fis.read(buf);
        }
        fis.close();
 
        //填入参数,比特率等等。这里用的是16位单声道 8000 hz
        WaveHeader header = new WaveHeader();
        //长度字段 = 内容的大小(PCMSize) + 头部字段的大小(不包括前面4字节的标识符RIFF以及fileLength本身的4字节)
        header.fileLength = PCMSize + (44 - 8);
        header.FmtHdrLeth = 16;
        header.BitsPerSample = 16;
        header.Channels = 2;
        header.FormatTag = 0x0001;
        header.SamplesPerSec = 8000;
        header.BlockAlign = (short)(header.Channels * header.BitsPerSample / 8);
        header.AvgBytesPerSec = header.BlockAlign * header.SamplesPerSec;
        header.DataHdrLeth = PCMSize;
 
        byte[] h = header.getHeader();
 
        assert h.length == 44; //WAV标准,头部应该是44字节
        //write header
        fos.write(h, 0, h.length);
        //write data stream
        fis = new FileInputStream(src);
        size = fis.read(buf);
        while (size != -1) {
            fos.write(buf, 0, size);
            size = fis.read(buf);
        }
        fis.close();
        fos.close();
        System.out.println("Convert OK!");
    }
 
 
    /**
     * wav格式转换成mp3格式
     * @param source  源文件
     * @param target 目标文件
     * @return
     */
    public static boolean convertWav2Mp3(File source, File target) {
        boolean succeeded = true;
        try {
            AudioAttributes audio = new AudioAttributes();
            audio.setCodec("libmp3lame");
            audio.setBitRate(128000);
            audio.setChannels(2);
            audio.setSamplingRate(44100);
            audio.setVolume(new Integer(256));
 
            EncodingAttributes attrs = new EncodingAttributes();
            attrs.setFormat("mp3");
            attrs.setAudioAttributes(audio);
            Encoder encoder = new Encoder();
            encoder.encode(new MultimediaObject(source), target, attrs);
        } catch (Exception ex) {
            ex.printStackTrace();
            succeeded = false;
        }
        return succeeded;
    }
 
}

​

​

 pcm文件转换wav需要的header:


 
import java.io.ByteArrayOutputStream;
import java.io.IOException;
 
/**
 * @Description: wav转换mp3的header
 */
public class WaveHeader {
 
    public final char fileID[] = {'R', 'I', 'F', 'F'};
    public int fileLength;
    public char wavTag[] = {'W', 'A', 'V', 'E'};;
    public char FmtHdrID[] = {'f', 'm', 't', ' '};
    public int FmtHdrLeth;
    public short FormatTag;
    public short Channels;
    public int SamplesPerSec;
    public int AvgBytesPerSec;
    public short BlockAlign;
    public short BitsPerSample;
    public char DataHdrID[] = {'d','a','t','a'};
    public int DataHdrLeth;
 
    public byte[] getHeader() throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        WriteChar(bos, fileID);
        WriteInt(bos, fileLength);
        WriteChar(bos, wavTag);
        WriteChar(bos, FmtHdrID);
        WriteInt(bos,FmtHdrLeth);
        WriteShort(bos,FormatTag);
        WriteShort(bos,Channels);
        WriteInt(bos,SamplesPerSec);
        WriteInt(bos,AvgBytesPerSec);
        WriteShort(bos,BlockAlign);
        WriteShort(bos,BitsPerSample);
        WriteChar(bos,DataHdrID);
        WriteInt(bos,DataHdrLeth);
        bos.flush();
        byte[] r = bos.toByteArray();
        bos.close();
        return r;
    }
 
    private void WriteShort(ByteArrayOutputStream bos, int s) throws IOException {
        byte[] mybyte = new byte[2];
        mybyte[1] =(byte)( (s << 16) >> 24 );
        mybyte[0] =(byte)( (s << 24) >> 24 );
        bos.write(mybyte);
    }
 
 
    private void WriteInt(ByteArrayOutputStream bos, int n) throws IOException {
        byte[] buf = new byte[4];
        buf[3] =(byte)( n >> 24 );
        buf[2] =(byte)( (n << 8) >> 24 );
        buf[1] =(byte)( (n << 16) >> 24 );
        buf[0] =(byte)( (n << 24) >> 24 );
        bos.write(buf);
    }
 
    private void WriteChar(ByteArrayOutputStream bos, char[] id) {
        for (int i=0; i<id.length; i++) {
            char c = id[i];
            bos.write(c);
        }
    }
 
}
 

​

​

 本人项目中设置生成的文件为mp3格式

测试类的代码如下:

public static void main(String[] args) throws Exception {
        //这里保存文件必须是mp3结尾
        String mp3Path = XunFei.textConvertMP3("未来一周的天气以多云和阴天为主,温度波动不大,整体呈现出温暖且有些热的气候特征。空气质量多数天数为优,但有少数天出现轻微污染。风力总体较小,多为微风。", "D:/test/xunfei/test.mp3");
        System.out.println("语音合成的音频文件位置: " + mp3Path);
    }

 接口测试类代码如下:

import com.hc.wordToaudio.xunfei.XunFei;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 测试语言合成
 */
@RestController
@RequestMapping("/test")
public class SpeechController {

    /**
     * 开始语言合成
     * text:需要生成的文本
     * path生成的音频存放路径 例如: "D:/test/test.mp3" 在D盘的test文件夹下生成一个test.mp3的文件
     *
     * @return
     */
    @RequestMapping("/start")
    public String Speech(@RequestParam("text") String text
            , @RequestParam("path") String path
    ) {
        String mp3 = null;
        try {
            mp3 = XunFei.textConvertMP3(text, path);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return mp3;
    }
}

    如果想生成pcm格式的音频文件只需要把业务参数里面的值根据说明换成pcm的格式,并且报错的文件后缀改成.pcm就可以了

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

    java调用科大讯飞在线语音合成API --完整代码

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

  • 71
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
科大讯飞提供了基于Java在线语音合成SDK,可以通过调用SDK实现语音合成功能。以下是使用科大讯飞在线语音合成SDK实现语音合成的简单步骤: 1. 注册科大讯飞开发者账号并创建应用,获取AppID和AppSecret。 2. 下载并导入科大讯飞在线语音合成SDK到Java项目中。 3. 在代码中初始化SDK,设置AppID和AppSecret。 4. 调用SDK提供的接口,传入待合成的文本和其他参数,获取语音合成结果。 5. 将语音合成结果保存为音频文件或直接播放。 下面是一个简单示例代码: ```java import com.iflytek.cloud.speech.*; public class TTSExample { public static void main(String[] args) { SpeechUtility.createUtility(SpeechConstant.APPID + "=你的AppID"); SpeechSynthesizer synthesizer = SpeechSynthesizer.createSynthesizer(); synthesizer.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan"); synthesizer.setParameter(SpeechConstant.SPEED, "50"); synthesizer.setParameter(SpeechConstant.VOLUME, "80"); synthesizer.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); String text = "科大讯飞在线语音合成示例"; int code = synthesizer.startSpeaking(text, null); if (code != ErrorCode.SUCCESS) { System.out.println("语音合成失败,错误码:" + code); } } } ``` 请注意,上述代码仅为示例,实际使用中还需根据具体需求进行参数设置和错误处理。另外,还需要在项目中引入相应的科大讯飞在线语音合成SDK库文件。具体使用方式可参考科大讯飞提供的开发文档和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蜜蜂vs码农

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值