我正在使用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: 1.0
)不可能,因为我的应用必须能够尽快检测到特定的声音。 (某些输入声音可能很短[0.5秒或更短]。)如果输入获得特定的频率/幅度,也许AudioKit开发人员添加了一些事件可以被触发。
或许可以将类似Swift观察者的东西添加到AKFrequencyTracker
- 子类中。
我不知道如何继续,并会非常感谢你的帮助。
答案 0 :(得分:3)
您应该让DSP检查您的条件,而不是使用计时器。为此,您必须编辑频率跟踪器或创建自己的副本。好消息是,AudioKit的幅度跟踪器已经做了类似的事情,每当听到一定的音量就调用一个函数,即。达到幅度阈值:
如果以一般方式执行此操作,您甚至可以发出拉取请求并将代码提交回AudioKit。事实上,如果你想这样做,我可以帮助你进一步引导你朝着正确的方向前进。但是,我认为你可以使用幅度跟踪器作为模板。