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博客

代码如下:

java 复制代码
package com.qf.tdboot02.service;

import org.springframework.stereotype.Service;

import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
@Service
public class WavMonoConverter {
    public static void main(String[] args) {
        File inputFile = new File("path_to_input.wav");
        File outputFile = new File("path_to_output.wav");
        convertStereoToMono(inputFile, outputFile);
    }

    public static void convertStereoToMono(File inputFile, File outputFile) {
        try {
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(inputFile);
            AudioFormat format = audioInputStream.getFormat();
            int channels = format.getChannels();

            AudioFormat newFormat = new AudioFormat(
                    format.getEncoding(),
                    8000,// 采样率为8000 Hz
                    format.getSampleSizeInBits(),// 采样点
                    1, // 单声道
                    format.getFrameSize(), // 帧大小,对于单声道16位PCM,每帧大小是采样率 * 声道数 * 采样点位数/8 = 8000 * 1 * 2 = 16000,但这里通常设置为采样率,因为每帧通常包含一个采样点
                    8000, // 帧率,通常与采样率相同
                    format.isBigEndian() // 使用小端字节序,这是Java音频系统通常使用的
            );


            // 转换音频流为单声道
            AudioInputStream monoAudioInputStream = AudioSystem.getAudioInputStream(newFormat, audioInputStream);

            // 写入新的WAV文件
            AudioSystem.write(monoAudioInputStream, AudioFileFormat.Type.WAVE, outputFile);

            // 关闭流
            monoAudioInputStream.close();
            audioInputStream.close();
        } catch (UnsupportedAudioFileException | IOException e) {
            e.printStackTrace();
        }
    }
}
java 复制代码
package com.qf.tdboot02.controller;

import com.qf.tdboot02.constant.WavConstant;
import com.qf.tdboot02.service.WavMonoConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.File;

/**
 * @author: 作者
 * @create: 2024-04-17 10:03
 * @Description:
 */
@Component
@RequestMapping("/wav")
public class WavConvertController {

    private final WavMonoConverter wavMonoConverter;

    @Autowired
    public WavConvertController(WavMonoConverter wavMonoConverter) {
        this.wavMonoConverter = wavMonoConverter;
    }

    @GetMapping("/convert")
    public void convert(String in,String out) {
        File inputFile = new File(in);
        File outputFile = new File(out);
        wavMonoConverter.convertStereoToMono(inputFile, outputFile);
    }

}

接口调用:

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

生成文件:

相关推荐
buhuizhiyuci14 分钟前
【QT-百日筑基篇】修真世界摸爬滚打多年,终于黄天不负有心人,突破炼器中期——常用控件QWight的属性
开发语言·c++·qt·gui·图形化
m0_5873830030 分钟前
社区家政系统开发实战:从需求分析到上线部署全指南
java·spring boot·spring·需求分析
凤山老林34 分钟前
动态 i18n 体系落地:Spring Boot 多租户热加载与前后端协同实践
java·spring boot·后端·i18n
白露与泡影1 小时前
解密 Pi 的 Harness 工程:Agent 会话如何实现持久化与恢复
java·人工智能·算法
Littlehero_1212 小时前
QT自定义控件之热换站系统(源码开源)
开发语言·qt
meilindehuzi_a2 小时前
Python 基础语法(1):常量、变量、类型、输入输出与运算符
开发语言·python
caimouse2 小时前
ReactOS 窗口系统分析(5):可见区域与窗口 DC — vis.c + windc.c
c语言·开发语言
OPEN-F2 小时前
Python进阶教程:装饰器与生成器深入
开发语言·python
Zane19942 小时前
HashMap 为什么要在长度16、容量必须是2的幂这些细节上较劲
java·后端
长谷深风1112 小时前
为什么你的 Tool 总被模型选错?
java·大数据·ai·llm·ai agent·工具设计·agent设计