• java实现wav的重采样


    原因是之前写的TTS文件,需要指定采样率和单声道

    但是TTS是用的Jacob调用COM+sapi实现的

    java+WNI10+JACOB方式

    SAPI底层支持的是C,C#【官方文档】

    SpAudioFormat SetWaveFormatEx method (SAPI 5.4) | Microsoft Learn

    用C实现的方式【可指定输出的WAV格式】

    【基于微软 SAPI 的 TTS 程序实现_sapi.h配置-CSDN博客】

    懒得看C,直接写个重采样接口好了,参考如下方法

    java实现wav的重采样_java wav采样转换-CSDN博客 

    代码如下:

    1. package com.qf.tdboot02.service;
    2. import org.springframework.stereotype.Service;
    3. import javax.sound.sampled.*;
    4. import java.io.File;
    5. import java.io.IOException;
    6. @Service
    7. public class WavMonoConverter {
    8. public static void main(String[] args) {
    9. File inputFile = new File("path_to_input.wav");
    10. File outputFile = new File("path_to_output.wav");
    11. convertStereoToMono(inputFile, outputFile);
    12. }
    13. public static void convertStereoToMono(File inputFile, File outputFile) {
    14. try {
    15. AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(inputFile);
    16. AudioFormat format = audioInputStream.getFormat();
    17. int channels = format.getChannels();
    18. AudioFormat newFormat = new AudioFormat(
    19. format.getEncoding(),
    20. 8000,// 采样率为8000 Hz
    21. format.getSampleSizeInBits(),// 采样点
    22. 1, // 单声道
    23. format.getFrameSize(), // 帧大小,对于单声道16位PCM,每帧大小是采样率 * 声道数 * 采样点位数/8 = 8000 * 1 * 2 = 16000,但这里通常设置为采样率,因为每帧通常包含一个采样点
    24. 8000, // 帧率,通常与采样率相同
    25. format.isBigEndian() // 使用小端字节序,这是Java音频系统通常使用的
    26. );
    27. // 转换音频流为单声道
    28. AudioInputStream monoAudioInputStream = AudioSystem.getAudioInputStream(newFormat, audioInputStream);
    29. // 写入新的WAV文件
    30. AudioSystem.write(monoAudioInputStream, AudioFileFormat.Type.WAVE, outputFile);
    31. // 关闭流
    32. monoAudioInputStream.close();
    33. audioInputStream.close();
    34. } catch (UnsupportedAudioFileException | IOException e) {
    35. e.printStackTrace();
    36. }
    37. }
    38. }
    1. package com.qf.tdboot02.controller;
    2. import com.qf.tdboot02.constant.WavConstant;
    3. import com.qf.tdboot02.service.WavMonoConverter;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.stereotype.Component;
    6. import org.springframework.web.bind.annotation.GetMapping;
    7. import org.springframework.web.bind.annotation.RequestMapping;
    8. import java.io.File;
    9. /**
    10. * @author: 作者
    11. * @create: 2024-04-17 10:03
    12. * @Description:
    13. */
    14. @Component
    15. @RequestMapping("/wav")
    16. public class WavConvertController {
    17. private final WavMonoConverter wavMonoConverter;
    18. @Autowired
    19. public WavConvertController(WavMonoConverter wavMonoConverter) {
    20. this.wavMonoConverter = wavMonoConverter;
    21. }
    22. @GetMapping("/convert")
    23. public void convert(String in,String out) {
    24. File inputFile = new File(in);
    25. File outputFile = new File(out);
    26. wavMonoConverter.convertStereoToMono(inputFile, outputFile);
    27. }
    28. }

    接口调用:

    http://localhost:8090/wav/convert?in=D://in.wav&out=D://out.wav

    生成文件:

  • 相关阅读:
    HFSS笔记——边界条件和激励
    自动化测试执行过程和报告内容分析
    Vim基本使用操作
    【笔记】知行合一王阳明:1472~1529
    支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal
    IO-DAY1
    linux内存页回收
    字典树、AC自动机、后缀数组
    STM32_3(GPIO)
    python 编写的iis日志分析小工具
  • 原文地址:https://blog.csdn.net/qq_40421671/article/details/137863132