zoukankan      html  css  js  c++  java
  • 纯java代码对音频采样率进行转换

    转换成16KHz采样率(含文件头)

        void reSamplingAndSave(byte[] data) throws IOException, UnsupportedAudioFileException {
            WaveFileReader reader = new WaveFileReader();
            AudioInputStream audioIn = reader.getAudioInputStream(new ByteArrayInputStream(data));
    
            AudioFormat srcFormat = audioIn.getFormat();
            int targetSampleRate = 16000;
    
            AudioFormat dstFormat = new AudioFormat(srcFormat.getEncoding(),
                    targetSampleRate,
                    srcFormat.getSampleSizeInBits(),
                    srcFormat.getChannels(),
                    srcFormat.getFrameSize(),
                    srcFormat.getFrameRate(),
                    srcFormat.isBigEndian());
    
            AudioInputStream convertedIn = AudioSystem.getAudioInputStream(dstFormat, audioIn);
    
    
            String fileName = System.getenv("TEMP").concat(File.separator).concat(System.currentTimeMillis()+".wav");
            File file= new File(fileName);
            WaveFileWriter writer = new WaveFileWriter();
            writer.write(convertedIn, AudioFileFormat.Type.WAVE, file);
    }

    使用方法:

     byte[] bytes = Files.readAllBytes(Paths.get("e:\asset\nZLWKJjQ.wav"));

    重采样,不保留文件头(通常用于语音识别):

        byte[] reSampling(byte[] data) throws IOException, UnsupportedAudioFileException {
            
            AudioInputStream audioIn = AudioSystem.getAudioInputStream(new ByteArrayInputStream(data));
    
            AudioFormat srcFormat = audioIn.getFormat();
            int targetSampleRate = 16000;
    
            AudioFormat dstFormat = new AudioFormat(srcFormat.getEncoding(),
                    targetSampleRate,
                    srcFormat.getSampleSizeInBits(),
                    srcFormat.getChannels(),
                    srcFormat.getFrameSize(),
                    srcFormat.getFrameRate(),
                    srcFormat.isBigEndian());
    
    
            AudioInputStream convertedIn = AudioSystem.getAudioInputStream(dstFormat, audioIn);
    
            int numReads = -1;
    
            int BUFF_SIZE = targetSampleRate/2;
    
            byte [] buff = new byte[BUFF_SIZE];
    
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            while ((numReads = convertedIn.read(buff)) !=-1)
            {
                System.out.println("读入字节数:"+ numReads);
                outputStream.write(buff);
            }
           return outputStream.toByteArray();
        }

    重采样2(不含文件头):

    public static final int SAMPLE_RATE = 16000;
    
    // 16-bit audio
    private static final int BYTES_PER_SAMPLE = 2;
    // 16-bit audio
    private static final int BITS_PER_SAMPLE = 16;
    private static final double MAX_16_BIT = 32768;
    private static final int SAMPLE_BUFFER_SIZE = 4096;
    
    private static final int MONO   = 1;
    private static final int STEREO = 2;
    private static final boolean LITTLE_ENDIAN = false;
    private static final boolean BIG_ENDIAN    = true;
    private static final boolean SIGNED        = true;
    private static final boolean UNSIGNED      = false;
    private static AudioFormat dstFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
            SAMPLE_RATE,
            BITS_PER_SAMPLE,
            MONO,
            BYTES_PER_SAMPLE,
            8000,
            LITTLE_ENDIAN);
    public static byte[] reSamplingPCM(byte[] data) {
    
        try(AudioInputStream audioIn = AudioSystem.getAudioInputStream(new ByteArrayInputStream(data));
            AudioInputStream convertedStream = AudioSystem.getAudioInputStream(dstFormat, audioIn);
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
    
            if (audioIn.getFormat().matches(dstFormat)) {
                return data;
            }
    
            int numReads = -1;
    
            int BUFF_SIZE = SAMPLE_RATE / 2;
    
            byte[] buff = new byte[BUFF_SIZE];
    
            while ((numReads = convertedStream.read(buff)) != -1) {
                log.info("read {} byte(s)", numReads);
                outputStream.write(buff);
            }
            return outputStream.toByteArray();
        } catch (UnsupportedAudioFileException |IOException e) {
            log.error("occurs errors when re-sampling the audio stream:{}",e);
            throw new RuntimeException("occurs errors when re-sampling the audio stream:{}",e);
        }
    }

    参考来源:

    https://stackoverflow.com/questions/15410725/java-resample-wav-soundfile-without-third-party-library

     https://www.codota.com/web/assistant/code/rs/5c7689a149efcb00014e68b2#L54

  • 相关阅读:
    UltraEdit语法高亮解决办法
    tcpdump命令格式及使用
    VS tricks
    git ready
    [FirefoxPlugin]Print pages to Pdf
    Searching and Navigating Code in VS 2010 (VS 2010 and .NET 4.0 Series)
    How to avoid StepInto unnecessary code area?
    Search and Navigation Tips/Tricks with Visual Studio
    squashing commits with rebase
    【原创】钻石继承与虚继承
  • 原文地址:https://www.cnblogs.com/passedbylove/p/11839773.html
Copyright © 2011-2022 走看看