Audio 从浮动音频值检测静音

Audio 从浮动音频值检测静音,audio,Audio,我以float的形式读取文件的音频数据,得到如下值: -4,151046E+34 -2,365558E+38 6,068741E+26 -4,141856E+34 -2,179363E+38 1,177772E-04 -1,035052E+34 -1,#QNAN 2,668123E-20 -1,0609E+37 -2,153349E+38 1,105884E-16 -4,25223E+37 -1,#QNAN -3,718855E+22 -1,695596E+3

我以float的形式读取文件的音频数据,得到如下值:

-4,151046E+34 
-2,365558E+38 
6,068741E+26 
-4,141856E+34 
-2,179363E+38 
 1,177772E-04 
-1,035052E+34 
-1,#QNAN 
 2,668123E-20 
-1,0609E+37 
-2,153349E+38 
 1,105884E-16 
-4,25223E+37 
-1,#QNAN 
-3,718855E+22 
-1,695596E+38 
我想知道沉默何时开始和结束

这些值是表示与音量直接相关的值,还是0表示屏幕截图中此时的值,我需要查看其中相当多的值来检测静音


沉默是一个与感知相关的概念,它具有时间属性。。。沉默不可能只发生在声音洪亮的瞬间,因为它不会被视为沉默

当音频曲线在一段可感知的时间内处于或与过零点相差不大时,就会发生静音。。。你不能让可听音频后紧跟着沉默,沉默只持续一瞬间,然后是可听音频。。。那不是沉默。。。在安静的房间里,你的耳膜或麦克风膜不会振动。。。当房间的响度从寂静中增加时,这些表面开始摇晃。。。你所展示的情节可以被认为是这种摆动的可视化。。。在画面上,唯一的静默发生在画面开始时的那段平直的时间内

要以编程方式识别何时发生静默,需要两个参数

  • 音频曲线的某个最大高度,低于该高度时,将发生静音
  • 音频曲线保持在该最大高度以下的最短时间长度
您可以尝试猜测这些值。。。现在让我们确定什么时候会发生沉默

package main

import "fmt"

func main() {

    //  somehow your audio_buffer gets populated

    flag_in_candidate_silence := false          //  current sample is quiet
    flag_currently_in_declared_silence := false //  current stretch of samples are in silence period

    total_num_samples := len(audio_buffer) // identify how many samples

    max_vol := 0.1        //  max volume and still a silence candidate
    min_num_samples := 2000 //  minimum number of samples necessary to declare silence has happened
                            //  value used is dependent on sampling rate

    curr_num_samples_found := 0

    index_silence_starts := 0
    index_silence_ends := 0

    for curr_sample := 0; curr_sample < total_num_samples; curr_sample++ {

        curr_amplitude := audio_buffer[curr_sample]

        if curr_amplitude < max_vol { // current sample is candidate for silence

            index_silence_ends = curr_sample

            if flag_in_candidate_silence != true { // previous sample was not a candidate

                index_silence_starts = curr_sample
            }

            if curr_num_samples_found > min_num_samples {

                //  we are inside a period of silence !!!!!!!!!!!

                flag_currently_in_declared_silence = true
            }

            flag_in_candidate_silence = true
            curr_num_samples_found++ //  increment counter of current stretch of silence candidates

        } else {

            if flag_currently_in_declared_silence == true {

                fmt.Println("found silence stretch of samples from ", index_silence_starts, " to ", index_silence_ends)
            }

            flag_in_candidate_silence = false
            flag_currently_in_declared_silence = false
            curr_num_samples_found = 0
        }
    }

    if flag_currently_in_declared_silence == true {

        fmt.Println("found silence stretch of samples from ", index_silence_starts, " to ", index_silence_ends)
    }
}
主程序包
输入“fmt”
func main(){
//不知怎的,你的音频缓冲区被填充了
在\u候选者\u静默中标记\u:=false//当前样本静默
flag_current_in_declared_silence:=false//当前样本段处于静默期
total_num_samples:=len(音频缓冲区)//确定有多少个样本
max_vol:=0.1//max volume仍然是静默候选
min_num_samples:=2000//已发生声明静默所需的最小样本数
//使用的值取决于采样率
找到的当前样本数:=0
索引\u静音\u开始时间:=0
索引\u静音\u结束:=0
对于当前样本:=0;当前样本<总样本数;当前样本++{
当前振幅:=音频缓冲区[当前采样]
如果电流振幅最小数量的样本{
//我们在一段沉默的时间里!!!!!!!!!!!
标志\u当前\u在\u声明的\u沉默=真
}
在候选者沉默中标记为真
curr_num_samples_found++//当前静默候选段的增量计数器
}否则{
如果标志\u当前\u在\u中声明\u沉默==真{
fmt.Println(“发现样本的静音范围从”,索引静音开始,“到”,索引静音结束)
}
在候选者中标记沉默=假
标志\u当前\u在\u中声明\u沉默=假
curr\u num\u samples\u found=0
}
}
如果标志\u当前\u在\u中声明\u沉默==真{
fmt.Println(“发现样本的静音范围从”,索引静音开始,“到”,索引静音结束)
}
}
(代码未测试-直接从前额喷出)