GetVADInfoFromAudio 分析音频文件,得到 VAD 分析信息,看样子是不支持并发的,只能单线程使用 无需使用插值的函数
(audioInfo AudioInfo, insert bool)
| 13 | // GetVADInfoFromAudio 分析音频文件,得到 VAD 分析信息,看样子是不支持并发的,只能单线程使用 |
| 14 | // 无需使用插值的函数 |
| 15 | func GetVADInfoFromAudio(audioInfo AudioInfo, insert bool) ([]VADInfo, error) { |
| 16 | |
| 17 | var ( |
| 18 | frameIndex = 0 |
| 19 | frameSize = audioInfo.SampleRate / 1000 * FrameDuration |
| 20 | frameBuffer = make([]byte, audioInfo.SampleRate/1000*FrameDuration*audioInfo.BitDepth/8) |
| 21 | frameActive = false |
| 22 | vadInfos = make([]VADInfo, 0) |
| 23 | ) |
| 24 | |
| 25 | audioFile, err := os.Open(audioInfo.FileFullPath) |
| 26 | if err != nil { |
| 27 | return nil, err |
| 28 | } |
| 29 | defer audioFile.Close() |
| 30 | |
| 31 | reader := bufio.NewReader(audioFile) |
| 32 | |
| 33 | vadInst := webRTCVAD.Create() |
| 34 | defer webRTCVAD.Free(vadInst) |
| 35 | |
| 36 | err = webRTCVAD.Init(vadInst) |
| 37 | if err != nil { |
| 38 | return nil, err |
| 39 | } |
| 40 | |
| 41 | if err != nil { |
| 42 | return nil, err |
| 43 | } |
| 44 | err = webRTCVAD.SetMode(vadInst, Mode) |
| 45 | if err != nil { |
| 46 | return nil, err |
| 47 | } |
| 48 | |
| 49 | if ok := webRTCVAD.ValidRateAndFrameLength(audioInfo.SampleRate, frameSize); !ok { |
| 50 | return nil, errors.New(fmt.Sprintf("invalid rate or frame length, %v", audioInfo.FileFullPath)) |
| 51 | } |
| 52 | var offset int |
| 53 | |
| 54 | report := func() { |
| 55 | t := time.Duration(offset) * time.Second / time.Duration(audioInfo.SampleRate) / 2 |
| 56 | //log.Printf("Frame: %v, offset: %v, Active: %v, t = %v", frameIndex, offset, frameActive, t) |
| 57 | vadInfos = append(vadInfos, *NewVADInfo( |
| 58 | frameIndex, |
| 59 | offset, |
| 60 | frameActive, |
| 61 | t, |
| 62 | )) |
| 63 | } |
| 64 | |
| 65 | for { |
| 66 | _, err = io.ReadFull(reader, frameBuffer) |
| 67 | if err == io.EOF || err == io.ErrUnexpectedEOF { |
| 68 | break |
| 69 | } |
| 70 | tmpFrameActive, err := webRTCVAD.Process(vadInst, audioInfo.SampleRate, frameBuffer, frameSize) |
| 71 | if err != nil { |
| 72 | return nil, err |