AudioKit(iOS) - 为频率/幅度变化添加观察者

时间:2018-01-12 14:44:28

标签: ios swift audiokit

我正在使用AudioKit框架开发一个能够监听麦克风输入频率的小型应用程序。我希望每次频率和频率触发一个事件(显然我想触发一个功能)。振幅得到特定值 - > 针对特定语气的事件。

现在我正在为我的应用程序使用这个简单的Swift代码:

mic = AKMicrophone()
tracker = AKFrequencyTracker(mic)
silence = AKBooster(tracker, gain: 1)
AKSettings.audioInputEnabled = true
AudioKit.output = silence
AudioKit.start()

let t = Timer.scheduledTimer( timeInterval: 0.05, target: self, selector: #selector(self.checkFrequencyAmplitude), userInfo: nil, repeats: true)


func checkFrequencyAmplitude() {
   let frequency = tracker.frequency,
       amplitude = tracker.amplitude
   if (frequency > 1000 && frequency < 1200 && amplitude > 0 && amplitude < 0.2) {
      // do stuff if the specific tone appeared
   }
}

但说实话,我使用 timeInterval 0.05s 时遇到了大量问题,就像我的iPhone加速超快&amp;这绝对不是我想要的。

  • 请记住:只使用另一个timeInterval,例如一秒钟 (timeInterval: 1.0)不可能,因为我的应用必须能够尽快检测到特定的声音。 (某些输入声音可能很短[0.5秒或更短]。)

如果输入获得特定的频率/幅度,也许AudioKit开发人员添加了一些事件可以被触发。

或许可以将类似Swift观察者的东西添加到AKFrequencyTracker - 子类中。

我不知道如何继续,并会非常感谢你的帮助。

1 个答案:

答案 0 :(得分:3)

您应该让DSP检查您的条件,而不是使用计时器。为此,您必须编辑频率跟踪器或创建自己的副本。好消息是,AudioKit的幅度跟踪器已经做了类似的事情,每当听到一定的音量就调用一个函数,即。达到幅度阈值:

https://github.com/AudioKit/AudioKit/blob/master/AudioKit/Common/Nodes/Analysis/Amplitude%20Tracker/AKAmplitudeTrackerDSPKernel.hpp#L97

如果以一般方式执行此操作,您甚至可以发出拉取请求并将代码提交回AudioKit。事实上,如果你想这样做,我可以帮助你进一步引导你朝着正确的方向前进。但是,我认为你可以使用幅度跟踪器作为模板。