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

5 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)
Run Code Online (Sandbox Code Playgroud)
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
   }
}
Run Code Online (Sandbox Code Playgroud)

但说实话,我在使用0.05s 的 timeInterval 时遇到了很多问题,比如我的 iPhone 升温速度超快,这绝对不是我想要的。

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

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

或者也许可以向子AKFrequencyTracker类添加类似 Swift 观察者之类的东西。

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

Aur*_*zka 3

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

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

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