java实现wav的重采样

ops/2024/9/23 10:17:10/

原因是之前写的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 Hzformat.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;@Autowiredpublic 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

生成文件:


http://www.ppmy.cn/ops/13702.html

相关文章

PyTorch and Stable Diffusion on FreeBSD

Stable Diffusion在图像生成领域具有广泛的应用和显著的优势。它利用深度学习和扩散模型的原理,能够从随机噪声中生成高质量的图像。 官网:GitHub - verm/freebsd-stable-diffusion: Stable Diffusion on FreeBSD with CUDA support FreeBSD下难度主要…

Go语言切片

基本介绍 Go 语言切片是对数组的抽象,是一种长度可变的动态数组。 基本用法 切片声明 声明一个未指定大小的数组来定义切片 var s []int或者使用 make 函数来创建切片 var slice1 []type make([]type, len)// 使用简短声明slice1 : make([]type, len)切片初始化…

NodeRed节点编辑用于边缘计算和规则引擎,能做带UI界面和业务逻辑的上位机或前端应用吗?

网站:hhtp://www.uiotos.net 先说结论,可以,但是需要有页面嵌套继承类似的技术,实现页面模块化封装,否则难以实现复杂应用。 相信目光敏锐的人都在关注节点编辑在自身行业的应用! NodeRed在边缘计算做数据…

聚观早报 | 理想L6正式发布;Meta发布Llama 3

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 4月20日消息 理想L6正式发布 Meta发布Llama 3 比亚迪秦L内饰曝光 小米14 Ultra推送新版澎湃OS OPPO A3 Pro正式…

【2023】springboot通过阿里云oss进行文件单个批量文件上传下载

SpringBoot整合阿里OSS实现上传下载 目录💻 前言一、介绍二、阿里云添加oss1、进入oss目录2、创建bucket3、测试上传下载4、创建AccessKey管理账号 三、依赖以及配置1、依赖2、yml3、Config类4、OSSUtil 工具类 四、controller五、测试1、测试上传2、测试删除 前言 …

【电控笔记5.7】Notch-Filter滤波器

Notch-Filter滤波器 通过阻尼比,限制陡峭程度 阻尼比小,比较陡峭,对周围信号干扰比较小,衰减度小 总结 实现:转换成Z转换进行伯德图验证

Linux:动静态库介绍

动静态库 库的介绍开发环境 & 编译器库存在的意义库的实现库的命名静态库制作和使用总结 动态库的制作和使用动态库的使用方法方法一方法二方法三 库加载问题静态库加载问题动态库的加载问题与位置无关码 C/C静态库下载方式 库的介绍 静态库:程序在编译链接的时…

lock_icon_container LockIconContainer的显示

LockIconContainer 是直接在super_notification_shade.xml 里面的&#xff1a; lock_icon_container <?xml version"1.0" encoding"utf-8"?> <!-- This is the notification shade window. --> <com.android.systemui.statusbar.phone.…