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

我正在使用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  0 && amplitude < 0.2) { // do stuff if the specific tone appeared } } 

但说实话,我使用0.05stimeInterval会遇到大量问题,比如我的iPhone加速超快,这绝对不是我想要的。

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

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

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

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

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

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

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