当前位置:   article > 正文

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

java调用科大讯飞离线语音合成

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

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

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

 

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

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

导入pom依赖

  1. <!-- 科大讯飞依赖-->
  2. <dependency>
  3. <groupId>ws.schild</groupId>
  4. <artifactId>jave-all-deps</artifactId>
  5. <version>3.3.1</version>
  6. </dependency>
  7. <!-- jna依赖-->
  8. <!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
  9. <dependency>
  10. <groupId>net.java.dev.jna</groupId>
  11. <artifactId>jna</artifactId>
  12. <version>5.5.0</version>
  13. </dependency>

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

  

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

 

 

 换成你的appid

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

  1. /**
  2. * 合成音频的header
  3. */
  4. public class WaveHeader {
  5. /**
  6. * @param totalAudioLen 音频数据总大小
  7. * @param sampleRate 采样率
  8. * @param byteRate 位元(组)率(每秒的数据量 单位 字节/秒) 采样率(44100之类的) * 通道数(1,或者2)*每次采样得到的样本位数(16或者8) / 8;
  9. * @param nChannels 声道数量
  10. * @param weikuan 位宽
  11. */
  12. public static byte[] getWavHeader(int totalAudioLen, int sampleRate, int byteRate, int nChannels, int weikuan) {
  13. long totalDataLen = totalAudioLen + 36;
  14. byte[] header = new byte[44];
  15. header[0] = 'R'; // RIFF/WAVE header
  16. header[1] = 'I';
  17. header[2] = 'F';
  18. header[3] = 'F';
  19. header[4] = (byte) (totalDataLen & 0xff);
  20. header[5] = (byte) ((totalDataLen >> 8) & 0xff);
  21. header[6] = (byte) ((totalDataLen >> 16) & 0xff);
  22. header[7] = (byte) ((totalDataLen >> 24) & 0xff);
  23. header[8] = 'W';
  24. header[9] = 'A';
  25. header[10] = 'V';
  26. header[11] = 'E';
  27. header[12] = 'f'; // 'fmt ' chunk
  28. header[13] = 'm';
  29. header[14] = 't';
  30. header[15] = ' ';
  31. header[16] = 16; // 4 bytes: size of 'fmt ' chunk
  32. header[17] = 0;
  33. header[18] = 0;
  34. header[19] = 0;
  35. header[20] = 1; // format = 1
  36. header[21] = 0;
  37. header[22] = (byte) (nChannels & 0xff);
  38. header[23] = (byte) ((nChannels >> 8) & 0xff);
  39. header[24] = (byte) (sampleRate & 0xff);//采样率
  40. header[25] = (byte) ((sampleRate >> 8) & 0xff);
  41. header[26] = (byte) ((sampleRate >> 16) & 0xff);
  42. header[27] = (byte) ((sampleRate >> 24) & 0xff);
  43. header[28] = (byte) (byteRate & 0xff);//取八位
  44. header[29] = (byte) ((byteRate >> 8) & 0xff);
  45. header[30] = (byte) ((byteRate >> 16) & 0xff);
  46. header[31] = (byte) ((byteRate >> 24) & 0xff);
  47. int b = weikuan * nChannels / 8;//每次采样的大小
  48. header[32] = (byte) (b & 0xff); // block align
  49. header[33] = (byte) ((b >> 8) & 0xff);
  50. header[34] = (byte) (weikuan & 0xff);//位宽
  51. header[35] = (byte) ((weikuan >> 8) & 0xff);
  52. header[36] = 'd';//data
  53. header[37] = 'a';
  54. header[38] = 't';
  55. header[39] = 'a';
  56. header[40] = (byte) (totalAudioLen & 0xff);
  57. header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
  58. header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
  59. header[43] = (byte) ((totalAudioLen >> 24) & 0xff);
  60. return header;
  61. }
  62. }

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

转换工具类:

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

测试类的代码如下:

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

接口测试类代码如下:

  1. /**
  2. * 语言合成接口
  3. */
  4. @RestController
  5. @RequestMapping("/test")
  6. public class speechController {
  7. /**
  8. *
  9. * @param text 需要合成语言的文本
  10. * @param path 合成语言的存储路径
  11. * @return 返回合成的音频文件名称
  12. */
  13. @RequestMapping("/start")
  14. public String audioConversion(
  15. @RequestParam("text") String text,
  16. @RequestParam("path") String path
  17. ){
  18. String fileName = XunFeiSpeech.wordSpeech(text, path);
  19. return fileName;
  20. }
  21. }

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/830528
推荐阅读
相关标签
  

闽ICP备14008679号