AudioKit (iOS) - 为频率/幅度变化添加观察者
Posted
技术标签:
【中文标题】AudioKit (iOS) - 为频率/幅度变化添加观察者【英文标题】:AudioKit (iOS) - Add observer for frequency / amplitude change 【发布时间】:2018-01-12 14:44:28 【问题描述】:我正在使用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 with 0.05s 时遇到了很多问题,比如我的 iPhone 升温超快,这绝对不是我想要的。
记住:仅使用另一个 timeInterval 例如一秒 (timeInterval: 1.0
) 是不可能的,因为我的应用程序必须能够尽快检测到特定的声音。 (某些输入声音可能很短 [0.5 秒或更短]。)
也许 AudioKit 开发人员添加了一些事件,如果输入获得特定的频率/幅度,则可以触发。
或者也许可以在AKFrequencyTracker
-subclass 中添加类似 Swift 观察者的东西..
我不知道如何继续,非常感谢您的帮助。
【问题讨论】:
【参考方案1】:您应该让 DSP 为您检查您的情况,而不是使用计时器。为此,您必须编辑频率跟踪器或创建自己的副本。好消息是,AudioKit 的幅度跟踪器已经做了类似的事情,只要听到某个音量,即调用一个函数。达到幅度阈值:
https://github.com/AudioKit/AudioKit/blob/master/AudioKit/Common/Nodes/Analysis/Amplitude%20Tracker/AKAmplitudeTrackerDSPKernel.hpp#L97
如果您以一般方式执行此操作,您甚至可以发出拉取请求并将代码提交回 AudioKit。实际上,如果您想这样做,我可以帮助您进一步朝着正确的方向前进。但是,我认为使用幅度跟踪器作为模板可以走得更远。
【讨论】:
感谢您的快速回答 Aurelius。 Tbh我对c ++一无所知,但我相信这不会那么糟糕,因为你的hpp文件看起来没有那么大..但是我也不确定我必须在哪里编辑你的代码,因为我得到了2.framework-files
由我的 Xcode 显示。请看看这张照片,因为我相信你会知道答案:) imgur.com
如果要更改源代码,您需要将 AudioKit 用作包含的 Xcode 项目,而不是作为预构建框架。以上是关于AudioKit (iOS) - 为频率/幅度变化添加观察者的主要内容,如果未能解决你的问题,请参考以下文章
AudioKit - 获取特定频率的问题(高于 20kHz)
AKAmplitudeTracker 幅度使用 audioKit 获得 0.0