vad_info.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package vad
  2. import (
  3. "time"
  4. )
  5. type VADInfo struct {
  6. Frame int // 第几帧
  7. Offset int // 音频的偏移
  8. Active bool // 当前帧(时间窗口)是否检测到语音
  9. Time time.Duration // 时间点
  10. }
  11. func NewVADInfo(frame, offset int, active bool, nowTime time.Duration) *VADInfo {
  12. return &VADInfo{
  13. Frame: frame,
  14. Offset: offset,
  15. Active: active,
  16. Time: nowTime,
  17. }
  18. }
  19. // GetTimeRange 获取这个 VAD 实例从 startTime,开始,向后多少 ms 的时间段的 VAD 新实例
  20. func GetTimeRange(inVADInfos []VADInfo, starttime, timeRange int) []VADInfo {
  21. var outVADInfos = make([]VADInfo, 0)
  22. startTime := time.Duration(starttime)
  23. endTime := time.Duration(starttime + timeRange)
  24. for _, inVADInfo := range inVADInfos {
  25. if inVADInfo.Time < startTime || inVADInfo.Time > endTime {
  26. continue
  27. }
  28. outVADInfos = append(outVADInfos, inVADInfo)
  29. }
  30. return outVADInfos
  31. }
  32. // InsertVADInfo 整个函数待定,未必会实现。得到的是 VAD 状态变换的节点,中间缺失了连续的 VAD 点信息,使用本函数可以进行插值
  33. func InsertVADInfo(inVADInfos []VADInfo, duration int) []VADInfo {
  34. var outVADInfos = make([]VADInfo, 0)
  35. // 找到第一句,从这个 StartTime 之前标记为 VAD false
  36. if inVADInfos[0].Time != 0 {
  37. }
  38. return outVADInfos
  39. }
  40. const (
  41. // Mode vad mode,VAD 的模式
  42. Mode = 2
  43. // FrameDuration frame duration,分析的时间窗口
  44. FrameDuration = 10
  45. )