原因是之前写的TTS文件,需要指定采样率和单声道
但是TTS是用的Jacob调用COM+sapi实现的
SAPI底层支持的是C,C#【官方文档】
SpAudioFormat SetWaveFormatEx method (SAPI 5.4) | Microsoft Learn
用C实现的方式【可指定输出的WAV格式】
【基于微软 SAPI 的 TTS 程序实现_sapi.h配置-CSDN博客】
懒得看C,直接写个重采样接口好了,参考如下方法
java实现wav的重采样_java wav采样转换-CSDN博客
代码如下:
- 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();
- }
- }
- }
- 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
生成文件: