来源:https://github.com/JorenSix/TarsosDSP/blob/master/src/core/be/tarsos/dsp/SilenceDetector.java

/*
*      _______                       _____   _____ _____  
*     |__   __|                     |  __ \ / ____|  __ \ 
*        | | __ _ _ __ ___  ___  ___| |  | | (___ | |__) |
*        | |/ _` | '__/ __|/ _ \/ __| |  | |\___ \|  ___/ 
*        | | (_| | |  \__ \ (_) \__ \ |__| |____) | |     
*        |_|\__,_|_|  |___/\___/|___/_____/|_____/|_|     
*                                                         
* -------------------------------------------------------------
*
* TarsosDSP is developed by Joren Six at IPEM, University Ghent
*  
* -------------------------------------------------------------
*
*  Info: http://0110.be/tag/TarsosDSP
*  Github: https://github.com/JorenSix/TarsosDSP
*  Releases: http://0110.be/releases/TarsosDSP/
*  
*  TarsosDSP includes modified source code by various authors,
*  for credits and info, see README.
* 
*/


package be.tarsos.dsp;


/**
 * The continuing silence detector does not break the audio processing pipeline when silence is detected.
 */
public class SilenceDetector implements AudioProcessor {
    
    public static final double DEFAULT_SILENCE_THRESHOLD = -70.0;//db
    
    private final double threshold;//db
    
    private final boolean breakProcessingQueueOnSilence;
    
    /**
     * Create a new silence detector with a default threshold.
     */
    public SilenceDetector(){
        this(DEFAULT_SILENCE_THRESHOLD,false);
    }
    
    /**
     * Create a new silence detector with a defined threshold.
     * 
     * @param silenceThreshold
     *            The threshold which defines when a buffer is silent (in dB).
     *            Normal values are [-70.0,-30.0] dB SPL.
     * @param breakProcessingQueueOnSilence 
     */
    public SilenceDetector(final double silenceThreshold,boolean breakProcessingQueueOnSilence){
        this.threshold = silenceThreshold;
        this.breakProcessingQueueOnSilence = breakProcessingQueueOnSilence;
    }

    /**
     * Calculates the local (linear) energy of an audio buffer.
     * 
     * @param buffer
     *            The audio buffer.
     * @return The local (linear) energy of an audio buffer.
     */
    private double localEnergy(final float[] buffer) {
        double power = 0.0D;
        for (float element : buffer) {
            power += element * element;
        }
        return power;
    }

    /**
     * Returns the dBSPL for a buffer.
     * 
     * @param buffer
     *            The buffer with audio information.
     * @return The dBSPL level for the buffer.
     */
    private double soundPressureLevel(final float[] buffer) {
        double value = Math.pow(localEnergy(buffer), 0.5);
        value = value / buffer.length;
        return linearToDecibel(value);
    }

    /**
     * Converts a linear to a dB value.
     * 
     * @param value
     *            The value to convert.
     * @return The converted value.
     */
    private double linearToDecibel(final double value) {
        return 20.0 * Math.log10(value);
    }
    
    double currentSPL = 0;
    public double currentSPL(){
        return currentSPL;
    }

    /**
     * Checks if the dBSPL level in the buffer falls below a certain threshold.
     * 
     * @param buffer
     *            The buffer with audio information.
     * @param silenceThreshold
     *            The threshold in dBSPL
     * @return True if the audio information in buffer corresponds with silence,
     *         false otherwise.
     */
    public boolean isSilence(final float[] buffer, final double silenceThreshold) {
        currentSPL = soundPressureLevel(buffer);
        return currentSPL < silenceThreshold;
    }

    public boolean isSilence(final float[] buffer) {
        return isSilence(buffer, threshold);
    }


    @Override
    public boolean process(AudioEvent audioEvent) {
        boolean isSilence = isSilence(audioEvent.getFloatBuffer());
        //break processing chain on silence?
        if(breakProcessingQueueOnSilence){
            //break if silent
            return !isSilence;
        }else{
            //never break the chain
            return true;
        }
    }


    @Override
    public void processingFinished() {
    }
}

 

posted on 2019-11-19 15:48  你不知道的浪漫  阅读(793)  评论(0编辑  收藏  举报