Audio 从浮动音频值检测静音
我以float的形式读取文件的音频数据,得到如下值: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
-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(“发现样本的静音范围从”,索引静音开始,“到”,索引静音结束)
}
}
(代码未测试-直接从前额喷出)