diff --git a/vetti-admin/src/main/java/com/vetti/socket/ChatWebSocketHandler.java b/vetti-admin/src/main/java/com/vetti/socket/ChatWebSocketHandler.java index 2f05940..ecb57ca 100644 --- a/vetti-admin/src/main/java/com/vetti/socket/ChatWebSocketHandler.java +++ b/vetti-admin/src/main/java/com/vetti/socket/ChatWebSocketHandler.java @@ -146,7 +146,9 @@ public class ChatWebSocketHandler { try { File inputFile = new File(resultPathUrl); File outputFile = new File(resultPathUrl); - trimSilence(inputFile, outputFile); + // 设置去除尾部的秒数 + float removeSeconds = 0.25f; // 去除最后5秒 + trimEndByTime(inputFile, outputFile, removeSeconds); //文件转换成文件流 ByteBuffer outByteBuffer = convertFileToByteBuffer(resultPathUrl); //发送文件流数据 @@ -408,30 +410,37 @@ public class ChatWebSocketHandler { } - // 截取音频流,去除静音部分 - public void trimSilence(File inputFile, File outputFile) { + // 裁剪音频文件,去除最后多少秒 + public void trimEndByTime(File inputFile, File outputFile, float removeSeconds) { try { - // 获取音频流 + // 获取音频输入流 AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(inputFile); AudioFormat format = audioInputStream.getFormat(); - // 将音频流转为字节数组 - byte[] audioBytes = audioInputStream.readAllBytes(); + // 获取音频文件的总帧数 + long totalFrames = audioInputStream.getFrameLength(); - // 去除前后静音部分 - int start = findNonSilenceStart(audioBytes, format); - int end = findNonSilenceEnd(audioBytes, format); + // 计算音频文件的总时长(秒) + float totalDuration = totalFrames / format.getSampleRate(); - // 截取音频流 - byte[] trimmedAudio = new byte[end - start]; - System.arraycopy(audioBytes, start, trimmedAudio, 0, trimmedAudio.length); + // 计算新的结束位置(去除指定的时间后) + long newEndFrame = (long) ((totalDuration - removeSeconds) * format.getSampleRate()); - // 创建新的音频输入流 - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(trimmedAudio); - AudioInputStream trimmedAudioStream = new AudioInputStream(byteArrayInputStream, format, trimmedAudio.length / format.getFrameSize()); + // 确保裁剪的结束帧在合理范围内 + if (newEndFrame < 0) { + System.out.println("去除的时间超过了音频的总时长"); + return; + } - // 保存裁剪后的音频文件 - AudioSystem.write(trimmedAudioStream, AudioFileFormat.Type.WAVE, outputFile); + // 创建一个新的输入流,裁剪音频数据 + AudioInputStream trimmedStream = new AudioInputStream( + audioInputStream, + format, + newEndFrame + ); + + // 创建新的文件并保存裁剪后的音频 + AudioSystem.write(trimmedStream, AudioFileFormat.Type.WAVE, outputFile); System.out.println("裁剪后的音频已保存到: " + outputFile.getAbsolutePath()); audioInputStream.close(); @@ -440,27 +449,5 @@ public class ChatWebSocketHandler { } } - // 找到音频流中非静音部分的开始位置 - private int findNonSilenceStart(byte[] audioBytes, AudioFormat format) { - int threshold = 10; // 假设小于这个值的幅度为静音 - for (int i = 0; i < audioBytes.length; i++) { - if (Math.abs(audioBytes[i]) > threshold) { - return i; - } - } - return 0; // 如果音频全是静音,返回 0 - } - - // 找到音频流中非静音部分的结束位置 - private int findNonSilenceEnd(byte[] audioBytes, AudioFormat format) { - int threshold = 10; // 假设小于这个值的幅度为静音 - for (int i = audioBytes.length - 1; i >= 0; i--) { - if (Math.abs(audioBytes[i]) > threshold) { - return i + 1; - } - } - return audioBytes.length; // 如果音频全是静音,返回音频的最后位置 - } - }